您可以简单地声明一个本地 变量 来存储传递的值并将其分配到 FOR LOOP 中。因为,您不能在 循环范围之外引用 iterator 值。
例如,
SQL> set serveroutput on
SQL> DECLARE
2 TYPE empid_list IS TABLE OF emp.empno%TYPE;
3 empno empid_list;
4 job emp.job%type;
5 empname emp.ename%TYPE;
6 v_empno emp.empno%TYPE; --> Added a variable
7 BEGIN
8 empno :=empid_list(7369,9999);
9 FOR i IN empno.first..empno.last
10 LOOP
11 v_empno := empno(i);
12 SELECT job, ename INTO job, empname FROM emp WHERE emp.empno =empno(i);
13 dbms_output.put_line( TO_CHAR(empno(i)||': '||job||', '||empname) );
14 END LOOP;
15 EXCEPTION
16 WHEN NO_DATA_FOUND THEN
17 dbms_output.put_line('No data found for employee '||v_empno); --> Use the variable
18 END;
19 /
7369: CLERK, SMITH
No data found for employee 9999
PL/SQL procedure successfully completed.
SQL>
更新如果您想在引发异常后继续循环,那么您可以在 SELECT INTO 语句中包装 SELECT INTO strong>BEGIN-EXCEPTION-END 块。
基本上,将 EXCEPTION 处理移到 FOR LOOP 内。
SQL> DECLARE
2 TYPE empid_list IS TABLE OF emp.empno%TYPE;
3 empno empid_list;
4 job emp.job%type;
5 empname emp.ename%TYPE;
6 BEGIN
7 empno :=empid_list(9999, 7222,7369);
8 FOR i IN empno.first..empno.last
9 LOOP
10 BEGIN
11 SELECT JOB, ename INTO JOB, empname FROM emp WHERE emp.empno =empno(i);
12 dbms_output.put_line( TO_CHAR(empno(i)||': '||JOB||', '||empname) );
13 EXCEPTION
14 WHEN NO_DATA_FOUND THEN
15 dbms_output.put_line('No data found for employee '||empno(i));
16 END;
17
18 END LOOP;
19 END;
20 /
No data found for employee 9999
No data found for employee 7222
7369: CLERK, SMITH
PL/SQL procedure successfully completed.
SQL>