首页 > 解决方案 > 如何捕捉执行立即(开放)的错误?

问题描述

我有这个程序:

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 操作重试解析

我的问题是:如何捕获该错误?

标签: oracleplsqlcursorprocedure

解决方案


您不能将对象名称(例如游标名称)和变量名称绑定到动态 SQL 中,只能绑定values。我认为这可能会达到您的预期:

PROCEDURE proc_with_cursor(  p_param1_in NUMBER, p_param2_in NUMBER, p_cursor_out OUT SYS_REFCURSOR)
IS
    v_script   VARCHAR2 (32767);
BEGIN
    v_script := 'select sysdate from dual where 1= :bind_first and 2 = :bindsecond';

    OPEN p_cursor_out FOR v_script USING p_param1_in, p_param2_in;

EXCEPTION
    WHEN OTHERS THEN
        dbms_output.put_line('error: '||sqlcode||' - '||sqlerrm); 
END;

推荐阅读