2009-01-01から1年間の記事一覧

BYPASS_UJVC

仕事でselectupdateをすることがあって、 副問い合わせに対してUPDATE出来たら楽だなと思ってたら ORA-01779が出てしまったので調べてたらhttp://emboss.blog28.fc2.com/blog-entry-13.htmlみたいにヒント句で回避できるらしい ってことで出来ることはわかっ…

自律型トランザクションのサンプル(AUTONOMOUS_TRANSACTION)

PL/SQLでログを取りたい場合とかに実プログラムのトランザクションとは別で ログ用のトランザクションを作成したいときとか結構あると思います。 そんなときはAUTONOMOUS_TRANSACTIONを使うと自律型トランザクションを実装出来ます。 サンプルを書きました。…

スキーマ(ユーザ)同士の定義比較

開発と本番でスキーマが分かれていてテーブル定義に差異が出てしまうことって時たまあるとおもいます。 で、その差異を洗うにはこんな感じの一発で差異がとれたりします。たとえば current_schema history_schema っていう2つのスキーマがあってcurrent_sche…

最大値のレコードを取得する方法 その2

以前 http://d.hatena.ne.jp/niwanos/20090501/1241195931 みたいに最大値のレコード取得の方法を書いてましたが Oracleのマニュアルにこれよりもスマートな方法が書いてあったのでちょっと紹介します。前回は SELECT LOG.* FROM LOG_TABLE LOG WHERE LOG.ID…

LAG関数、LEAD関数

OracleにはLAG、LEAD関数というものがあります。 何ができるかというと、、、 ソートしたレコードの前or後のデータを参照できます。なにに使うんだろうとちょっと考えてみたんですが、 前月差などを取るときに使えそうです。 こんな感じ テーブル定義 CREATE…

最大値のレコードを取得する方法

自分はこの方法しか知らないので知ってる人は是非教えてほしいところですが。1テーブル内で、履歴的な管理をしているときに たとえば↓みたいなテーブルがあって CREATE TABLE LOG_TABLE ( ID NUMBER ,LOG_ID NUMBER ,NAME VARCHAR2(20) ,REGISTER_DATE TIMES…

shrink space

大量のDELETEを走らせたのに表領域が解放されない場合は ALTER TABLE テーブル名 SHRINK SPACE; で10gからは postgresのバキューム的なことが出来ます。 ただしテーブルの行が移動してもよいということをテーブル単位で指定しないとエラーが発生します。 ALT…

ユーザのオブジェクトをすべて削除したいとき

Oracleの場合はユーザのオブジェクトを一気にすべて簡単に消す何かはありませんので 自分でpl/sqlでも書いて消す必要がありますやりかたとしては SELECT OBJECT_NAME,OBJECT_TYPE FROM USER_OBJECTSでユーザが持ってるオブジェクトを選択してDBMS_SQLとかつ…

クラスタ索引を使ってみた

クラスタ索引とは、簡単に言うと頻繁に結合するテーブル同士の結合条件Columnを一カ所に集中させて ディスクのランダムアクセスを減らそう(シーケンシャルアクセスにする)っていうものかな 詳細は下記へ http://otndnld.oracle.co.jp/document/products/or…

外部表を触ってみた(ORGANIZATION EXTERNAL)

http://www.oracle.co.jp/iSeminars/071120_1600/doc/DataLoading_071120.pdf この辺に触発されて ・外部表 ・テーブル圧縮(COMPRESS) の2つを試して見たくなった。 COMPRESSについてはEEでのみ使える機能とのことなので会社の開発環境にて試そうと思うが …

Oracleの制約について

Oracleには下記の4制約(CONSTRAINT)があります。 NOT NULL制約 一意制約 主キー制約 外部制約 チェック制約まずNOT NULL制約は 「表の列値がNULLでないということが求められます。」 とのことなのでCreateUpdateで制約がかかりますが、INDEX(OBJECT)が生…

Order By でさっき知ったこと

NULLS FIRST | NULLS LAST NULL値を含む戻された行が順序の最初にくるか、最後にくるかを指定します。NULLS LASTは昇順のデフォルトで、NULLS FIRSTは降順のデフォルトです。SQLリファレンスよりつまり SELECT * FROM M_USER ORDER BY NAME NULLS FIRST とか…

Oracleでのページングについて

ページングについて適当に考えてみたたとえば M_USERテーブルがあって列には ID ,NAME ,REG_DATE の3カラムあったとして、NAMEで降順、IDで昇順ソートして11〜20件を取得する場合一般的には SELECT NUM_USER.ID ,NUM_USER.NAME ,NUM_USER.REG_DATE ,NUM_…

DBMS_STATS.GATHER_TABLE_STATSのestimate_parcent

統計情報を手動で取りたくてDBMS_STATSパッケージをいじっていたのですが estimate_parcent(サンプリングするパーセンテージ)が デフォルトでNULLになっていたので、NULLだと何パーセントになるのかなー ってマニュアル漁ってたら 「NULLは計算を意味しま…

CASE文のSQLでの使い方

ORACLEのCASE文はかなり便利でいろいろな要件で結構使ったりしますが、 本当に色々できます。たとえば ・SELECT ・FROM ・WHERE ・GROUP BY ・HAVING ・ORDER BY などがあります。 こんなテーブルがあったとして TEST_USER ID NUMBER NAME VARCHAR2 AGE NUMB…

OracleでAutoIncrement

MySQLのようにautoincrementをOracleで使いたいことが多々ありますが Oracleにはautoincrementに相当する機能はありません。Oracleで同等のことをしたいときはDMLTriggerを駆使します。 たとえばこんなテーブルと CREATE TABLE TEST_USER ( ID NUMBER NOT NU…