按下按钮时触发器引发未处理的异常 ora-01401
Posted
技术标签:
【中文标题】按下按钮时触发器引发未处理的异常 ora-01401【英文标题】:when button pressed trigger raised unhandled exception ora-01401 【发布时间】:2019-07-09 10:07:43 【问题描述】:我正在尝试将 .CSV 中的数据插入Oracle db
一切正常,但几秒钟后我得到错误
when button pressed trigger raised unhandled exception ora-01401
我有大约1200 records
可以插入,当我签入数据库时,我看到只在630 record
左右插入。
declare
import_file text_io.file_type;
export_file text_io.file_type;
import_file_name varchar2(1000);
export_file_name varchar2(1000);
import_log_file text_io.file_type;
import_log_file_name varchar2(1000);
vec_importovano number;
brojac number;
brojac_redova number;
linebuf varchar2(5000);
p_rbr VARCHAR2(30);
p_polica VARCHAR2(30);
p_banka VARCHAR2(20);
p_kontakt VARCHAR2(30);
kraj_fajla number;
begin
brojac_redova:=0;
p_rbr:=100001;
import_file_name := :Global.Lokacija_prenosa||:import.naziv_fajla||:Global.Ekstenzija_prenosa;
import_file := text_io.fopen(import_file_name,'r');
delete from zivot_trajni_nalog_ponude where banka is not null;
commit;
kraj_fajla := 0;
while kraj_fajla = 0 loop
begin
brojac_redova:=brojac_redova+1;
p_rbr:=p_rbr+1;
text_io.get_line(import_file, linebuf);
if brojac_redova >= 2 then
p_polica:=substr(linebuf, 1, instr(linebuf,';',1,1)-1);
-- message(p_polica);
p_kontakt:=substr(linebuf, instr(linebuf,';',1,1)+1, instr(linebuf,';',1,2) - instr(linebuf,';',1,1)-1);
-- message(p_kontakt);
if instr(linebuf,';',1,3) > 0 then
p_banka := substr(linebuf,
instr(linebuf,';',1, 2) + 1,
instr(linebuf,';',1,3) - instr(linebuf,';',1,2)-1);
--message(p_banka);
else
p_banka := substr(linebuf,
instr(linebuf,';',1, 2) + 1);
--message(p_banka);
end if;
-- IF p_rbr is not null then
insert into ZIVOT_TRAJNI_NALOG_PONUDE
(BROJ_POLICE,REDNI_BROJ,BROJ_PONUDE,BANKA)
values(
p_polica,
p_rbr,
p_kontakt,
p_banka);
commit;
end if;
-- end if;
EXCEPTION WHEN NO_DATA_FOUND THEN kraj_fajla := 1;
end;
end loop;
if p_rbr is not null then
update zivot_trajni_nalog_ponude set redni_broj=rownum;
end if;
text_io.fclose(import_file);
message('Zavrseno prepisivanje fajla');
end;
到目前为止我所做的,我增加了缓冲区大小并增加了数据库中的数据,但同样的问题。
这是无法插入数据库的数据。所以它停在这里并显示错误。
4555219;773017/1;S-PREMIUM BA
4555220;1862014551963592;ZIR
4555223;1861814551965445;ZIR
4555224;1861634551963417;ZIR
4555226;234011;PBS
4555230;1862614551947169;ZIR
4555231;1862814551965880;ZIR
4555237;234002/1;PBS
4555238;233817/1;PBS
4555239;233982;PBS
4555240;233422;PBS
4555242;233820;PBS
4555243;1861614551961478;ZIR
4555244;1861824551967142;ZIR
4555246;1861644551966181;ZIR
4555247;1861214551966542;ZIR
4555248;1861814551967773;ZIR
4555249;1862224521502138;ZIR
4555250;1861224551967075;ZIR
4555251;1862214551967462;ZIR
4555252;1863214551968285;ZIR
4555253;1863414551943831;ZIR
4555254;1863414551966238;ZIR
4555254;1863414551966238;ZIR
4555255;1863414551962746;ZIR
4555256;107160825;NLB
4555257;107161767;NLB
4555258;107158740;NLB
4555259;107162747;NLB
4555260;107162658;NLB
4555261;107157891;NLB
【问题讨论】:
【参考方案1】:尝试在循环开始时清空linebuf
while kraj_fajla = 0
loop
begin
linebuf := null;
在每次重复填充该变量的值之前。
顺便说一下,局部变量 (p_banka
) 的长度 (20
) 可能不足以返回值。您可以尝试增加如150
。
【讨论】:
不,问题出在 .CSV 文件中 一列包含如下数据:代理列中的 S-PROMO BA 在我更改后它完美运行 它停在这里:4555219;773017/1;S-PREMIUM BA 这部分有问题:S-PREMIUM BA @Robby 也许,你可能有回车(chr(13))或换行符(chr(10))。对此,您可以使用replace(linebuf,to_char(13),'')
和/或replace(linebuf,to_char(10),'')
。
我尝试在第三列中添加类似 p_banka := substr(linebuf,instr(linebuf,';',1, 2) + 1), p_banka := substr(linebuf,instr(linebuf ,'-',1, 2) + 1);但不起作用
@Robby 当您在这些作业之前添加 message( length( substr(linebuf,instr(linebuf,'-',1, 2) + 1) ) );
时会收到什么消息。【参考方案2】:
@ 检查所有列的长度,此错误是在插入字符串的记录长度(来自 csv 文件)大于表列宽度时
【讨论】:
您是指 .CSV 中的列还是数据库中的列? CSV 中的列长度大于 DB 中的同一列以上是关于按下按钮时触发器引发未处理的异常 ora-01401的主要内容,如果未能解决你的问题,请参考以下文章
WHEN-BUTTON-PRESSED 触发器引发未处理的异常 ORA-01400
当我按下一个按钮时我的游戏崩溃了(以 NSException 类型的未捕获异常终止)
Visual Studio 2013 未引发用户未处理的异常
使用 Graphics.GetHdc 时,System.Drawing.dll 引发了“System.ArgumentException”类型的未处理异常