CREATE OR REPLACE PROCEDURE proc_test
(
IN_ATTUID in VARCHAR2,
OUT_USER_DETAILS out SYS_REFCURSOR,
OUT_ERROR_CODE out NUMBER
)
IS
BEGIN
tmpVar := 0;
dbms_output.enable(2000);
DBMS_OUTPUT.Put_Line('PUT a 2000 BYTE CHARACTER HERE');
dbms_output.put_line('1');
OUT_ERROR_CODE := NULL;
open OUT_USER_DETAILS for select * from t_roles;
DBMS_OUTPUT.Put_Line('OUT_ERROR_CODE' || OUT_ERROR_CODE);
commit;
EXCEPTION
WHEN NO_DATA_FOUND THEN
NULL;
WHEN OTHERS THEN
-- Consider logging the error and then re-raise
DBMS_OUTPUT.Put_Line('OUT_ERROR_CODE' || OUT_ERROR_CODE);
--OUT_ERROR_CODE := SQLCODE;
DBMS_OUTPUT.Put_Line('OUT_ERROR_CODE' || SQLCODE);
DBMS_OUTPUT.Put_Line('OUT_ERROR_CODE' || SUBSTR(SQLERRM, 1, 800));
--RAISE;
END proc_test;
当 PROC 溢出 DBMS 缓冲区并且有一个 SYS REFCURSOR 作为 OUT 参数而不是缓冲区溢出异常时,将向 Web 服务抛出语句句柄未执行异常。以上是得出这个结论的一个小测试。