Oracle 使用非Sql类型执行即时命令
我需要在返回嵌套表的PL/SQL函数中动态调用函数(比如handler()) 代码: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; 以及
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
。