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_number
、to_char
およびto_nchar
で、BOOLEAN
を数値や文字型に変換するためのBOOLEAN
のオーバーロードを使用できるようになりました。CAST
演算子を使用して式をBOOLEAN
型にキャストすることもできます。
暗黙的な変換のサポートを有効にするには、初期化パラメータPLSQL_IMPLICIT_CONVERSION_BOOL
をTRUE
に設定する必要があります。CAST
やto_char
のような明示的な変換はパラメータに依存しないため、PLSQL_IMPLICIT_CONVERSION_BOOL
がTRUE
とFALSE
のどちらに設定されているかに関係なく動作します。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
として直接渡すことができます。
ノート:
BOOL
をBOOLEAN
の略称として使用できます。
関連項目:
-
SQLの
BOOLEAN
データ型の詳細は、『Oracle Database SQL言語リファレンス』を参照してください -
データ変換ルールの詳細は、『Oracle Database SQL言語リファレンス』を参照してください
例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
は、CREATE
、ALTER
およびDROP
DDL文でサポートされています。これらは、指定されたオブジェクトの存在または存在しないことによって発生する可能性のあるエラーを抑制するために使用され、冪等のDDLスクリプトを記述できます。
IF NOT EXISTS
句は、指定された名前のオブジェクトがすでに存在する場合にエラーがスローされないようにするために、CREATE
DDL文でサポートされています。オブジェクトがすでに存在する場合、コマンドは無視され、元のオブジェクトは変更されません。
flip側では、ALTER
およびDROP
DDL文とともに使用すると、IF EXISTS
句によってエラーが抑制されます。指定された名前のオブジェクトが存在しない場合、コマンドは無視され、ALTER
またはDROP
の影響を受けるオブジェクトは存在しません。
この句を使用または除外することで、DDL文の実行前にオブジェクトの存在を確認する必要があるかどうかに応じた、より細かい制御が可能になります。この柔軟性により、オブジェクトが存在する(または存在しない)場合に文を無視するかエラーを発生させるかを決定できます。
ノート:
CREATE
DDL文を使用するコマンドでは、IF NOT EXISTS
をOR REPLACE
と組み合せて使用することはできません。
関連項目:
- 様々なオブジェクト・タイプを使用して
IF
[NOT
]EXISTS
を実装するために使用されるセマンティクスの詳細は、「ストアドPL/SQLユニットのSQL文」を参照してください -
IF
[NOT
]EXISTS
句の使用の詳細は、『Oracle Database開発ガイド』を参照してください
例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スクリプトを記述できるようになります。ALTER
、CREATE
および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をサポートする言語間のデータ交換が合理化されます。
関連項目:
-
json_value
およびJSONコンストラクタをPL/SQL集計タイプとともに使用する方法の詳細は、「PL/SQLとJSONの型変換」を参照してください -
JSONコンストラクタの詳細は、『Oracle Database JSON開発者ガイド』を参照してください
-
json_value
を使用してユーザー定義のオブジェクト型またはコレクション型のインスタンスをインスタンス化する方法の詳細は、『Oracle Database JSON開発者ガイド』を参照してください
1.1.5 SQLトランスパイラ
SQLトランスパイラが自動的に実行され、可能な場合は、SQL内のPL/SQLファンクションを、ユーザーの介入なしでSQL式に変換(トランスパイル)します。
変換操作はユーザーに対して透過的であり、SQLとPL/SQLランタイムの間で切り替えることで発生するオーバーヘッドを削減することによってパフォーマンスを改善できます。
関連項目:
-
SQLトランスパイラによって
SCALAR
マクロのかわりに標準のPL/SQLファンクションをどのように使用できるかの詳細は、「SQL_MACRO句」を参照してください -
SQLトランスコンパイラの詳細は、『Oracle Database SQLチューニング・ガイド』を参照してください
1.2 非推奨となった機能
次の機能は非推奨であり、将来のリリースではサポートされなくなる可能性があります。
コマンド ALTER TYPE
... INVALIDATE
は非推奨となりました。かわりにCASCADE
句を使用してください。
ALTER TYPE
のREPLACE
句は非推奨となりました。かわりにalter_method_spec
句を使用してください。または、CREATE OR REPLACE TYPE
文を使用して型を再作成することもできます。
Oracle Databaseの12cリリース1(12.1)以降、コンパイル・パラメータPLSQL_DEBUGは非推奨となります。
PL/SQLユニットをデバッグ用にコンパイルするには、PLSQL_OPTIMIZE_LEVEL=1を指定します。
コンパイル・パラメータの詳細は、PL/SQLユニットおよびコンパイル・パラメータを参照してください。
1.3 サポート対象外となった機能
サポート対象外になったPL/SQL言語リファレンスの機能はありません。
関連項目:
- Oracle Databaseのこのリリースでサポート対象外になった機能の詳細は、『Oracle Databaseアップグレード・ガイド』を参照してください。