PL/SQL NEXTVAL DUAL表


dualテーブルは仮想テーブルです.sequence、sysdateなど、ほとんどのOracleオブジェクトを操作するときに使用できます.例えば、select sysdate from dual select seq 1.nextval from dual
----------------------------------------------------------------------------------------------------------------------
DUALテーブルは奇抜な小さな構造です.このテーブルはSYSモードに存在し、PL/SQL開発者は、PL/SQL自身が提供していないSQL固有の機能にアクセスするために使用します.
DUALテーブルの最も一般的な応用は、1つのシーケンスの次の数値を生成して取得することであり、通常は1つのテーブルに使用されるプライマリキーであり、以下に示す.
 
SELECT employee_seq.NEXTVAL
   INTO :employee.employee_id
   FROM DUAL;

 
Oracleでは、PL/SQLコードでemployeeを直接参照することはできません.seq.NEXTVAL;SELECT文から呼び出さなければなりません.なぜ私たちはこの操作のためにDUALテーブルを使用するのですか?唯一の行(または1行のみ)しかないからです.NEXTVALオペレータは、シーケンスから次の(一意の)値を返します.残念なことに、私たちのシンポジウムに参加した人々がこのDUAL表が一行に満たないと言っているのをよく耳にします.この場合、私の以前のクエリにTOO_が表示されます.MANY_ROWSエラーで失敗しました.さらに悪いことに、USERなどのPL/SQLに組み込まれている関数の一部は、Oracleデータから提供されるstdbodyに失敗する可能性があります.sqlファイルから取り出したこのコードには、次の点がわかります.
FUNCTION USER
    RETURN VARCHAR2
  IS
    c VARCHAR2 (255);
  BEGIN
     SELECT USER
     INTO c
     FROM SYS.DUAL;
 
    RETURN c;
 END;

 
(a)DUALテーブルに依存してシーケンス値と(b)DUALテーブルの行数が1行を超えないことを保証できない場合は、自己管理型のコードベースを持つことは困難です.もちろん、DUALテーブルのトリガを定義して、DUALテーブルに1行以上のデータを挿入する試みを防止することができます.ただし、SYSが所有するテーブルのユーザ定義トリガを作成することはタブーです.では、開発者がDUALテーブルの使用を避けたい場合は、どうすればいいのでしょうか.独自の単行テーブルを作成して使用し、DUALと同じ構造にします.
コードリスト5は、このようなテーブルを作成するコードと、テーブルに1行のデータしか含まれないことを保証するトリガを定義する.
onerowを定義すると、次のように次のプライマリキー値を取得できます.
SELECT employee_seq.NEXTVAL
  INTO :employee.employee_id
  FROM onerow;

 
私はonerowのコンテンツをより多く制御しているので、DUALからクエリーを行うよりも良い解決策です.しかし、それはまだ理想的ではありません.Oracleデータベースの将来のバージョンでは、PL/SQLで直接を参照できます.NEXTVAL、ではどうなるのでしょうか?私はこれらの現在の古いコードをすべて使用し続けます.これらのコードの代わりに、より簡単な(より効果的な)コードを使用したいかもしれません.
 
:employee.employee_id := employee_seq.NEXTVAL;

そこで、アプリケーションが破壊されず、時間が経つにつれて更新されやすい最後のステップとして、コードリスト6に示すように、クエリを「一般」関数に隠した後、この関数は独自の動的SQLを使用して任意のシーケンスの次の値を一般的に取得します.
次のコードだけでプライマリ・キー値を取得できます.
:employee.employee_id := next_pky ('employee_seq');

 
また、OracleデータベースがNEXTVALの参照に関する制限を解除した後、この関数で実装を変更できます.再コンパイル後、すべてのコードを更新してOracleデータベースの最新機能を使用できます.この手順では、100%の自己管理は行われませんが、アプリケーション・ベースを最小限の管理状態にするのに役立ちます.
独自のダイナミックSQLを使用して、これらのすべてのステップを単一のプロセスに組み合わせることもできます.これにより、DUALテーブルの置換操作がモードで設定されます.