КОГДА-КНОПКА нажимается триггер необработанное исключение ORA-01407 - PullRequest
1 голос
/ 02 июля 2019

Я новичок в PL SQL и пытаюсь решить проблему с копированием прошлых данных из файла .CVS в базу данных. Я создаю небольшое приложение, которое берет данные из .CVS и передает их в базу данных. Я создаю метод, но после компиляции он пишет Успешно скомпилировано Но когда я запускаю форму, я получаю ошибку

WHEN-BUTTON-PRESSED trigger raise unhendled exception ORA-01407

Кто-нибудь знает, что это значит, так как я гуглюл и ничего не смог найти? Я был бы очень благодарен

declare 
    import_file text_io.file_type; 
  import_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(4);
  p_polica varchar2(20);
  p_banka varchar2 (20);
  p_kontakt varchar2(20);

  kraj_fajla number;

begin
    import_file_name := :Global.Lokacija_prenosa||:import.naziv_fajla||:Global.Ekstenzija_prenosa;
    import_file := text_io.fopen(import_file_name,'r');
    --p_rbr := 100000;

    delete from zivot_trajni_nalog_ponude where banka is not null;
    commit;

    kraj_fajla := 0;  
    while kraj_fajla = 0 loop
        begin   
    text_io.get_line(import_file, linebuf);

     if brojac_redova>=2 then
         if length(linebuf)>100 then 

            p_rbr:=substr(linebuf, 1, instr(linebuf,';',1,1)-1);
            p_polica:=substr(linebuf, instr(linebuf,';',1,1)+1, instr(linebuf,';',1,2) - instr(linebuf,';',1,1)-1);
            p_banka:=substr(linebuf, instr(linebuf,';',1,2)+1, instr(linebuf,';',1,3) - instr(linebuf,';',1,2)-1);
            p_kontakt:=substr(linebuf, instr(linebuf,';',1,3)+1, instr(linebuf,';',1,4) - instr(linebuf,';',1,3)-1);

        select count(*) 
      into vec_importovano 
      from ZIVOT_TRAJNI_NALOG_PONUDE
      where broj_police=p_polica and p_rbr=redni_broj;

        if vec_importovano=0 then
        insert into ZIVOT_TRAJNI_NALOG_PONUDE values(p_rbr, p_polica, p_banka, p_kontakt);          
        commit;
         end if;
         end if;
     end if;

     EXCEPTION WHEN NO_DATA_FOUND THEN kraj_fajla := 1;
     end;

        end loop;  
        update zivot_trajni_nalog_ponude set redni_broj = p_rbr;
            commit;

    text_io.fclose(import_file);
        message('Zavrseno prepisivanje fajla');

end;

Ответы [ 2 ]

2 голосов
/ 02 июля 2019

Полученная ошибка (ORA-01407) означает, что вы пытаетесь обновить столбец (для которого установлено значение NOT NULL) значением NULL.Это не сработает.Например:

SQL> create table test (id number not null);

Table created.

SQL> insert into test (id) values (100);

1 row created.

SQL> update test set id = null;
update test set id = null
                *
ERROR at line 1:
ORA-01407: cannot update ("SCOTT"."TEST"."ID") to NULL


SQL>

Единственный UPDATE в вашем коде таков:

UPDATE zivot_trajni_nalog_ponude SET redni_broj = p_rbr;

Очевидно, p_rbr равен NULL, redni_broj не примет егои вы получили ошибку.

Что делать?Отладьте ваш код и посмотрите, почему p_rbr не имеет значения.Простое «решение» может быть

   IF p_rbr IS NOT NULL
   THEN
      UPDATE zivot_trajni_nalog_ponude
         SET redni_broj = p_rbr;
   END IF;

Кроме того, хотя это и не связано с вашей проблемой: не COMMIT в цикле.

1 голос
/ 02 июля 2019

ORA-01407 происходит, когда вы пытаетесь обновить / вставить столбец в NULL когда столбец не принимает значения NULL.

Чтобы найти все "ненулевые" столбцы в таблице ZIVOT_TRAJNI_NALOG_PONUDE, проверьте DDL таблицы.

...