「回避策」の意味によって異なります。型は、PL/SQL ブロック (この場合はおそらくパッケージ) 内ではなく、SQL レベルで宣言する必要があります。たとえば、これはうまくいきます:
CREATE OR REPLACE TYPE t_error_msgs AS TABLE OF VARCHAR2(2000) / CREATE OR REPLACE PACKAGE p42 AS FUNCTION handler RETURN t_error_msgs; END p42; / CREATE OR REPLACE PACKAGE BODY p42 AS FUNCTION handler RETURN t_error_msgs IS BEGIN RETURN null; -- put real data here, obviously... END handler; END p42; / DECLARE v_error_msg t_error_msgs; v_function varchar2(30); BEGIN v_function := 'p42.handler'; EXECUTE IMMEDIATE 'BEGIN :result := ' || v_function || '; END;' USING OUT v_error_msg; END; /
プレ>または、これを動的にする必要があるかどうかを再検討することもできます。おそらく、その場で呼び出す関数を渡しているか、何らかの方法で決定し、
v_function
にデータを入力しています .可能な値のリストが比較的短い場合は、case
を使用する方が簡単かもしれません 個々の静的関数呼び出しを使用します。