【发布时间】:2019-12-13 03:13:33
【问题描述】:
我有这个程序:
PROCEDURE proc_with_cursor( P_PARAM1_IN NUMBER, P_PARAM2_IN NUMBER, P_CURSOR_OUT OUT SYS_REFCURSOR)
IS
v_sql VARCHAR2 (32767);
v_script VARCHAR2 (32767);
v_bind_vars VARCHAR2 (32767);
BEGIN
v_sql := 'BEGIN OPEN :1 FOR :2 ';
v_bind_vars := P_PARAM1_IN||', '||P_PARAM2_IN;
v_sql := v_sql||' USING '||v_bind_vars||'; ';
--tried also following but also couldn't catch the error!
--v_sql := v_sql ||'EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE(''error: ''||SQLCODE||'' - ''||SQLERRM); END;';
v_sql := v_sql||' END;';
v_script := 'select sysdate from dual where 1= :bind_first and 2 = :bindsecond';
EXECUTE IMMEDIATE v_sql using P_CURSOR_OUT, v_script;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('error: '||SQLCODE||' - '||SQLERRM); -- this part is not catching the error!!!!!
END;
有时,脚本会抛出如下错误:
ORA-12847:由于并发 DDL 操作重试解析
[错误] 执行 (1:1): ORA-12847: 由于并发 DDL 操作重试解析
我的问题是:如何捕获该错误?
【问题讨论】:
-
为什么要使用
execute immediate打开游标?能否请您提供更真实的代码。 -
为了将字符串传递给使用过程中动态创建的绑定变量
-
使用 v_bind_vars 为 v_script 打开 P_CURSOR_OUT;会抱怨并非所有变量都绑定
-
如果在编译时不知道变量的数量,那么使用DBMS_SQL
-
有没有办法将结果从 dbms_sql 游标传递到输出 refcursor 参数?
标签: oracle plsql cursor procedure