WHEN-BUTTON-PRESSED 触发器引发未处理的异常 ORA-01407
WHEN-BUTTON-PRESSED trigger raise unhendled exception ORA-01407
我是 PL SQL
的新手,我正在尝试解决将数据从 .CVS 文件复制到数据库的问题
我创建了一个小型应用程序,它将从 .CVS
获取数据并将其传递到数据库。
我创建了一个方法,但是在我编译之后它被写入成功编译
但是当我 运行 表单时我得到错误
WHEN-BUTTON-PRESSED trigger raise unhendled exception ORA-01407
有谁知道这是什么意思,因为我 google 它找不到任何东西?
非常感谢
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;
ORA-01407 occurs as you are trying to update/Insert a column to NULL
when the column does not accept NULL values.
要查找 table ZIVOT_TRAJNI_NALOG_PONUDE
中的所有 "not null" 列,请检查 table.
的 DDL
您遇到的错误 (ORA-01407
) 表示您正在尝试使用 NULL
值更新列(设置为 NOT 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
没有值。一个简单的 "solution" 可能是
IF p_rbr IS NOT NULL
THEN
UPDATE zivot_trajni_nalog_ponude
SET redni_broj = p_rbr;
END IF;
此外,尽管与您的问题无关:不要 COMMIT
在循环中。
我是 PL SQL
的新手,我正在尝试解决将数据从 .CVS 文件复制到数据库的问题
我创建了一个小型应用程序,它将从 .CVS
获取数据并将其传递到数据库。
我创建了一个方法,但是在我编译之后它被写入成功编译
但是当我 运行 表单时我得到错误
WHEN-BUTTON-PRESSED trigger raise unhendled exception ORA-01407
有谁知道这是什么意思,因为我 google 它找不到任何东西? 非常感谢
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;
ORA-01407 occurs as you are trying to update/Insert a column to NULL when the column does not accept NULL values.
要查找 table ZIVOT_TRAJNI_NALOG_PONUDE
中的所有 "not null" 列,请检查 table.
您遇到的错误 (ORA-01407
) 表示您正在尝试使用 NULL
值更新列(设置为 NOT 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
没有值。一个简单的 "solution" 可能是
IF p_rbr IS NOT NULL
THEN
UPDATE zivot_trajni_nalog_ponude
SET redni_broj = p_rbr;
END IF;
此外,尽管与您的问题无关:不要 COMMIT
在循环中。