俺の雑記帳

My random memorandumです。(つまり、個人的な備忘録であり、その点ご容赦を。)

Oracle:複合トリガー(&「ネストした表」)

行トリガーで、トリガー対象のテーブル自身を参照したい。(今回は、ビューを通して参照する)

通常は、
 「ORA-04091: 表CESNETUSER.ITEM_CAT_LV1は変更しています。」
というようなエラーが出てしまう。

複合トリガーを使う。
行トリガーの結果を変数に残し、
それを 自己参照・更新が OKな、文トリガーで使う。
(パッケージを使えば 複合トリガーが無くても 同様のことが出来る?。できてもプログラミングや保守が大変だが。)


複合トリガー(Compound Trigger)の構文を分かり易く書いたページです。
http://www.istudy.ne.jp/training/serial/plsql/067.html


私がやりたかったことと同じことをしている人のブログです。サンプルコードがあります。
http://mutatsu.blog.fc2.com/blog-entry-18.html
ただし、このサンプルコードは、複数行UPDATEに対応していません。


複数行Updateに対応するために、PL/SQL内で配列を使いました。
ちなみに、PL/SQLにおける配列も、私の古いテキストに記載が無い 少し新しい方法を使っています。
http://www.shift-the-oracle.com/plsql/collection/
今回使ったのは「ネストした表(Nested Table)」。
テキストにあるのは、「索引付き表(結合配列)」のみ。
上記2者は、「PL/SQL表(PL/SQL Table?だっけ?)」とも呼ばれる。

ほかにも、「VARRAY (可変長配列 : Variable ARRAY ?) 」というのがある。Nested Table に似ているが、定義時の配列の大きさを拡張できない点、添え字の不連続が許可されない点。後者の点は、今回の用途では利点あったが、前者の欠点がより大きかった。