按下按钮时触发器引发未处理的异常 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 类型的未捕获异常终止)

如何停止在 C# 类中运行的计时器

Visual Studio 2013 未引发用户未处理的异常

使用 Graphics.GetHdc 时,System.Drawing.dll 引发了“System.ArgumentException”类型的未处理异常