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