1 『Oracle Database PL/SQL言語リファレンス』のこのリリースの変更点

1.1 Oracle Database PL/SQL言語リファレンスのリリース23cの新機能

Oracle Databaseリリース23cのPL/SQL言語リファレンスでは、次の新機能および拡張機能について説明しています。

関連項目:

Oracle Databaseリリース23cの新機能すべての詳細は、『Oracle Databaseの新機能』を参照してください

1.1.1 SQL BOOLEANデータ型

このリリースより前のPL/SQLではBOOLEANのサポートがすでに提供されていますが、BOOLEANデータ型もSQLでサポートされるようになりました。このサポートの拡張により、PL/SQLとSQLの互換性が向上します。

BOOLEANパラメータ・タイプのPL/SQLストアド・ファンクションは、SQLから直接起動できるようになりました。BOOLEAN引数を持つPL/SQLファンクションはSQLからすでにコール可能でしたが(BOOLEAN型のバインドの引数を使用して)、BOOLEAN式およびBOOLEANリテラルもサポートされるようになりました。さらに、BOOLEAN型の値を予期するホスト・バインドを伴うPL/SQLストアド・プロシージャおよび無名PL/SQLブロックはOCIおよび動的SQLやDBMS_SQLなどのその他のインタフェースを介してCから起動できます。また、BOOLEAN型の仮パラメータを使用してCで信頼されるまたはCに対応したコールアウトをコールすることも可能です。

PL/SQLブロック内部のSELECT文におけるINTOおよびBULK COLLECT INTO句でのBOOLEANの定義はサポートされています。

BOOLEANと数値型と文字型の間の暗黙的な変換がサポートされています。数値および文字変数および式をBOOLEAN変数に割り当てることができます。関数to_booleanは、数値型および文字型からBOOLEANデータ型への変換にも追加されています。ファンクションto_numberto_charおよびto_ncharで、BOOLEANを数値や文字型に変換するためのBOOLEANのオーバーロードを使用できるようになりました。CAST演算子を使用して式をBOOLEAN型にキャストすることもできます。

暗黙的な変換のサポートを有効にするには、初期化パラメータPLSQL_IMPLICIT_CONVERSION_BOOLTRUEに設定する必要があります。CASTto_charのような明示的な変換はパラメータに依存しないため、PLSQL_IMPLICIT_CONVERSION_BOOLTRUEFALSEのどちらに設定されているかに関係なく動作します。PLSQL_IMPLICIT_CONVERSION_BOOLの使用方法の詳細は、『Oracle Databaseリファレンス』を参照してください。

PL/SQLのすべてのDML操作は、配列INバインドおよび配列OUTバインドを含む、INバインドとOUTバインドの両方でBOOLEAN変数を取得します。DMLトリガーは、WHEN句のBOOLEANバインド(INバインドとOUTバインドの両方)およびBOOLEAN列参照をサポートします。

パイプライン・テーブル・ファンクションおよび多相表関数(PTF)は、BOOLEANデータ型の列を返すことをサポートします。

パラメータがBOOLEANであるコール指定を使用して、PL/SQLからBOOLEAN型のパラメータを持つJavaおよびJavaScriptのストアド・プロシージャを呼び出せます。PL/SQLプロシージャと無名ブロックも、サーバーで、またはクライアントサイバー環境でJDBCを使用してJavaから起動できます。OCI、動的SQLまたはDBMS_SQLを使用して渡されるBOOLEAN型の変数は、BOOLEANとして直接渡すことができます。

ノート:

BOOLBOOLEANの略称として使用できます。

関連項目:

例1-1 SQLからのBOOLEAN引数を使用したPL/SQLファンクションのコール

CREATE OR REPLACE FUNCTION useBool(p1 BOOLEAN) RETURN NUMBER AS
BEGIN
    IF p1 THEN RETURN 100;
    ELSE
        RETURN 200;
    END IF;
END;
/

SET SERVEROUTPUT ON;
DECLARE
    v1 NUMBER;
    v2 BOOLEAN := TRUE;
BEGIN
    SELECT useBool(v2) INTO v1 FROM dual; --boolean argument function called from SELECT
    DBMS_OUTPUT.PUT_LINE(v1);
END;
/

結果:

100

1.1.2 IF [NOT] EXISTS構文のサポート

IF NOT EXISTSおよびIF EXISTSは、CREATEALTERおよびDROP DDL文でサポートされています。これらは、指定されたオブジェクトの存在または存在しないことによって発生する可能性のあるエラーを抑制するために使用され、冪等のDDLスクリプトを記述できます。

IF NOT EXISTS句は、指定された名前のオブジェクトがすでに存在する場合にエラーがスローされないようにするために、CREATE DDL文でサポートされています。オブジェクトがすでに存在する場合、コマンドは無視され、元のオブジェクトは変更されません。

flip側では、ALTERおよびDROP DDL文とともに使用すると、IF EXISTS句によってエラーが抑制されます。指定された名前のオブジェクトが存在しない場合、コマンドは無視され、ALTERまたはDROPの影響を受けるオブジェクトは存在しません。

この句を使用または除外することで、DDL文の実行前にオブジェクトの存在を確認する必要があるかどうかに応じた、より細かい制御が可能になります。この柔軟性により、オブジェクトが存在する(または存在しない)場合に文を無視するかエラーを発生させるかを決定できます。

ノート:

CREATE DDL文を使用するコマンドでは、IF NOT EXISTSOR REPLACEと組み合せて使用することはできません。

関連項目:

例1-2 IF NOT EXISTSを使用したCREATE PROCEDURE

この文を1回実行すると、プロシージャhelloが作成されます(同じ名前のプロシージャがまだスキーマに存在しないことが前提です)。

CREATE PROCEDURE IF NOT EXISTS hello AS
BEGIN
  DBMS_OUTPUT.PUT_LINE('Hello there');
END;
/

プロシージャ本体の変更がある場合でも、文の追加実行はエラーになりません。元の本体は不変です。

CREATE PROCEDURE IF NOT EXISTS hello AS
BEGIN
  DBMS_OUTPUT.PUT_LINE('Second hello');
END;
/

ノート:

コマンドが無視されるか実行されるかに関係なく、同じ出力メッセージ(この場合は「プロシージャが作成されました。」)が表示されます。これにより、冪等のDDLスクリプトを記述できるようになります。ALTERCREATEおよびDROP文についても同様です。

プロシージャ・テキストは、2番目の文が実行される前後と同じです。

SELECT TEXT FROM USER_SOURCE WHERE NAME='HELLO';

TEXT
-------------------------------------------
procedure            hello
AS BEGIN
DBMS_OUTPUT.PUT_LINE('Hello there');
END;

1.1.3 拡張されたCASE制御

単純なCASE文が、Dangling Predicateと選択リストの使用がサポートされるようにPL/SQLで拡張されたことで、コードを簡略化し、冗長性を減らすことが可能になりました。

Dangling Predicateは左オペランドが欠落している通常の式で、これを任意の数のリテラルまたは式のかわりに、またはそれらと組み合せてselector_valueとして使用できます。Dangling Predicateを使用すると、検索CASE文を必要とせずにより複雑な比較を作成できます。

ノート:

現在、Dangling PredicateのIS JSONおよびIS OFはサポートされていません。

単純なCASE文のWHEN句で、カンマで区切られた選択肢のリストがサポートされるようになりました。同じ結果に対応する複数のselector_valueオプションを統合できるため、コードの合理化に役立てることができます。

関連項目:

  • 拡張されたCASE制御の使用の詳細と、選択リストを使用する例は、「単純なCASE式」を参照してください
  • 拡張されたCASE制御の使用の詳細と、Dangling Predicateを使用する例は、「単純なCASE文」を参照してください
  • 拡張されたCASE制御を含む単純なCASE文の構文およびセマンティックスの詳細は、「CASE文」を参照してください

1.1.4 JSONコンストラクタおよびJSON_VALUEのPL/SQL集計タイプのサポート

JSONコンストラクタは、PL/SQL集計タイプを受け入れ、集計タイプ・データが移入されたJSONオブジェクトまたは配列を返すことができるようになりました。逆に、組込みファンクションjson_valueが、JSONから指定された集計タイプにマップすることでRETURNING句でPL/SQL集計タイプをサポートするようになりました。

すべてのPL/SQLレコード・フィールドとコレクション・データ要素の型制約は、json_valueによって適用されます。

SQLオブジェクトとPL/SQLレコード・タイプ・インスタンス(%ROWTYPE属性によって作成された暗黙的なレコードを含む)は、JSONコンストラクタへの有効な入力として許可されます。ユーザー定義の型を入力としてサポートするように拡張されたことで、PL/SQLアプリケーションとJSONをサポートする言語間のデータ交換が合理化されます。

関連項目:

1.1.5 SQLトランスパイラ

SQLトランスパイラが自動的に実行され、可能な場合は、SQL内のPL/SQLファンクションを、ユーザーの介入なしでSQL式に変換(トランスパイル)します。

変換操作はユーザーに対して透過的であり、SQLとPL/SQLランタイムの間で切り替えることで発生するオーバーヘッドを削減することによってパフォーマンスを改善できます。

関連項目:

1.2 非推奨となった機能

次の機能は非推奨であり、将来のリリースではサポートされなくなる可能性があります。

コマンド ALTER TYPE ... INVALIDATEは非推奨となりました。かわりにCASCADE句を使用してください。

ALTER TYPEREPLACE句は非推奨となりました。かわりにalter_method_spec句を使用してください。または、CREATE OR REPLACE TYPE文を使用して型を再作成することもできます。

構文およびセマンティクスの詳細は、ALTER TYPE文を参照してください

Oracle Databaseの12cリリース1(12.1)以降、コンパイル・パラメータPLSQL_DEBUGは非推奨となります。

PL/SQLユニットをデバッグ用にコンパイルするには、PLSQL_OPTIMIZE_LEVEL=1を指定します。

コンパイル・パラメータの詳細は、PL/SQLユニットおよびコンパイル・パラメータを参照してください。

1.3 サポート対象外となった機能

サポート対象外になったPL/SQL言語リファレンスの機能はありません。

関連項目: