If statement PL/SQL异常处理

If statement PL/SQL异常处理,if-statement,plsql,exception-handling,If Statement,Plsql,Exception Handling,我使用PL/SQL匿名块根据员工的部门id查找员工。我为此写了一个程序 代码 如何检查departments表中的部门id 注: 在该过程中,有一个输入参数p\u dept\u no作为输入 p\u error\u message是输出参数 我需要检查部门id是否在departments表中,然后记录会自动显示其他信息,它显示异常,因此我需要检查条件如何可能,请提前通知我谢谢。鉴于您已经扫描了该表,您只需在循环内设置一个变量,并在循环外检查其值。 例如: CREATE OR REPLACE

我使用PL/SQL匿名块根据员工的
部门id
查找员工。我为此写了一个程序

代码
  • 如何检查departments表中的
    部门id
注: 在该过程中,有一个输入参数
p\u dept\u no
作为输入
p\u error\u message
是输出参数


我需要检查部门id是否在departments表中,然后记录会自动显示其他信息,它显示异常,因此我需要检查条件如何可能,请提前通知我谢谢。

鉴于您已经扫描了该表,您只需在循环内设置一个变量,并在循环外检查其值。 例如:

CREATE OR REPLACE PROCEDURE find_employees(p_dept_no IN 
NUMBER,p_error_message OUT VARCHAR2)
AS 
    v_dept_no NUMBER;
    dept_chk EXCEPTION;
    vEmployeeFound boolean := false;  -- a boolean variable
CURSOR find_emp 
   IS 
SELECT 
    employee_id,  first_name,  last_name,  salary,  hire_date
FROM    
    employees
WHERE
    department_id = p_dept_no;
BEGIN    

FOR i in find_emp
LOOP
    dbms_output.put_line(i.employee_id);
    dbms_output.put_line(i.first_name);
    dbms_output.put_line(i.last_name);
    dbms_output.put_line(i.salary);
    dbms_output.put_line(i.hire_date);
    vEmployeeFound := true;                   -- set the variable
END LOOP;       

-- Check if the department_id in departments table
IF  NOT vEmployeeFound  THEN -- check the variable value
    RAISE dept_chk;
END IF;

EXCEPTION
    WHEN dept_chk THEN
    p_error_message:='Please enter valid department number';
END find_employees;

我从不喜欢这样的设计,即过程通过成功返回并通过
out
参数传回一些错误消息来处理异常。我认为如果它在没有这样的部门ID时什么也不做,或者正确地失败,那就更好了。在这种情况下,您只需记录已处理的行数,并在
0
时执行某些操作。
CREATE OR REPLACE PROCEDURE find_employees(p_dept_no IN 
NUMBER,p_error_message OUT VARCHAR2)
AS 
    v_dept_no NUMBER;
    dept_chk EXCEPTION;
    vEmployeeFound boolean := false;  -- a boolean variable
CURSOR find_emp 
   IS 
SELECT 
    employee_id,  first_name,  last_name,  salary,  hire_date
FROM    
    employees
WHERE
    department_id = p_dept_no;
BEGIN    

FOR i in find_emp
LOOP
    dbms_output.put_line(i.employee_id);
    dbms_output.put_line(i.first_name);
    dbms_output.put_line(i.last_name);
    dbms_output.put_line(i.salary);
    dbms_output.put_line(i.hire_date);
    vEmployeeFound := true;                   -- set the variable
END LOOP;       

-- Check if the department_id in departments table
IF  NOT vEmployeeFound  THEN -- check the variable value
    RAISE dept_chk;
END IF;

EXCEPTION
    WHEN dept_chk THEN
    p_error_message:='Please enter valid department number';
END find_employees;