ここでは、『Oracle Database PL/SQL言語リファレンス』の変更点を示します。
Oracle Database 12cリリース1(12.1)に関して、『Oracle Database PL/SQL言語リファレンス』では次の新機能について解説しています。
Oracle Database 12cより前のバージョンでは、実行者権限ファンクションの結果をキャッシュすることはできませんでした。
Oracle Database 12cでは、この制限はなくなりました。
実行者権限ファンクションの詳細は、「実行者権限および定義者権限(AUTHIDプロパティ)」を参照してください。結果キャッシュの詳細は、「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-2のBOOLEAN
)か、パッケージ仕様部で宣言する(例: 例7-3のレコード)必要があります。
PL/SQLのみのデータ型が連想配列である場合は、例7-4に示すように、PLS_INTEGER
を使用して索引付けする必要があります。
PL/SQL専用データ型が連想配列である場合、非問合せDML文(INSERT、UPDATE、DELETE、MERGE)または副問合せ内で使用することはできません。
PL/SQLファンクションは、PL/SQLのみの型の値をSQLに戻すことはできません。
BOOLEAN
リテラル(TRUE
、FALSE
またはNULL
)は、静的SQL問合せまたはJava/JDBCアプリケーションからコールされるPL/SQLファンクションに対する引数にはできません。
SQLコンテキストでは、戻り型がパッケージ仕様部で宣言されているファンクションを使用できません。
データベース・アプリケーションを複数の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
句は、問合せにより戻される行数を制限することにより、一般的な「上位N番までの」問合せのSQLを大幅に簡素化します。
FETCH
FIRST
は主に、サード・パーティ・データベースからOracle Databaseへの移行を単純化するために提供されています。ただし、一部のSELECT
BULK
COLLECT
INTO
文のパフォーマンスを向上させることもできます。詳細は、「SELECT BULK COLLECT INTO文の行の制限」を参照してください。
Oracle Database 12cより前のバージョンでは、定義者権限(DR)ユニットは常に定義者の権限で実行され、起動者権限(IR)ユニットは常に起動者の権限で実行されていました。すべてのユーザーが起動可能なPL/SQLユニットを作成するには、それらのユーザーの権限が自分より低い場合でも、DRユニットを作成する必要がありました。DRユニットはどのユーザーによって起動されたかにかかわらず、定義者の権限で常に実行されました。
Oracle Database 12cでは、個々のPL/SQLパッケージおよびスタンドアロン・サブプログラムにロールを付与できます。DRユニットのかわりにIRユニットを作成し、ロールを付与できます。IRユニットは、起動者とロールの両方の権限で実行されますが、定義者が持つ追加の権限は与えられません。
詳細は、「PL/SQLパッケージおよびスタンドアロン・サブプログラムへのロールの付与」を参照してください。
Oracle Database 12cより前のバージョンでは、データ型VARCHAR2
、NVARCHAR2
およびRAW
は、SQLとPL/SQLで最大サイズが異なりました。SQLでは、VARCHAR2
とNVARCHAR2
の最大サイズは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言語リファレンス』を参照してください。
Oracle Database 12cでは、プラガブル・データベース(PDB)上でDATABASE
イベント・トリガーを作成できます。構文とセマンティクスについては、「CREATE TRIGGER文」を参照してください。PDBの詳細は、『Oracle Database管理者ガイド』を参照してください。
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プロシージャ」を参照してください。
Oracle Database 12cより前のバージョンでは、ビューは常に定義者権限(DR)ユニットのように動作しました。
Oracle Database 12cでは、ビューはDRユニットのように動作するBEQUEATH
DEFINER
(デフォルト)、または起動者権限(IR)ユニットにやや似た動作を行うBEQUEATH
CURRENT_USER
になります。詳細は、『Oracle Databaseセキュリティ・ガイド』を参照してください。DRおよびIRユニットの概要は、「実行者権限および定義者権限(AUTHIDプロパティ)」を参照してください。
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文」を使用して、EDITIONABLE
とNONEDITIONABLE
のどちらも指定できます。
関連項目:
エディション・オブジェクトおよび非エディション・オブジェクトの詳細は、『Oracle Database開発ガイド』を参照してください。
Oracle Database 12cでは、次の2種類のPL/SQLファンクションはSQLでより高速に実行される可能性があります。
SQL SELECT
文のWITH
句で宣言および定義されているPL/SQLファンクション(詳細は『Oracle Database SQL言語リファレンス』を参照)
「UDFプラグマ」を使用して定義されているPL/SQLファンクション
Oracle Database 12cより前のバージョンでは、診断コードでは、現行のPL/SQLユニットの名前(事前定義問合せディレクティブ$$PLSQL_UNIT
を持つ)およびそのユニット内で事前定義問合せディレクティブ$$PLSQL_LINE
が指定されているソース行の番号しか特定できませんでした。
Oracle Database 12cでは、追加の事前定義問合せディレクティブ$$PLSQL_UNIT_OWNER
と$$PLSQL_UNIT_TYPE
により、現行のPL/SQLユニットの所有者とタイプも特定できます。詳細は、「事前定義の問合せディレクティブ」を参照してください。
PL/SQLユニットをデバッグ用にコンパイルするかどうかを指定するコンパイル・パラメータPLSQL_DEBUG
は、非推奨になりました。PL/SQLユニットをデバッグ用にコンパイルするには、PLSQL_OPTIMIZE_LEVEL=1
を指定します。
コンパイル・パラメータの詳細は、「PL/SQLユニットおよびコンパイル・パラメータ」を参照してください。