0

我需要在返回嵌套表的 PL/SQL 函数中动态调用一个函数(比如 handler() )。

代码:

BEGIN
... 
   v_function := 'handler'; //shown like this of simplicity.
   EXECUTE IMMEDIATE 'BEGIN :result := ' || v_function || '(...); END;'
     USING OUT v_error_msg;

... //process v_error_msg
END;

handler()规范:

TYPE t_error_msgs IS TABLE OF VARCHAR2(2000);

FUNCTION handle (...)
  RETURN t_error_msgs;

问题是我PL-00457:expressions have to be of SQL types在编译时遇到execute immediate不允许绑定非 sql 类型。

有什么办法吗?

4

1 回答 1

1

这取决于您所说的“解决方法”的含义。类型必须在 SQL 级别声明,而不是在 PL/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使用单独的静态函数调用可能会更简单。

于 2013-09-20T09:12:11.530 回答