文章目录
- 背景
- 用法
- 总结
背景
LightDB PLOraSQL存储过程在执行异常时支持通过sqlcode和sqlerrm拿到错误码和错误信息,这点与Oracle是类似的。但是在Oracle中存储过程未执行异常也能获取到错误码和错误信息,而LightDB会找不到对应的变量。因此计划在24.2版本对该行为进行支持。
用法
在非异常块下的sqlcode和sqlerrm访问
BEGINDBMS_OUTPUT.PUT_LINE('sqlcode:' || sqlcode );DBMS_OUTPUT.PUT_LINE('sqlerrm:' || sqlerrm );
END;
/sqlcode:0
sqlerrm:ORA-0000
DO
在非异常块下sqlcode和sqlerrm访问
DECLAREerrcode1 int;errcode2 int;errcode3 int;errcode4 int;errmsg1 varchar(255);errmsg2 varchar(255);errmsg3 varchar(255);errmsg4 varchar(255);
BEGIN DECLAREv_exception1 EXCEPTION;v_exception2 EXCEPTION;PRAGMA EXCEPTION_INIT(v_exception1,-20666);PRAGMA EXCEPTION_INIT(v_exception2,-30666);BEGINRAISE v_exception1;EXCEPTIONWHEN v_exception1 thenBEGINerrcode3 := SQLCODE;errmsg3 := substr(SQLERRM, 1, 255);RAISE v_exception2; EXCEPTIONWHEN v_exception2 thenerrcode4 := SQLCODE;errmsg4 := substr(SQLERRM, 1, 255);END; errcode2 := SQLCODE; errmsg2 := substr(SQLERRM, 1, 255);END;errcode1 := SQLCODE;errmsg1 := substr(SQLERRM, 1, 255);DBMS_OUTPUT.PUT_LINE('errcode1 = ' || errcode1 || ' ' || 'errmsg1 = ' || errmsg1);DBMS_OUTPUT.PUT_LINE('errcode2 = ' || errcode2 || ' ' || 'errmsg2 = ' || errmsg2);DBMS_OUTPUT.PUT_LINE('errcode3 = ' || errcode3 || ' ' || 'errmsg3 = ' || errmsg3);DBMS_OUTPUT.PUT_LINE('errcode4 = ' || errcode4 || ' ' || 'errmsg4 = ' || errmsg4);
END;
/errcode1 = 0 errmsg1 = ORA-0000
errcode2 = -20666 errmsg2 = ORA-20666:
errcode3 = -20666 errmsg3 = ORA-20666:
errcode4 = -30666 errmsg4 = ORA-30666:
DO
总结
异常块内获取的sqlcode和sqlerrm的值为抛出异常对应的错误码和错误信息,非异常块内sqlcode是0,sqlerrm是ORA-0000