【问题标题】:how to display the employee number whose data is not found in exception block in oracle plsql如何在oracle plsql的异常块中显示未找到数据的员工编号
【发布时间】:2015-05-04 09:18:53
【问题描述】:
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;
/

注释行中有错误。 我想显示员工编号。怎么做?

【问题讨论】:

  • 你的代码应该继续下一个员工还是像现在一样停止?

标签: oracle plsql


【解决方案1】:

您可以将异常处理程序放在循环中:

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;

【讨论】:

    【解决方案2】:

    您可以简单地声明一个本地 变量 来存储传递的值并将其分配到 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>
    

    【讨论】:

      【解决方案3】:

      你有没有尝试在循环中使用异常块-

         dbms_output.put_line('No data found for employee '||empno(i));
      

      或者你应该声明一个单独的emp.empno%TYPE变量来存储你正在访问的empno。然后它将有助于在异常块中打印值。

      【讨论】:

      • empno(i) 不,您不能在循环范围之外引用迭代器值。会抛出编译错误。
      • 是的,你是对的,它显示错误。我们可以在循环中编写异常块吗??
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-05
      • 2020-04-10
      相关资源
      最近更新 更多