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
文でより効率的に最適化されます。
関連項目:
-
SQL文によって起動できるPL/SQLファンクションの制限の詳細は、『Oracle Database開発ガイド』を参照してください。