PL/SQL 异常处理

Posted

技术标签:

【中文标题】PL/SQL 异常处理【英文标题】:PL/SQL exception-handling 【发布时间】:2018-05-28 09:41:44 【问题描述】:

我有 PL/SQL 匿名块可用于根据 department_id 查找员工。我为此写了一个程序。

代码

CREATE OR REPLACE PROCEDURE find_employees (
    p_dept_no         IN     NUMBER,
    p_error_message      OUT VARCHAR2)
AS
    v_dept_no   NUMBER;
    dept_chk    EXCEPTION;

    CURSOR find_emp
    IS
        SELECT employee_id,
               first_name,
               last_name,
               salary,
               hire_date
          FROM employees
         WHERE department_id = p_dept_no;
BEGIN
    -- Check if the department_id in departments table
    IF Condition
    THEN                                --Need to check the condition here
        RAISE dept_chk;
    END IF;

    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);
    END LOOP;
EXCEPTION
    WHEN dept_chk
    THEN
        p_error_message := 'Please enter valid department number';
END find_employees;
如何检查部门表中的department_id

注意:

在该过程中,有一个输入参数 p_dept_no 作为 INPUT p_error_message 是输出参数。

我需要检查department_id 是否在departments 表中,然后记录会自动显示,否则它会显示异常,所以我需要检查条件如何让我知道提前谢谢。

【问题讨论】:

我从不热衷于程序通过成功返回并通过out 参数传回一些错误消息来处理异常的设计。我认为如果没有这样的部门ID时它什么都不做,或者正确失败会更好。在这种情况下,您可以只计算已处理的行数,如果是 0,则执行一些操作。 【参考方案1】:

鉴于您已经扫描了表,您可以简单地在循环内设置一个变量并在外部检查它的值。 例如:

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;

【讨论】:

以上是关于PL/SQL 异常处理的主要内容,如果未能解决你的问题,请参考以下文章

PL\SQL 函数之间的异常处理

PL/SQL 异常处理

PL/SQL 异常处理

处理过程 PL/SQL 的异常

PL/SQL系统定义的异常操作实例讲解

Oracle的PL_SQL的异常处理