PRO*C批插入引起错误ORA-01403(200分)

  • 主题发起人 主题发起人 icezhp
  • 开始时间 开始时间
I

icezhp

Unregistered / Unconfirmed
GUEST, unregistred user!
我在开发一个ORACLE应用系统,客户端采用PRO*C编写,由于插入数据流量大,因此使用批插入,如下:
exec sql for :n insert into TABLE1 values (:pTableRecord);
exec sql commit;
一次插入n条记录,客户端没有其它的数据库操作,但是有这样一个问题,有的时候(其它的应用客户端
在对数据库进行查询),PROC客户端会报错ORA-01403:未找到数据,不知是什么意思?而且经过测试,
发现这个错误会造成插入数据的丢失,百思不得其解,请诸位大虾指点迷津!!
 
还不是很清楚你的问题:
1、一客户端在用批插入,此时另一客户端查询,用批插入的客户端会报NO_DATA_FOUND?
2、一客户端在用批插入,此时另一客户端查询,查询的客户端会报NO_DATA_FOUND?
>这个错误会造成插入数据的丢失
好象是1,但此时你执行的是Insert语句,应该来说只有用select .. into才会有NO_DATA_FOUND
的exception的啊。你说说:pTableRecord是怎么来的? 是不是要从其他表select into过来?
2的错误应该也不可能,因为这是两个不同的事务,1的操作不会影响到2的结果。
 
问题说明:
(1)出现ORA-01403错误的是PRO*C插入客户端
(2)pTableRecord是一个指向结构数组的指针,原始数据从TCP/IP接收下来填写到结构数组中,
不是从数据库中得到的。
(3)关于数据的丢失是这样测试的:
PRO*C客户端从TCP/IP收下的报文中有一个唯一的序号,而且是单调连续递增的。在数据库中
做了一个触发器,在PRO*C客户端插入时触发,并把当前序号保存到一个临时表中,如果发现
序号不连续,就把不连续的序号写到一个结果表中,由于源数据从TCP/IP过来是肯定连续的,
而且在使用PRO*C插库时,也进行了检验,证明是连续的,但经过一段时间测试后,发现如下现象:
1.触发器结果表中有序号不连续的记录
2.PRO*C客户端有ORA-01403错误,
所以推测是ORA-01403造成了部分数据记录没有插入数据库。但原因是什么,却找不到答案。
 
1、Insert应该来说是不会raise ORA-01403的,所以疑点在你的触发器上, 你把触发器代码
用下面的代码封装起来:
begin
-- 你的代码
exception
when NO_DATA_FOUND then
RecordNoDataFoundError(sqlerrm);
end;
其中RecordNoDataFoundError过程由下面的代码创建(注意,只对Oracle8i以上有效)
create or replace procedure RecordNoDataFoundError(p_ErrorMsg varchar2) is
pragma autonomous_transaction;
begin
insert into 错误日志(错误信息) values(p_ErrorMsg);
commit;
exception
when others then
rollback;
end RecordNoDataFoundError;
再运行你的测试,过一段时间看看错误日志表里是否有错误信息,如果有的话,就是触发器
报的错了。
插入过程中报了错,所以插入数据失败,当然会有记录丢失了。
 
问题说明:
我的触发器脚本如下:
drop table table1;
create table table1(t number(20));
insert into table1 values(0);
drop table result_seq;
create table result_seq(first number,last number,current_time date);
drop table result_log;
create table result_log(logDescr varchar2(64));

create or replace procedure RecordNoDataFoundError(p_ErrorMsg varchar2) is
pragma autonomous_transaction;
begin
insert into result_log(logDescr) values(p_ErrorMsg);
commit;
exception
when others then
rollback;
end RecordNoDataFoundError;

DROP TRIGGER seq_number;
create or replace trigger seq_number
after insert on tab_trunkcall
for each row
declare
v_SEQ table1.t%type;
begin
select table1.t
into v_SEQ
from table1;
if (:new.SEQUENCE_NUMBER-1)!=v_SEQ then
insert into result_seq(first,last,current_time) values(v_seq,:new.SEQUENCE_NUMBER,:new.iamtime);
end if;
update table1 set t= :new.SEQUENCE_NUMBER;
exception
when others then
RecordNoDataFoundError(sqlerrm);
end;

其中:
表table1中存放最新的序列号。
表result_seq中存放序号的不连续记录。
表result_log中存放触发器中出现的错误描述。
经过测试,现象依旧:
1.触发器结果表中有序号不连续的记录
2.PRO*C客户端显示有ORA-01403错误。

ORA-01403是否只有在SELECT时才出现吗?
 
只在select..into才触发
result_log有记录表示触发器里的select into语句选不到记录
你查查是什么原因。
PRO*C客户端还会有错误信息就比较奇怪了,因为触发器里此时不报错了
难道还有其他代码?
你重点查查所有select ..into语句。
 
后退
顶部