PNO IN (7771,7772,7773);
?
实验准备基本上完成了,利用工具我们看一下每张表的数据情况。



(2)、编写存储过程
下面我们利用cursor来实现对数据单条查询,然后单条插入的目的。
CREATE OR REPLACE PROCEDURE PD_CESHI IS
v_ErrorCode NUMBER; -- 错误代码
v_ErrorText VARCHAR2(4000); -- 错误信息
cursor c1 is
SELECT
a.EMPNO,
a.ENAME,
a.JOB,
a.MGR,
a.HIREDATE,
a.SAL,
a.COMM,
a.DEPTNO
FROM EMP a,EMP_2 b where a.empno=b.empno;
BEGIN
For te in c1 loop
begin
insert into EMP_3(
EMPNO,
ENAME,
JOB,
MGR,
HIREDATE,
SAL,
COMM,
DEPTNO
)
values(
te.EMPNO,
te.ENAME,
te.JOB,
te.MGR,
te.HIREDATE,
te.SAL,
te.COMM,
te.DEPTNO
);
EXCEPTION
WHEN NO_DATA_FOUND THEN
NULL;
WHEN OTHERS THEN
v_ErrorCode := SQLCODE;
v_ErrorText := SQLERRM;
/** 记录异常数据及错误信息 **/
insert into error_log(ID,TABLE_NAME,ERROR_ID,ERROR_CODE,ERROR_TEXT,CREATE_DATE) values(sys_guid(),'EMP_2',te.EMPNO,v_ErrorCode,v_ErrorText,sysdate);
end;
End loop;
commit;
/** 异常处理 过程异常**/
EXCEPTION
WHEN NO_DATA_FOUND THEN
NULL;
WHEN OTHERS THEN
v_ErrorCode := SQLCODE;
v_ErrorText := SQLERRM;
/** 记录异常数据及错误信息 **/
insert into error_log (ID,TABLE_NAME,ERROR_ID,ERROR_CODE,ERROR_TEXT,CREATE_DATE) values(sys_guid(),'EMP_OBJECT','',v_ErrorCode,v_ErrorText,sysdate);
END PD_CESHI;
创建一个记录错误日志的表:
create table ERROR_LOG
(
id VARCHAR2(32),
table_name VARCHAR2(100),
error_id VARCHAR2(100),
error_code VARCHAR2(100),
error_text VARCHAR2(4000),
create_date DATE default sysdate
);
(3)、开始实验
利用PL/SQL Developer工具完成存储过程的创建,我们下面来执行这个存储过程,如下:

完成后,我们来看一下目标表里的数据,如下:

看到以上的结果数据,我们已经把数据以遍历的形式插入到了我们的目标表里了。
如果这么说不具说服力,我们需要再进一步验证一下是否是单条插入的话。这里我们可以有这么个思路,如果这个是实现单条插入的,那么也就意味着如果中途有某条数据出现问题,将不会影响到其余数据的插入,因为这是以单条为单位插入的嘛~~
来验证一下。
(4)、模拟错误处理
TRUNCATE TABLE EMP_3;
SELECT * FROM EMP_3;

制造问题数据:
alter table EMP modify deptno NUMBER(6);
?
修改数据:
我们利用PL/SQL Developer工具把empno为7788的deptno由20修改为209999。这样的话,当我们插入到目标表中时,就会由于字段长度抛出一个错误来。

我们执行一下存储过程,如下:

存储过程执行完毕后,我们可以预见到7788的那条数据应该没有了,而其它的13条数据应该是可以正常插入的。我们来验证一下,如下:

可以看到结果中没有empno为7788的数据。
到错误记录日志表里看一下,如下:

我们可以看到,错误记录已经被记录到日志表里,抛出的1438错误(ORA-01438: 值大于为此列指定的允许精度)。
通过这种方式,我们从侧面也可以了解到,单条数据插入时,错误被抛出,不影响其它的数据插入。
实验完毕。
小实验,随手记之。