通过程序块向scott.emp表中插入一条新记录,在执行的过程中捕获系统预定义异常(主键不能重复)、系统非预定义异常(主键为空)、用户自定义异常(工资不能大于10000),并分别作相应的处理。
时间: 2023-05-28 21:07:49 浏览: 93
以下是一个可能的解决方案:
```
DECLARE
v_empno scott.emp.empno%TYPE := 9999; -- 假设这是一个新的唯一主键
v_ename scott.emp.ename%TYPE := 'John';
v_job scott.emp.job%TYPE := 'Manager';
v_mgr scott.emp.mgr%TYPE := 7839;
v_hiredate scott.emp.hiredate%TYPE := SYSDATE;
v_sal scott.emp.sal%TYPE := 12000;
v_comm scott.emp.comm%TYPE := NULL;
v_deptno scott.emp.deptno%TYPE := 10;
BEGIN
INSERT INTO scott.emp (empno, ename, job, mgr, hiredate, sal, comm, deptno)
VALUES (v_empno, v_ename, v_job, v_mgr, v_hiredate, v_sal, v_comm, v_deptno);
COMMIT;
EXCEPTION
-- 捕获主键冲突异常
WHEN DUP_VAL_ON_INDEX THEN
DBMS_OUTPUT.PUT_LINE('Error: Duplicate primary key value');
-- 捕获主键为空异常
WHEN OTHERS THEN
IF SQLERRM LIKE '%ORA-01400%' THEN
DBMS_OUTPUT.PUT_LINE('Error: Primary key value cannot be null');
ELSE
-- 捕获用户自定义异常
IF v_sal > 10000 THEN
DBMS_OUTPUT.PUT_LINE('Error: Salary cannot be greater than 10000');
ELSE
DBMS_OUTPUT.PUT_LINE('Error: ' || SQLERRM);
END IF;
END IF;
END;
```
注释已经解释了每个部分的作用。我们首先声明需要插入的字段和值,然后执行插入操作。在异常处理部分,我们先捕获主键冲突异常,再判断是否是主键为空异常,最后判断是否是用户自定义异常(即工资过高)。如果没有任何异常抛出,我们就提交更改。注意,这个程序块只能插入一条记录,因为主键是唯一的。如果需要插入多条记录,需要使用循环或其他方式。
阅读全文