Exception handling SQL PL/SQL用户定义的多个异常错误处理(null)

Exception handling SQL PL/SQL用户定义的多个异常错误处理(null),exception-handling,plsql,argumentnullexception,Exception Handling,Plsql,Argumentnullexception,我正在尝试编写一个将有2个异常错误的存储过程 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(d

我正在尝试编写一个将有2个异常错误的存储过程

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));
如您所见,这是一个包含员工信息的表。这里有一个递归关系,表示如果配偶也是公司的员工,您需要提供配偶信息(配偶ID+结婚日期)。 我创建了一个存储过程,它要求输入员工编号,并提供配偶ID、姓名和结婚日期

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;
/
我还需要添加第二个用户定义的异常,如果没有spooseid,将引发该异常。所以我在想这样的事情:

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;
/
然后将第二个异常添加到存储过程代码中(在未找到数据异常之后或之前):

WHEN SPOUSEID IS NULL
RAISE SP_EXCEPTION;

end;
/
我在spooseid=null上遇到问题。是否有其他写入方法?(插入到spooseid中的某些值确实为null)。

我解决了这个问题

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;
/