Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle 使用非Sql类型执行即时命令_Oracle_Plsql - Fatal编程技术网

Oracle 使用非Sql类型执行即时命令

Oracle 使用非Sql类型执行即时命令,oracle,plsql,Oracle,Plsql,我需要在返回嵌套表的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; 以及

我需要在返回嵌套表的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:表达式必须是SQL类型
,而编译时
executeimmediate
不允许绑定非SQL类型


有什么办法吗?

这取决于您所说的“变通方法”是什么意思。必须在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_函数
。如果有一个相对较短的可能值列表,那么使用带有单个静态函数调用的
案例可能会更简单。

谢谢Alex,尽管我最终使用了
sys.ORA\u MINING\u VARCHAR2\u NT