SQL*PlusとPL/SQLは何年にもわたって対立してきました。SQL*Plusを使用してタスクを実行する方法が、PL/SQLで同じまたは類似のタスクを完了する方法と異なる場合がたくさんあります。さらに、SQL*Plusでは使用できなかったPL/SQLで使用可能なデータ型があります。 Oracleバージョン21cは、SQL*Plusタイプ定義でPL/SQLデータ型の一部を使用する方法を提供しますが、PL/SQLタイプは永続的ではないという警告があります。これはどういう意味で、この新しく発見された種類の財宝法をどのように使用するのでしょうか。さらに調査して、何が見つかるか見てみましょう。
しばらくの間、PL/SQLとSQL*Plusの両方で特定の型を作成するには、構文の変更が必要でした。PL?SQLの2つの要素を持つ型はレコードであり、SQL*Plusの同じ型構造がオブジェクト型になります。これは、開発者が慣れ親しんできたことです。ただし、これらの型にPL / SQL型(boolean、pls_integer、binary_integerなど)を含める必要がある場合、残念ながらSQL*Plusにはその要件を満たす簡単な方法がありませんでした。 21cまで。このようなタイプをSQL*Plusタイプ定義で使用する方法の例を見てみましょう。たとえば、引数として、SQL*PlusのBOOLEANデータ型で型が必要であるとします。 21cより前では、BOOLEANデータ型を模倣するために多くのコーディングを行う必要があります。21cでは、データベースがデータをディスクに保持しようとしない限り、型としてBOOLEANを使用できます。
SQL> create or replace 2 type EMP_SAL_APPROVAL_FOR_PL as object 3 ( e_num number, 4 e_nme varchar2(35), 5 new_sal number, 6 mgr_approve boolean 7 ) not persistable ; 8 / Type created.
このようなオブジェクトは、実行時にBOOLEAN値を使用してPL / SQLプログラム・ユニットに渡すことができ、Oracleは、BOOLEAN値が現在のコンテキスト外で永続化されないことを認識しています。前に述べたように、これはBOOLEAN値に制限されません。 PLS_INTEGERとBINARY_INTEGERの両方を試してみましょう:
SQL> create or replace 2 type EMP_SAL_APPROVAL_FOR_PL as object 3 ( e_num number, 4 e_nme varchar2(35), 5 new_sal number, 6 mgr_approve boolean, 6 old_sal pls_integer, 7 yrly_sal binary_integer 8 ) not persistable ; 9 / Type created.
SQL * Plusで永続化できないデータ型は、実行時にPL / SQLユニットに渡すことができますが、「永続化できない」命令が原因ではありません。
これがネストされたテーブルやVARRAYでも使用できるかどうか疑問に思っている場合、答えは「はい」です。
SQL> create or replace 2 type i_array as 3 varray(40) of (binary_integer) 4 not persistable; 5 / Type created.
残念ながら、これでは、「永続化不可」ディレクティブを使用するタイプで%TYPE参照(PL / SQLコーディングでよく使用され、よく使用されるショートカット)を使用できません。
SQL> create or replace 2 type EMP_SAL_APPROVAL_FOR_PL as object 3 ( e_num emp.empno%type, 4 e_nme varchar2(35), 5 new_sal number, 6 mgr_approve boolean, 6 old_sal pls_integer, 7 yrly_sal binary_integer 8 ) not persistable ; 9 / Warning: Type created with compilation errors. SQL> SQL> show errors Errors for TYPE EMP_SAL_APPROVAL_FOR_PL LINE/COL ERROR -------- ----------------------------------------------------- 0/0 PL/SQL: Compilation unit analysis terminated 3/12 PLS-00201: identifier 'EMP.EMPNO' must be declared
Oracleは、「永続化不可能」ディレクティブで重要な一歩を踏み出し、プログラマがSQL*Plusタイプ定義でPL/SQLデータ型を利用できるようにしました。このような構成によって表されるデータがデータベースに格納されないことを知っていると、これはおそらく使用が制限されるか魅力的ですが、BOOLEAN、PL:S_INTEGER、またはBINARY_INTEGERの値をSQL*PlusからPL/SQLプログラム単位に渡す場合はSQL*Plusにそのような型がないことによって引き起こされる型の不一致の問題を排除します。そして、これはおそらくSQL*PlusのPL/SQLとの機能互換性を拡張するための最初のステップです。