プライマリ・コンテンツに移動
Oracle Database PL/SQL言語リファレンス
12c リリース1 (12.1)
B71296-06
目次へ移動
目次
索引へ移動
索引

前
次

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

ここでは、『Oracle Database PL/SQL言語リファレンス』の変更点を示します。

Oracle Database 12cリリース1(12.1)の変更点

Oracle Database 12cリリース1(12.1)に関して、『Oracle Database PL/SQL言語リファレンス』では次の新機能について解説しています。

実行者権限ファンクションの結果がキャッシュ可能である

Oracle Database 12cより前のバージョンでは、実行者権限ファンクションの結果をキャッシュすることはできませんでした。

Oracle Database 12cでは、この制限はなくなりました。

実行者権限ファンクションの詳細は、「実行者権限および定義者権限(AUTHIDプロパティ)」を参照してください。結果キャッシュの詳細は、「PL/SQLファンクション結果キャッシュ」を参照してください。

PL/SQLとSQL間のインタフェースを越えられるPL/SQL専用データ型の追加

Oracle Database 12c以前は、PL/SQLのみのデータ型(BOOLEAN、連想配列、レコードなど)の値は、クライアント・プログラム(OCIまたはJDBC)やサーバーのPL/SQLから発行される静的およびネイティブの動的SQLからバインドできませんでした。

Oracle Database 12cより、PL/SQLのみのデータ型の値を、無名ブロック(これらはSQL文です)、SQL問合せやCALL文内のPL/SQLファンクション・コール、およびSQL問合せ内のTABLE演算子にバインドできるようになります。ただし、次のことに注意してください。

  • PL/SQLのみのデータ型は、事前定義する(例: 例7-2BOOLEAN)か、パッケージ仕様部で宣言する(例: 例7-3のレコード)必要があります。

  • PL/SQLのみのデータ型が連想配列である場合は、例7-4に示すように、PLS_INTEGERを使用して索引付けする必要があります。

  • PL/SQL専用データ型が連想配列である場合、非問合せDML文(INSERT、UPDATE、DELETE、MERGE)または副問合せ内で使用することはできません。

  • PL/SQLファンクションは、PL/SQLのみの型の値をSQLに戻すことはできません。

  • BOOLEANリテラル(TRUEFALSEまたはNULL)は、静的SQL問合せまたはJava/JDBCアプリケーションからコールされるPL/SQLファンクションに対する引数にはできません。

  • SQLコンテキストでは、戻り型がパッケージ仕様部で宣言されているファンクションを使用できません。

新しいACCESSIBLE BY句

データベース・アプリケーションを複数のPL/SQLパッケージとして実装する場合があります。つまり、Application Programming Interface(API)を提供する1つのパッケージと、機能を提供する複数のヘルパー・パッケージです。理想的には、APIのみをクライアントからアクセス可能にします。

また、同じスキーマ内のいくつかの別のPL/SQLユニットにのみサービスを提供するユーティリティ・パッケージを作成する場合もあります。理想的には、ユーティリティ・パッケージを意図したPL/SQLユニットからのみアクセス可能にします。

Oracle Database 12cより前のバージョンでは、PL/SQLにより、ヘルパー・パッケージ内で公開されている項目のクライアントによる使用を防ぐことはできませんでした。これらの項目を隔離するには、リレーショナル・データベース管理システム(RDBMS)のセキュリティ機能を使用する必要がありました。一部のアプリケーション・デプロイメント・スキームでは、RDBMSのセキュリティ機能の使用は困難でした。

Oracle Database 12cでは、次の各文はオプションのACCESSIBLE BY句を持ちます。この句では、作成または変更しているPL/SQLユニットにアクセス可能なPL/SQLユニットのホワイト・リストを指定できます。

ACCESSIBLE BY句は、Oracleの標準セキュリティ・メカニズムを補完します。無効な参照を許可することはできません。

FETCH FIRST句

オプションのFETCH FIRST句は、問合せにより戻される行数を制限することにより、一般的な「上位N番までの」問合せのSQLを大幅に簡素化します。

FETCH FIRSTは主に、サード・パーティ・データベースからOracle Databaseへの移行を単純化するために提供されています。ただし、一部のSELECT BULK COLLECT INTO文のパフォーマンスを向上させることもできます。詳細は、「SELECT BULK COLLECT INTO文の行の制限」を参照してください。

PL/SQLパッケージおよびスタンドアロン・サブプログラムへのロールの付与が可能

Oracle Database 12cより前のバージョンでは、定義者権限(DR)ユニットは常に定義者の権限で実行され、起動者権限(IR)ユニットは常に起動者の権限で実行されていました。すべてのユーザーが起動可能なPL/SQLユニットを作成するには、それらのユーザーの権限が自分より低い場合でも、DRユニットを作成する必要がありました。DRユニットはどのユーザーによって起動されたかにかかわらず、定義者の権限で常に実行されました。

Oracle Database 12cでは、個々のPL/SQLパッケージおよびスタンドアロン・サブプログラムにロールを付与できます。DRユニットのかわりにIRユニットを作成し、ロールを付与できます。IRユニットは、起動者とロールの両方の権限で実行されますが、定義者が持つ追加の権限は与えられません。

詳細は、「PL/SQLパッケージおよびスタンドアロン・サブプログラムへのロールの付与」を参照してください。

より多くのデータ型の最大サイズがSQLとPL/SQLで同じに

Oracle Database 12cより前のバージョンでは、データ型VARCHAR2NVARCHAR2およびRAWは、SQLとPL/SQLで最大サイズが異なりました。SQLでは、VARCHAR2NVARCHAR2の最大サイズは4,000バイト、RAWの最大サイズは2,000バイトでした。PL/SQLでは、これらの各データ型の最大サイズは32,767バイトでした。

Oracle Database 12cでは、これらの各データ型の最大サイズは、SQLとPL/SQLの両方で32,767バイトです。ただし、SQLについては、MAX_STRING_SIZE初期化パラメータがEXTENDEDに設定されている場合にのみ、これらの最大サイズとなります。拡張データ型の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

PDBでのDATABASEトリガー

Oracle Database 12cでは、プラガブル・データベース(PDB)上でDATABASEイベント・トリガーを作成できます。構文とセマンティクスについては、「CREATE TRIGGER文」を参照してください。PDBの詳細は、『Oracle Database管理者ガイド』を参照してください。

LIBRARYをDIRECTORYオブジェクトとしてCREDENTIALを使用して定義可能

Oracle Database 12cより前:

  • DIRECTORYオブジェクトがファイル・システム・パスに対する単一のメンテナンス・ポイントとして意図されているOracle Databaseのバージョンでも、LIBRARYオブジェクトは明示的なパスを使用してのみ定義できました。

  • ライブラリに格納されているサブプログラムの実行時には、extprocエージェントは常にOracle Databaseインストールの所有者を偽装していました。

Oracle Database 12c以降:

  • 明示的なパスまたはDIRECTORYオブジェクトのいずれを使用しても、LIBRARYオブジェクトを定義できます。

    DIRECTORYオブジェクトを使用すると、外部プロシージャを使用するアプリケーションのセキュリティと移植性が向上します。

  • LIBRARYオブジェクトの定義時に、CREDENTIAL句を使用して、ライブラリ内に格納されているサブプログラムの実行時にextprocエージェントが偽装するオペレーティング・システム・ユーザーを指定できます。(デフォルトはOracle Databaseインストールの所有者です。)

詳細は、「CREATE LIBRARY文」を参照してください。

暗黙文の結果

Oracle Database 12cより前のバージョンでは、PL/SQLストアド・サブプログラムはSQL問合せからの結果セットをOUT REF CURSORパラメータを通して明示的に戻し、サブプログラムを起動したクライアント・プログラムは、結果セットを受け取るにはこれらのパラメータに明示的にバインドする必要がありました。

Oracle Database 12cでは、PL/SQLストアド・サブプログラムは、OUT REF CURSORパラメータのかわりにPL/SQLパッケージDBMS_SQLを使用して、問合せ結果をクライアントに暗黙的に戻せます。この方法により、ストアド・サブプログラムからの問合せ結果の暗黙的な戻りに依存するアプリケーションのサード・パーティ・データベースからOracle Databaseへの移行が容易になります。詳細は、「DBMS_SQL.RETURN_RESULTプロシージャ」および「DBMS_SQL.GET_NEXT_RESULTプロシージャ」を参照してください。

BEQUEATH CURRENT_USERビュー

Oracle Database 12cより前のバージョンでは、ビューは常に定義者権限(DR)ユニットのように動作しました。

Oracle Database 12cでは、ビューはDRユニットのように動作するBEQUEATH DEFINER(デフォルト)、または起動者権限(IR)ユニットにやや似た動作を行うBEQUEATH CURRENT_USERになります。詳細は、『Oracle Databaseセキュリティ・ガイド』を参照してください。DRおよびIRユニットの概要は、「実行者権限および定義者権限(AUTHIDプロパティ)」を参照してください。

INHERIT PRIVILEGESとINHERIT ANY PRIVILEGES権限

Oracle Database 12cより前のバージョンでは、IRユニットは常にその起動者の権限で実行されていました。その起動者の権限がその所有者の権限より高い場合、IRユニットは所有者には意図されていない、または禁止されている操作を行う可能性がありました。

Oracle Database 12cでは、その所有者が起動者に対するINHERIT PRIVILEGES権限またはINHERIT ANY PRIVILEGES権限を持つ場合にのみ、IRユニットを起動者の権限で実行できます。詳細は、「実行者権限および定義者権限(AUTHIDプロパティ)」を参照してください。

非表示列

非表示列は、ユーザー指定の非表示の列であり、次の点でシステム生成の非表示の列と異なります。

  • 表示列の名前を明示的に指定できる箇所であれば、非表示列の名前も明示的に指定できます。

    非表示列の値を表示するか代入するには、SQL*PlusのDESCRIBEコマンド、SELECT *コマンド、Oracle Call Interface(OCI)の記述およびPL/SQL %ROWTYPE属性のように、その名前を暗黙的ではなく明示的に指定する必要があります。

  • 非表示列を表示列に変更できます。

    非表示列を表示列に変更すると、%ROWTYPE属性で定義されているいくつかのレコードの構造が変わります。詳細は、「%ROWTYPE属性と非表示列」を参照してください。

関連項目:

非表示列の詳細は、『Oracle Database SQL言語リファレンス』を参照してください。

型ではなくオブジェクトがエディションまたは非エディション

Oracle Database 12cより前のリリースでは、その型がデータベース内でエディション対応であり、その所有者に対してエディションが有効化されていれば、スキーマ・オブジェクトはエディション対応でした。エディションが有効化されたユーザーは、エディション対応タイプの非エディション・オブジェクトを所有できませんでした。

Oracle Database 12cでは、それを所有するスキーマ内でその型がエディション対応であり、EDITIONABLEプロパティがあれば、スキーマ・オブジェクトはエディション対応になります。エディションが有効化されたユーザーは、スキーマ内での型が非エディション対応であるか、オブジェクトにNONEDITIONABLEプロパティがあれば、データベース内で型がエディション対応の非エディション・オブジェクトを所有できます。したがって、「CREATE [ OR REPLACE ]文」および「ALTER文」を使用して、EDITIONABLENONEDITIONABLEのどちらも指定できます。

関連項目:

エディション・オブジェクトおよび非エディション・オブジェクトの詳細は、『Oracle Database開発ガイド』を参照してください。

SQLで高速に実行されるPL/SQLファンクション

Oracle Database 12cでは、次の2種類のPL/SQLファンクションはSQLでより高速に実行される可能性があります。

  • SQL SELECT文のWITH句で宣言および定義されているPL/SQLファンクション(詳細は『Oracle Database SQL言語リファレンス』を参照)

  • 「UDFプラグマ」を使用して定義されているPL/SQLファンクション

事前定義問合せディレクティブ$$PLSQL_UNIT_OWNERと$$PLSQL_UNIT_TYPE

Oracle Database 12cより前のバージョンでは、診断コードでは、現行のPL/SQLユニットの名前(事前定義問合せディレクティブ$$PLSQL_UNITを持つ)およびそのユニット内で事前定義問合せディレクティブ$$PLSQL_LINEが指定されているソース行の番号しか特定できませんでした。

Oracle Database 12cでは、追加の事前定義問合せディレクティブ$$PLSQL_UNIT_OWNER$$PLSQL_UNIT_TYPEにより、現行のPL/SQLユニットの所有者とタイプも特定できます。詳細は、「事前定義の問合せディレクティブ」を参照してください。

コンパイル・パラメータPLSQL_DEBUGは非推奨

PL/SQLユニットをデバッグ用にコンパイルするかどうかを指定するコンパイル・パラメータPLSQL_DEBUGは、非推奨になりました。PL/SQLユニットをデバッグ用にコンパイルするには、PLSQL_OPTIMIZE_LEVEL=1を指定します。

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