行トリガーで、トリガー対象のテーブル自身を参照したい。(今回は、ビューを通して参照する)
通常は、
「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 に似ているが、定義時の配列の大きさを拡張できない点、添え字の不連続が許可されない点。後者の点は、今回の用途では利点あったが、前者の欠点がより大きかった。