ヘッダーをスキップ
Oracle Database PL/SQL言語リファレンス
11g リリース1(11.1)
E05670-03
  目次
目次
索引
索引

戻る
戻る
 
次へ
次へ
 

INLINEプラグマ

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

構文

inline_pragma ::=

inline_pragma
pragma_inline.gifの説明

キーワードとパラメータの説明

PRAGMA

文がプラグマ(コンパイラ・ディレクティブ)であることを表します。 プラグマは、実行時ではなくコンパイル時に処理されます。 プラグマは、コンパイラに情報を渡します。

identifier

サブプログラムの名前。

YES

PLSQL_OPTIMIZE_LEVEL=2の場合、YESはサブプログラム・コールのインライン化を指定します。

PLSQL_OPTIMIZE_LEVEL=3の場合、YESはサブプログラム・コールのインライン化に高い優先順位を指定します。

NO

サブプログラム・コールがインライン化されないように指定します。

使用上の注意

INLINEプラグマは、直後にある宣言または文および一部の種類の文にのみ影響します。

INLINEプラグマは、次に示すいずれかの文の直前にある場合、その文に指定されたサブプログラムに対するすべてのコールに影響します(例13-1を参照)。

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
...

関連トピック