INLINEプラグマは、サブプログラム・コールがインライン化されるかどうかを指定します。 インライン化によって、(同じプログラム・ユニット内のサブプログラムに対する)サブプログラム・コールは、コール先サブプログラムのコピーに置き換えられます。
構文
inline_pragma ::=

キーワードとパラメータの説明
PRAGMA
文がプラグマ(コンパイラ・ディレクティブ)であることを表します。 プラグマは、実行時ではなくコンパイル時に処理されます。 プラグマは、コンパイラに情報を渡します。
identifier
サブプログラムの名前。
YES
PLSQL_OPTIMIZE_LEVEL=2の場合、YESはサブプログラム・コールのインライン化を指定します。
PLSQL_OPTIMIZE_LEVEL=3の場合、YESはサブプログラム・コールのインライン化に高い優先順位を指定します。
NO
サブプログラム・コールがインライン化されないように指定します。
使用上の注意
INLINEプラグマは、直後にある宣言または文および一部の種類の文にのみ影響します。
INLINEプラグマは、次に示すいずれかの文の直前にある場合、その文に指定されたサブプログラムに対するすべてのコールに影響します(例13-1を参照)。
代入
コール
条件付き
CASE
CONTINUE-WHEN
EXECUTE IMMEDIATE
EXIT-WHEN
LOOP
RETURN
INLINEプラグマは、前述のリストにない文には影響しません。
INLINEプラグマが宣言の直前にある場合は、次のものに影響します。
その宣言に指定されたサブプログラムに対するすべてのコール
その宣言内のすべての初期化値(レコードのデフォルトの初期化値を除く)
サブプログラムの名前(identifier)がオーバーロードされた場合(つまり、複数のサブプログラムに属する場合)、INLINEプラグマは、その名前を持つすべてのサブプログラムに適用されます(例13-2を参照)。 オーバーロードされたサブプログラム名の詳細は、「PL/SQLサブプログラム名のオーバーロード」を参照してください。
PRAGMA INLINE (identifier, 'YES')は、特定のコールをインライン化するようにコンパイラに対して強く促しますが、コンパイラは、他の考慮事項または制限のためインライン化が望ましくない場合、インライン化を行わないことがあります。 PRAGMA INLINE ( identifier,'NO')を指定すると、コンパイラは、identifierというサブプログラムに対するコールをインライン化しません(例13-3を参照)。
複数のプラグマが、同じ宣言または文に影響する場合があります。 各プラグマは、文に対して独自の影響を及ぼします。 PRAGMA INLINE(identifier,'YES')およびPRAGMA INLINE (identifier,'NO')に同じidentifierが含まれている場合、'NO'は'YES'をオーバーライドします(例13-4を参照)。 1つのPRAGMA INLINE (identifier,'NO')は、任意の数のPRAGMA INLINE (identifier,'YES')をオーバーライドします。これらのプラグマの順序は重要ではありません。
例13-1および例13-2では、PLSQL_OPTIMIZE_LEVEL=2を想定しています。
例13-1では、INLINEプラグマは、プロシージャ・コールp1(1)およびp1(2)には影響しますが、プロシージャ・コールp1(3)およびp1(4)には影響しません。
例13-1 サブプログラムのインライン化の指定
PROCEDURE p1 (x PLS_INTEGER) IS ...
...
PRAGMA INLINE (p1, 'YES');
x:= p1(1) + p1(2) + 17; -- These 2 calls to p1 will be inlined
...
x:= p1(3) + p1(4) + 17; -- These 2 calls to p1 will not be inlined
...
例13-2では、INLINEプラグマは、p2という名前の両方のファンクションに影響します。
例13-2 オーバーロードされたサブプログラムのインライン化の指定
FUNCTION p2 (p boolean) return PLS_INTEGER IS ...
FUNCTION p2 (x PLS_INTEGER) return PLS_INTEGER IS ...
...
PRAGMA INLINE(p2, 'YES');
x := p2(true) + p2(3);
...
例13-3では、PLSQL_OPTIMIZE_LEVEL=3を想定しています。 INLINEプラグマは、プロシージャ・コールp1(1)およびp1(2)には影響しますが、プロシージャ・コールp1(3)およびp1(4)には影響しません。
例13-3 サブプログラムの非インライン化の指定
PROCEDURE p1 (x PLS_INTEGER) IS ...
...
PRAGMA INLINE (p1, 'NO');
x:= p1(1) + p1(2) + 17; -- These 2 calls to p1 will not be inlined
...
x:= p1(3) + p1(4) + 17; -- These 2 calls to p1 might be inlined
...
PRAGMA INLINE ... 'NO'は、コード内の順序に関係なく、同じサブプログラムのPRAGMA INLINE ... 'YES'をオーバーライドします。 例13-4では、2番目のINLINEプラグマは1番目と3番目のINLINEプラグマをオーバーライドします。
例13-4 同じサブプログラムに対する2つのINLINEプログマの適用
PROCEDURE p1 (x PLS_INTEGER) IS ... ... PRAGMA INLINE (p1, 'YES'); PRAGMA INLINE (p1, 'NO'); PRAGMA INLINE (p1, 'YES'); x:= p1(1) + p1(2) + 17; -- These 2 calls to p1 will not be inlined ...
関連トピック