ここでは、このマニュアルに記載されているPL/SQLの新機能について簡単に説明し、詳細情報へのリンクを示します。
11g リリース1(11.1)でのPL/SQLの新機能は、次のとおりです。
組込みSQL正規表現ファンクションの拡張
組込み正規表現ファンクションREGEXP_INSTR
およびREGEXP_SUBSTR
の機能が拡張されました。新しい組込みSQL正規表現ファンクションREGEXP_COUNT
は、1つの文字列内での任意のパターンの出現回数を戻します。これらのファンクションは、SQLでもPL/SQLでも同様に機能します。
参照:
|
SIMPLE_INTEGER、SIMPLE_FLOATおよびSIMPLE_DOUBLEデータ型
SIMPLE_INTEGER
、SIMPLE_FLOAT
およびSIMPLE_DOUBLE
データ型は、それぞれPLS_INTEGER
、BINARY_FLOAT
およびBINARY_DOUBLE
の事前定義のサブタイプです。各サブタイプはそのベース型と同じ範囲を取り、NOT
NULL
制約を含んでいます。
SIMPLE_INTEGER
とPLS_INTEGER
との大きな違いは、オーバーフローの方法です。ただし、SIMPLE_FLOAT
とSIMPLE_DOUBLE
は、NOT
NULL
制約を除いて、そのベース型と同じです。
SIMPLE_INTEGER
は、値がNULL
になることがなく、オーバーフロー・チェックが不要な場合に使用できます。SIMPLE_INTEGER
およびSIMPLE_DOUBLE
は、値がNULL
になることがない場合に使用できます。SIMPLE_INTEGER
値に対する算術演算はハードウェアで直接実行されるため、これらのサブタイプを使用すると、NULLかどうかのチェックおよびオーバーフロー・チェックのためのオーバーヘッドが発生せず、PLSQL_CODE_TYPE='NATIVE'
の場合、そのベース型を使用するよりパフォーマンスが大幅に向上します。PLSQL_CODE_TYPE='INTERPRETED'
の場合、パフォーマンスの向上は少なくなります。
詳細は、次の項を参照してください。
CONTINUE文
CONTINUE
文は現行のループの反復を終了して、次の反復に制御を移します(ループを終了して、そのループの最後に制御を移すEXIT
文とは対照的です)。CONTINUE
文には、無条件CONTINUE
と条件付きCONTINUE
WHEN
という2つの形式があります。
詳細は、次の項を参照してください。
PL/SQL式での順序
擬似列CURRVAL
およびNEXTVAL
を使用すると、PL/SQLのソース・コードの記述が簡単になり、実行時のパフォーマンスとスケーラビリティが向上します。sequence_name
.CURRVAL
およびsequence_name
.NEXTVAL
は、NUMBER
式を使用できるすべての場所で使用できます。
詳細は、「CURRVALとNEXTVAL」を参照してください。
動的SQLの拡張
システム固有の動的SQLとDBMS_SQL
パッケージの両方が拡張されています。
システム固有の動的SQLでは、CLOB
型にできるようにすることで32KBを超える動的SQL文がサポートされています。「EXECUTE IMMEDIATE文」および「OPEN-FOR文」を参照してください。
DBMS_SQL
パッケージは、次のように拡張されています。
システム固有の動的SQLでサポートされているすべてのデータ型がサポートされています。
DBMS_SQL.PARSE
ファンクションは、CLOB
引数を受け入れることによって、32KBを超える動的SQL文を実行できます。
新しいDBMS_SQL.TO_REFCURSORファンクションを使用することによって、DBMS_SQL
パッケージからシステム固有の動的SQLに切り替えることができます。
新しいDBMS_SQL.TO_CURSOR_NUMBERファンクションを使用することによって、システム固有の動的SQLからDBMS_SQL
パッケージに切り替えることができます。
PL/SQLサブプログラムの起動での名前表記法および混合表記法
リリース11.1より前は、PL/SQLサブプログラムを起動するSQL文には、実パラメータを位置表記法で指定する必要がありました。リリース11.1以降は、名前表記法および混合表記法も使用できるようになっています。これによって、SQL文がデフォルトのパラメータを多数持つPL/SQLサブプログラムを起動する際の操作性が向上し、デフォルト値とは異なる値にする必要がある実パラメータがほとんどなくなっています。
一例として、例8-8の後のSELECT
文を参照してください。
PL/SQLファンクション結果キャッシュ
ファンクション結果キャッシュを使用すると、領域と時間を大幅に節約できます。結果がキャッシュされるファンクションが異なるパラメータ値で起動されるたびに、それらのパラメータおよびそれぞれの結果がキャッシュに格納されます。それ以降、同じファンクションが同じパラメータ値で起動されると、結果は再計算されるのではなく、キャッシュから取り出されます。
リリース11.1より前は、PL/SQLアプリケーションでファンクションの結果をキャッシュする場合、キャッシュとキャッシュ管理サブプログラムを設計およびコーディングする必要がありました。複数のセッションでそのアプリケーションを実行する場合は、セッションごとにそれぞれキャッシュとキャッシュ管理サブプログラムの独自のコピーが必要でした。各セッションで、同じ高コストの計算を実行する必要がある場合もありました。
リリース11.1以上では、PL/SQLにファンクション結果キャッシュが用意されています。これを使用するには、結果がキャッシュされるようにする各PL/SQLファンクションでRESULT_CACHE
句を使用します。ファンクション結果キャッシュは、共有グローバル領域(SGA)に格納されるため、アプリケーションを実行するすべてのセッションで使用できます。
アプリケーションをPL/SQLファンクション結果キャッシュに変換すると、アプリケーションによって使用されるSGAは増加しますが、システム・メモリーの合計使用量は大幅に減少します。
詳細は、次の項を参照してください。
複合トリガー
複合トリガーは、複数のタイミングで起動できるデータベース操作言語(DML)トリガーです。
複合トリガーの本体では、この本体のすべてのセクションのコードがアクセスできるPL/SQLの共通の状態がサポートされています。共通の状態は、トリガーを起動する文でエラーが発生した場合でも、トリガーを起動する文の開始時に確立され、トリガーを起動する文の完了時に破棄されます。
リリース11.1より前は、アプリケーション開発者が補助パッケージを使用して、共通の状態をモデル化していました。このアプローチは、プログラムしにくく、また、トリガーを起動する文でエラーが発生し、AFTER文トリガーが起動されなかった場合にメモリー・リークが発生する可能性がありました。複合トリガー使用すると、様々なタイミングで実装したアクションで共通データを共有するアプローチを簡単にプログラムできるようになります。
詳細は、「複合トリガー」を参照してください。
トリガーに対するより詳細な制御
SQL文CREATE
TRIGGER
では、トリガーをより詳細に制御できるENABLE
句、DISABLE
句およびFOLLOWS
句がサポートされています。DISABLE
句を使用すると、トリガーを無効な状態で作成できるため、トリガーを有効にする前に、コードが正常にコンパイルされることを確認できます。ENABLE
句は、デフォルトの状態を明示的に指定します。 FOLLOWS
句を使用すると、同じ表に対して定義され、タイミングも同じであるトリガーの起動順序を制御できます。
詳細は、次の項を参照してください。
データベース常駐接続プール
DBMS_CONNECTION_POOL
パッケージは、複数の中間層プロセスによって共有されるデータベース常駐接続プールの管理に使用されます。データベース管理者は、DBMS_CONNECTION_POOL
のプロシージャを使用して、データベース常駐接続プールの開始と停止、およびサイズや時間制限などのプール・パラメータの構成を行います。
詳細は、「DBMS_CONNECTION_POOLパッケージ」を参照してください。
サブプログラムの自動インライン化
サブプログラムのインライン化によって、(同じPL/SQLユニット内のサブプログラムに対する)サブプログラム・コールは、コール先サブプログラムのコピーに置き換えられます。ほとんどの場合はこれによって、プログラムのパフォーマンスが向上します。
PRAGMA INLINE
を使用して、個々のサブプログラム・コールがインライン化されるかどうかを指定できます。コンパイル・パラメータPLSQL_OPTIMIZE_LEVEL
を3(デフォルトは2)に設定することによって、自動インライン化を有効にする(コンパイラにインライン化の機会を探るように要求する)こともできます。
まれに、自動インライン化を行ってもプログラムのパフォーマンスが向上しないことがありますが、この場合は、PL/SQL階層型プロファイラを使用して、インライン化を無効にするサブプログラムを識別できます。
詳細は、次の項を参照してください。
参照: コンパイル・パラメータPLSQL_OPTIMIZE_LEVEL の詳細は、『Oracle Databaseリファレンス』を参照してください。 |
PL/Scope
PL/Scopeは、PL/SQLのソース・コードからユーザー定義の識別子に関するデータを収集して整理するコンパイラ・ドリブンのツールです。PL/Scopeはコンパイラ・ドリブンのツールであるため、直接使用するのではなく、対話型開発環境(SQL DeveloperやJDeveloperなど)を介して使用します。
PL/Scopeを使用すると、ソース・コードを参照したり理解するために費やす時間を最小限に抑えることによって、SQL Developerの生産性を向上させる、強力で効果的なPL/SQLのソース・コード・ブラウザの開発が可能になります。
詳細は、「ユーザー定義の識別子に関するデータの収集」を参照してください。
参照: 『Oracle Databaseアドバンスト・アプリケーション開発者ガイド』 |
PL/SQL階層型プロファイラ
PL/SQL階層型プロファイラは、PL/SQLプログラムの動的な実行プロファイルをサブプログラム・コールごとにまとめてレポートします。SQLの実行時間とPL/SQLの実行時間を別々に示します。動的な実行プロファイル内のサブプログラム・レベルのサマリーごとに、サブプログラムへのコール回数、サブプログラム自体で費やされた時間、サブプログラムのサブツリー(つまり、サブプログラムの下位サブプログラム)で費やされた時間、詳細な親子情報などの情報が含まれています。
生成されたHTMLレポートは、任意のブラウザで参照できます。適切に選択されたリンクが組み込まれたブラウザのナビゲーション機能によって、大規模なアプリケーションのパフォーマンスの分析、アプリケーションのパフォーマンスの向上、および開発コストの削減のための強力な手段が提供されます。
詳細は、「PL/SQLプログラムのプロファイルおよびトレース」を参照してください。
参照: 『Oracle Databaseアドバンスト・アプリケーション開発者ガイド』 |
PL/SQLネイティブ・コンパイラによるシステム固有のコードの直接生成
PL/SQLネイティブ・コンパイラは、PL/SQLコードをC言語のコードに変換してからCコンパイラにシステム固有のコードを生成させるのではなく、システム固有のコードを直接生成します。 個々の開発者は、DBAとして設定を行わずに、システム固有の実行用にPL/SQLユニットをコンパイルできます。ネイティブ・コンパイルされたPL/SQLプログラムの実行速度が大幅に向上する場合もあります。
詳細は、「システム固有の実行のためのPL/SQLユニットのコンパイル」を参照してください。