【问题标题】:No data found in PL/SQL在 PL/SQL 中找不到数据
【发布时间】:2011-09-21 03:55:05
【问题描述】:

我试图让一个没有经理的员工出现在我的桌子上,但是当我知道数据库中存在这样的员工时,我得到的只是“找不到数据”。

这是我的代码:

ACCEPT p_1 PROMPT 'Please Enter Employee ID:'

declare 
  v_eid               employee.employee_id%TYPE := &p_1;
  v_count             NUMBER;
  v_name              employee.employee_name%TYPE;
  v_sal               employee.salary%type;
  v_mname             employee.employee_id%TYPE ;
  v_dptname           department.department_name%type;  
  v_avg               employee.salary%type;

BEGIN 
  SELECT count(*)
  INTO v_count
  FROM employee
  WHERE employee_id = v_eid;

  IF v_count = 0 THEN
      DBMS_OUTPUT.PUT_LINE(v_eid || ' is not in the table.');
  ELSE
      select e1.employee_name, e1.salary, department.department_name,
             nvl(e2.employee_name, 0)
      into v_name, v_sal, v_mname, v_dptname
      from employee e1
      inner join employee e2 on e1.manager_id = e2.employee_id 
      inner join department on e1.department_id = department.department_id
      where e1.employee_id = v_eid;

      select AVG(salary)
      into v_avg
      from employee
      where department_id = (select department_id 
                              from employee 
                              where employee_id=v_eid);
        DBMS_OUTPUT.PUT_LINE('Name:'|| LPAD(v_name,30));
        DBMS_OUTPUT.PUT_LINE('Salary:'|| LPAD(to_char(v_sal,'$9,999.00'),28));
        DBMS_OUTPUT.PUT_LINE('Manager Name:'|| LPAD(v_mname, 19));
        DBMS_OUTPUT.PUT_LINE('Department Name:'|| v_dptname);
        DBMS_OUTPUT.PUT_LINE('Department Average'|| to_char(v_avg,'$9,999.00'));
  END IF;
END;

感谢您的帮助

【问题讨论】:

    标签: sql oracle plsql oracle11g


    【解决方案1】:

    嗨,如果您只寻找没有经理的员工,为什么要进行自我加入。无论如何,如果不存在经理,您应该更换

    from employee e1 inner join employee e2 on e1.manager_id = e2.employee_id 
    
    by
    
    from employee e1 left outer join employee e2 on e1.manager_id = e2.employee_id 
    

    【讨论】:

    • 我正在寻找一般的员工。如果员工没有经理,我希望能够看到它。第一部分检查员工,第二部分检查我有两个案例的信息。他们要么有 mngr,要么没有
    【解决方案2】:

    一般来说,不要先检查记录是否存在,而只是进行查询。如果此时记录不存在,则捕获异常。

    begin
       select...
    
    exception
       when no_data_found then
          xyz is not in the table
    end;
    

    这样更好,因为您只查询一次。此外,至少在理论上,该记录可能会在您的检查和第二次查询之间被删除。所以你仍然需要你的异常处理程序。

    【讨论】:

    • 我不允许在这个上使用例外,这就是为什么
    猜你喜欢
    • 2016-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-09
    • 1970-01-01
    • 2014-03-30
    • 2013-12-27
    • 2016-04-03
    相关资源
    最近更新 更多