2013-05-03 29 views
2

我想写一个存储过程,将有2个异常错误。SQL PL/SQL用户定义多个异常错误处理(空)

Create table Employee 
(emp_num varchar(10) primary key, 
emp_name varchar(10), 
DOB date, 
job_title varchar(15), 
marriage_date date, 
spouseid varchar(10) references Employee(emp_num), 
dept_id varchar(10) references Department(dept_id)); 

正如你所看到的,它是一张有雇员信息的表格。这里有一个递归关系,表示如果配偶也是公司员工(spouseid + marriage_date),则需要提供配偶信息。 我创建了一个存储过程,请求雇员编号并为您提供spouseid,姓名和结婚日期。

CREATE OR REPLACE PROCEDURE DISP_SPOUSE 
(SP_EMP_NUM IN EMPLOYEE.EMP_NUM%TYPE) AS 
SP_NAME EMPLOYEE.EMP_NAME%TYPE; 
SP_SPOUSEID EMPLOYEE.SPOUSEID%TYPE; 
SP_MARRIAGE_DATE EMPLOYEE.MARRIAGE_DATE%TYPE; 

BEGIN 
SELECT SPOUSEID, EMP_NAME, MARRIAGE_DATE 
INTO SP_SPOUSEID, SP_NAME, SP_MARRIAGE_DATE 
FROM EMPLOYEE 
WHERE EMP_NUM = SP_EMP_NUM; 

DBMS_OUTPUT.PUT_LINE ((SP_SPOUSEID)||' '|| 
(SP_NAME)||' '||(SP_MARRIAGE_DATE)); 
EXCEPTION 
WHEN NO_DATA_FOUND THEN 
DBMS_OUTPUT.PUT_LINE('NO EMPLOYEE WITH THAT NUMBER:'||SP_EMP_NUM); 

END; 
/

我还需要添加第二个用户定义的异常,如果没有spouseid,将会引发异常。所以我想是这样的:

DECLARE 
SP_EXCEPTION EXCEPTION; 
PRAGMA EXCEPTION_INIT (SP_EXCEPTION, -20001); 
BEGIN 
RAISE_APPLICATION_ERROR (-20001, 'NO EMPLOYEE SPOUSE'); 
EXCEPTION 
WHEN SP_EXCEPTION 
THEN 
DBMS_OUTPUT.PUT_LINE (SQLERRM); 
END; 
/

,然后添加第二个例外存储过程的代码(后或NO_DATA_FOUND异常之前:

WHEN SPOUSEID IS NULL 
RAISE SP_EXCEPTION; 

end; 
/

我在spouseid = NULL有问题。有编​​写不同的方式?(插入在spouseid一些值确实为空)。

回答

2

没关系我解决了它。

CREATE OR REPLACE PROCEDURE DISP_SPOUSE 
(SP_EMP_NUM IN EMPLOYEE.EMP_NUM%TYPE) AS 
SP_NAME EMPLOYEE.EMP_NAME%TYPE; 
SP_SPOUSEID EMPLOYEE.SPOUSEID%TYPE; 
SP_MARRIAGE_DATE EMPLOYEE.MARRIAGE_DATE%TYPE; 

SP_EXCEPTION EXCEPTION; 


BEGIN 

SELECT SPOUSEID, EMP_NAME, MARRIAGE_DATE 
INTO SP_SPOUSEID, SP_NAME, SP_MARRIAGE_DATE 
FROM EMPLOYEE 
WHERE EMP_NUM = SP_EMP_NUM; 

IF 
SP_SPOUSEID IS NULL THEN 
RAISE SP_EXCEPTION; 


ELSE 
DBMS_OUTPUT.PUT_LINE ((SP_SPOUSEID)||' '|| 
(SP_NAME)||' '||(SP_MARRIAGE_DATE)); 

END IF; 

EXCEPTION 
WHEN NO_DATA_FOUND THEN 
DBMS_OUTPUT.PUT_LINE 
('NO EMPLOYEE WITH THAT NUMBER:'||SP_EMP_NUM); 
WHEN SP_EXCEPTION THEN 
DBMS_OUTPUT.PUT_LINE ('NO SPOUSE AS EMPLOYEE'); 
END; 
/