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 异常处理的主要内容,如果未能解决你的问题,请参考以下文章