RESTRICT_REFERENCES を使用できます 関数がパッケージまたはデータベースの状態を読み取り/書き込みしないことを示します。
CREATE PACKAGE t_pkg AS
FUNCTION showup (msg VARCHAR2) RETURN VARCHAR2;
PRAGMA RESTRICT_REFERENCES(showup, WNDS, RNDS);
END t_pkg;
/
-- create the package body
CREATE OR REPLACE PACKAGE BODY t_pkg AS
FUNCTION showup (msg VARCHAR2) RETURN VARCHAR2 IS
v_val varchar2(1);
BEGIN
select dummy into v_val from dual;
RETURN v_val;
END;
END t_pkg;
/
以前は、SQLはそのような約束をしない限り関数を呼び出すことを許可しませんでしたが、その制限は解除されました。
プロシージャと関数の差別化要因にしたいと思います。 PL / SQL関数でNO_DATA_FOUND例外が発生した場合、SQL文の呼び出しは失敗しません(データが見つからない場合はSQLエラーではないため)。したがって、オブジェクトがSQLから呼び出されるように特別に設計されていない限り、プロシージャを使用することを好みます。