oracle - 如何捕捉执行立即(开放)的错误?
问题描述
我有这个程序:
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 操作重试解析
我的问题是:如何捕获该错误?
解决方案
您不能将对象名称(例如游标名称)和变量名称绑定到动态 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;
推荐阅读
- html - 如何隐藏div边界之外的元素
- c++ - 如何插入十六进制值并发送到串口?
- azure - 从 Azure AD 目录中删除自我后 myapps.microsoft.com 无限循环
- c - FILE结构中的`_flag`有什么意义?
- python - 作为方法/函数的类属性有什么用
- tensorflow - Tensorflow:加载_clustering_ops.so时出现JRE致命错误(SIGILL(0x4))
- python - 当使用 read_csv 我得到 sre_constants.error: nothing to repeat at position 0
- python - 在多列熊猫上应用 lambda 行
- angular - 将参数传递给 withLatestFrom 函数
- python - 将 txt 元素连接到 Python 中提到的文件