Вы просматриваете список строк:
BEGIN
FOR j IN (SELECT * -- fake table with no rows
FROM DUAL
WHERE 1 = 2)
LOOP
DBMS_OUTPUT.put_line ('work, work..'); -- this won't happen
END LOOP;
END;
Если у вас нет строк, вы ничего не просматриваете.
Вы можете использовать sql%notfound
для выбора в:
DECLARE
v_tmp NUMBER;
BEGIN
SELECT col1
INTO v_tmp
FROM (SELECT 1 col1 FROM DUAL -- select nothing from a fake table
UNION ALL
SELECT 2 col1
FROM DUAL
WHERE 1 = 2 -- change to 1=1 to get a too-many-rows exception
);
EXCEPTION
WHEN OTHERS
THEN
IF (SQL%NOTFOUND)
THEN
DBMS_OUTPUT.put_line ('I didn''t find anything..');
ELSE
DBMS_OUTPUT.put_line ('We have some other exception..');
END IF;
END;
Возможно, вы решили установить флаг и проверить его после внутреннего цикла:
DECLARE
CURSOR c1
IS
SELECT * FROM dept;
CURSOR c2 (p_deptno NUMBER)
IS
SELECT *
FROM emp
WHERE deptno = p_deptno;
v_found BOOLEAN;
BEGIN
FOR i IN c1
LOOP
v_found := FALSE; -- will be set when we find something..
FOR j IN c2 (i.deptno)
LOOP
v_found := TRUE; -- we found something!
DBMS_OUTPUT.put_line (
i.deptno || ' ' || j.empno || ' ' || j.ename);
END LOOP;
IF (NOT v_found) -- check if we did find i.deptno
THEN
DBMS_OUTPUT.put_line (
'Employee doesnt exist with deartment id' || i.deptno);
END IF;
END LOOP;
END;