SQL文には、PL/SQLまたはJavaで作成したユーザー定義関数、あるいはC言語で作成した外部プロシージャとしてのユーザー定義関数を含めることができます。これらは、SELECT
リスト、SET
句またはWHERE
句に指定できます。SQL文がパラレル化されると、このような関数はパラレル実行サーバー・プロセスによって1行ずつ実行されます。関数で使用されるPL/SQLパッケージ変数またはJava静的属性は、完全に個々のパラレル実行プロセスのみで使用され、元のセッションからコピーされるのではなく各行が処理されるたびに新たに初期化されます。この処理のため、パラレルで実行した場合、すべての関数によって正しい結果が生成されるとはかぎりません。
ユーザーが作成した表関数を文のFROM
リストに指定できます。このような関数は、行出力を生成するためソース・テーブルのように機能します。表関数はその文で1回、各パラレル実行プロセスの開始時に初期化されます。すべての変数は、対応するパラレル実行プロセスでしか使用されません。
この項の内容は次のとおりです。
SELECT
文、あるいはDMLまたはDDL文の副問合せでは、次の場合にユーザー作成関数がパラレルで実行されることがあります。
PARALLEL_ENABLE
キーワードで宣言された場合。
パッケージまたはタイプで宣言され、PRAGMA
RESTRICT_REFERENCES
句にWNDS
、RNPS
およびWNPS
のすべてが指定された場合。
CREATE
FUNCTION
で宣言され、システムがPL/SQLコードの本体を分析して、コードがデータベースに書き込まず、パッケージ変数の読取りや変更も行わないことを判別できた場合。
関数の実行をシリアルで行うことが必要な場合でも、問合せまたは副問合せの他の部分はパラレルで実行されることがあります。
PRAGMA
RESTRICT_REFERENCES
句の詳細は『Oracle Database開発ガイド』、CREATE
FUNCTION
文の詳細は『Oracle Database SQL言語リファレンス』を参照してください。
パラレルDMLまたはDDL文においても、パラレル問合せと同じく、次の場合にユーザー作成関数がパラレルで実行されることがあります。
PARALLEL_ENABLE
キーワードで宣言された場合。
パッケージまたはタイプで宣言され、PRAGMA
RESTRICT_REFERENCES
句にRNDS
、WNDS
、RNPS
およびWNPS
のすべてが指定された場合。
CREATE
FUNCTION
文で宣言され、システムがPL/SQLコードの本体を分析して、コードがデータベースに読取りや書込みを行わず、パッケージ変数の読取りや変更も行わないことを判別できた場合。
パラレルDML文の場合、パラレルで実行できない関数コールが含まれていると、そのDML文全体がシリアルで実行されます。INSERT
SELECT
文またはCREATE
TABLE
AS
SELECT
文の場合は、ここで説明したパラレル問合せルールに従って、問合せ部分の関数コールはパラレル化されます。文のその他の部分をシリアルで実行する必要があっても、問合せはパラレル化できます。または、その逆の場合もあります。