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 ...
関連トピック