SQL文によって起動できるPL/SQLファンクション

ストアド・ファンクション(およびそのファンクションによって起動されるサブプログラム)は、次に示す副作用を制御するための純正規則に従っている場合にのみ、SQL文から起動できます。

  • SELECT文またはパラレル化INSERT文、UPDATE文、DELETE文またはMERGE文から起動された場合、サブプログラムはデータベース表を変更できません。

  • INSERT文、UPDATE文、DELETE文またはMERGE文から起動された場合、サブプログラムは、その文によって変更されたデータベース表の問合せまたは変更を実行できません。

    ファンクションによって表の問合せまたは変更を実行する場合に、その表に対するDML文でファンクションを起動すると、ORA-04091(変更表エラー)が発生します。ただし、これには例外が1つあり、FORALL文に存在しない単一行のINSERT文によってVALUES句のファンクションを起動する場合、ORA-04091は発生しません。

  • SELECT文、INSERT文、UPDATE文、DELETE文またはMERGE文から起動された場合、サブプログラムは、次のどのSQL文も実行できません(PRAGMA AUTONOMOUS_TRANSACTIONが指定されていない場合)。

    • トランザクション制御文(COMMITなど)

    • セッション制御文(SET ROLEなど)

    • システム制御文(ALTER SYSTEMなど)

    • データベース定義言語(DDL)文(CREATEなど)。これらの文は自動的にコミットされます。

    (PRAGMA AUTONOMOUS_TRANSACTIONの詳細は、「AUTONOMOUS_TRANSACTIONプラグマ」を参照してください。)

ファンクション実行部のいずれかのSQL文が規則に違反すると、文の解析時にランタイム・エラーが発生します。

特にファンクションがDETERMINISTICまたはPARALLEL_ENABLEオプション(これらのオプションの詳細は、DETERMINISTIC句およびPARALLEL_ENABLE句を参照)を使用して宣言されている場合、ファンクションの副作用が少なくなるほど、そのファンクションはSELECT文でより効率的に最適化されます。

関連項目: