exit when emp_cursor%notfound; 应该是这里异常时代码快已经退出了,并没有运行到捕捉 你换成if emp_cursor%notfound then raise no_data_found;来判断然后再raise就可以捕捉到!
首先你要明白EXCEPTION 要放在END 以后,你可以在BEGIN END 里面再嵌套BEING END
举个例子吧,我测试了一把,嵌套了也是输出不了nodatafound
游标没有数据返回不是异常,不会触发EXCEPTION.不过可以通过获取游标记录数来判断DECLARE CURSOR EMP_CURSOR(DNO VARCHAR2) IS SELECT T.FND_ID, T.FND_VERS FROM TGP_FUNDS T WHERE T.FND_ID = DNO; V_ENAME VARCHAR(10); V_SAL VARCHAR2(10); BEGIN OPEN EMP_CURSOR('MPGF'); LOOP FETCH EMP_CURSOR INTO V_ENAME, V_SAL; EXIT WHEN EMP_CURSOR%NOTFOUND; DBMS_OUTPUT.PUT_LINE(V_ENAME || V_SAL); END LOOP; IF EMP_CURSOR%ROWCOUNT = 0 THEN DBMS_OUTPUT.PUT_LINE('nodatafound'); END IF; CLOSE EMP_CURSOR; END;
应该是这里异常时代码快已经退出了,并没有运行到捕捉
你换成if emp_cursor%notfound then raise no_data_found;来判断然后再raise就可以捕捉到!
CURSOR EMP_CURSOR(DNO VARCHAR2) IS
SELECT T.FND_ID, T.FND_VERS FROM TGP_FUNDS T WHERE T.FND_ID = DNO;
V_ENAME VARCHAR(10);
V_SAL VARCHAR2(10);
BEGIN
OPEN EMP_CURSOR('MPGF');
LOOP
FETCH EMP_CURSOR
INTO V_ENAME, V_SAL;
EXIT WHEN EMP_CURSOR%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(V_ENAME || V_SAL);
END LOOP;
IF EMP_CURSOR%ROWCOUNT = 0 THEN
DBMS_OUTPUT.PUT_LINE('nodatafound');
END IF;
CLOSE EMP_CURSOR;
END;