如何在oracle plsql的异常块中显示其数据未找到的员工编号
how to display the employee number whose data is not found in exception block in oracle plsql
declare
type empid_list is table of emp.empno%TYPE;
empno empid_list;
job emp.job%type;
empname emp.ename%type;
begin
empno :=empid_list(7839, 7698, 7782, 7499, 7522);
for i in empno.first..empno.last loop
select job, ename into job, empname
from emp
where emp.empno =empno(i);
dbms_output.put_line(
to_char(empno(i)||': '||job||', '||empname)
);
end loop;
EXCEPTION
WHEN NO_DATA_FOUND THEN
--dbms_output.put_line('No data found for employee '||empno);
end;
/
注释行中有错误。
我想显示员工编号。怎么做?
您可以简单地声明一个局部 变量 来存储传递的值并在 FOR 循环 中分配它。因为,您不能在 循环 范围之外引用 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>
Update 如果你想在抛出异常后继续循环,那么你可以 wrap the SELECT BEGIN-EXCEPTION-END 块中的 INTO 语句。
基本上,将异常处理移动到 FOR 循环中。
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>
你试过在循环中使用异常块吗-
dbms_output.put_line('No data found for employee '||empno(i));
否则 您应该声明 emp.empno%TYPE 的单独变量来存储您正在访问的 empno。然后它将有助于在异常块中打印值。
您可以将异常处理程序放在循环中:
BEGIN
empno :=empid_list(7839, 7698, 7782, 7499, 7522);
FOR i IN empno.FIRST..empno.LAST LOOP
BEGIN
SELECT JOB, ename INTO JOB, empname
FROM emp
WHERE emp.empno =empno(i);
DBMS_OUTPUT.PUT_LINE(TO_CHAR(empno(i)||': '||JOB||', '||empname) );
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('No data found for employee '||empno(i));
END;
END LOOP;
END;
declare
type empid_list is table of emp.empno%TYPE;
empno empid_list;
job emp.job%type;
empname emp.ename%type;
begin
empno :=empid_list(7839, 7698, 7782, 7499, 7522);
for i in empno.first..empno.last loop
select job, ename into job, empname
from emp
where emp.empno =empno(i);
dbms_output.put_line(
to_char(empno(i)||': '||job||', '||empname)
);
end loop;
EXCEPTION
WHEN NO_DATA_FOUND THEN
--dbms_output.put_line('No data found for employee '||empno);
end;
/
注释行中有错误。 我想显示员工编号。怎么做?
您可以简单地声明一个局部 变量 来存储传递的值并在 FOR 循环 中分配它。因为,您不能在 循环 范围之外引用 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>
Update 如果你想在抛出异常后继续循环,那么你可以 wrap the SELECT BEGIN-EXCEPTION-END 块中的 INTO 语句。
基本上,将异常处理移动到 FOR 循环中。
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>
你试过在循环中使用异常块吗-
dbms_output.put_line('No data found for employee '||empno(i));
否则 您应该声明 emp.empno%TYPE 的单独变量来存储您正在访问的 empno。然后它将有助于在异常块中打印值。
您可以将异常处理程序放在循环中:
BEGIN
empno :=empid_list(7839, 7698, 7782, 7499, 7522);
FOR i IN empno.FIRST..empno.LAST LOOP
BEGIN
SELECT JOB, ename INTO JOB, empname
FROM emp
WHERE emp.empno =empno(i);
DBMS_OUTPUT.PUT_LINE(TO_CHAR(empno(i)||': '||JOB||', '||empname) );
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('No data found for employee '||empno(i));
END;
END LOOP;
END;