如何解决oracle 数据库 - 插入具有唯一键约束的表显示当值实际重复时插入 1 行 - 发生在函数中
我创建了一个简单的表格,其中包含 2 列 col1 是一个数字,col2 是一封电子邮件。 Col1 是一个 pk 并通过一个序列填充,我对 col2 有一个唯一的键约束。代码看起来像这样。
CREATE TABLE "LISTOFPEOPLETOVIEWPAGE5"
( "PKCOL" NUMBER NOT NULL ENABLE,"EMAIL" VARCHAR2(100),CONSTRAINT "LISTOFPEOPLETOVIEWPAGE5_PK" PRIMARY KEY ("PKCOL")
USING INDEX ENABLE,CONSTRAINT "UNIQUE_EMAIL" UNIQUE ("EMAIL")
USING INDEX ENABLE
)
/
CREATE OR REPLACE EDITIONABLE TRIGGER "BI_LISTOFPEOPLETOVIEWPAGE5"
before insert on "LISTOFPEOPLETOVIEWPAGE5"
for each row
begin
if :NEW."PKCOL" is null then
select "LISTOFPEOPLETOVIEWPAGE5_SEQ1".nextval into :NEW."PKCOL" from sys.dual;
end if;
end;
/
ALTER TRIGGER "BI_LISTOFPEOPLETOVIEWPAGE5" ENABLE
/
我在这个表中插入了一个电子邮件 ID,比如 abc@def.com,然后就成功了。
Insert into LISTOFPEOPLETOVIEWPAGE5 (email) values (abc@def.com);
1 row(s) inserted.
我有一个函数,它会要求用户提供电子邮件 ID 并将其存储在绑定变量中。此函数检查绑定变量中的值是否已存在于表中。如果是,如果绑定变量值不在数据库中,则输出“电子邮件已存在”,将该值插入表中。
当我运行这个函数并向绑定变量提供任何现有的电子邮件时,我看到的结果如下: 电子邮件已经存在 已插入 1 行。
代码如下:
declare
v_email varchar2(100);
begin
BEGIN
select email into v_email from LISTOFPEOPLETOVIEWPAGE5 where email = :EMAIL;
EXCEPTION
WHEN NO_DATA_FOUND THEN
v_email := null;
END;
if (v_email is null) then
Insert into LISTOFPEOPLETOVIEWPAGE5 (email) values (:EMAIL);
else
dbms_output.put_line('email already exists');
end if;
end;
output of this function is :
email already exists
1 row(s) inserted.
请帮助我在这个函数中哪里出错了。为什么我看到插入了 1 行?我期望得到唯一的密钥违规错误。
提前致谢。
解决方法
我重新创建了您的测试用例,但无法重现您所说的内容。
示例表、序列和触发器:
SQL> CREATE TABLE "LISTOFPEOPLETOVIEWPAGE5"
2 ( "PKCOL" NUMBER NOT NULL ENABLE,3 "EMAIL" VARCHAR2(100),4 CONSTRAINT "LISTOFPEOPLETOVIEWPAGE5_PK" PRIMARY KEY ("PKCOL")
5 USING INDEX ENABLE,6 CONSTRAINT "UNIQUE_EMAIL" UNIQUE ("EMAIL")
7 USING INDEX ENABLE
8 )
9 /
Table created.
SQL> create sequence LISTOFPEOPLETOVIEWPAGE5_SEQ1;
Sequence created.
SQL> CREATE OR REPLACE TRIGGER "BI_LISTOFPEOPLETOVIEWPAGE5"
2 before insert on "LISTOFPEOPLETOVIEWPAGE5"
3 for each row
4 begin
5 if :NEW."PKCOL" is null then
6 select "LISTOFPEOPLETOVIEWPAGE5_SEQ1".nextval into :NEW."PKCOL" from sys.dual;
7 end if;
8 end;
9 /
Trigger created.
SQL> Insert into LISTOFPEOPLETOVIEWPAGE5 (email) values ('abc@def.com');
1 row created.
匿名 PL/SQL 块(我使用 SQL*Plus 并将 :EMAIL
更改为 '&&EMAIL'
,但这不会影响您报告的问题):
SQL> declare
2 v_email varchar2(100);
3 begin
4 BEGIN
5 select email into v_email from LISTOFPEOPLETOVIEWPAGE5 where email = '&&EMAIL';
6 EXCEPTION
7 WHEN NO_DATA_FOUND THEN
8 v_email := null;
9 END;
10
11 if (v_email is null) then
12 Insert into LISTOFPEOPLETOVIEWPAGE5 (email) values ('&&EMAIL');
13 else
14 dbms_output.put_line('email already exists');
15 end if;
16 end;
17 /
Enter value for email: abc@def.com
email already exists
PL/SQL procedure successfully completed.
SQL> select * From listofpeopletoviewpage5;
PKCOL EMAIL
---------- ----------------------------------------------------------------------------------------------------
1 abc@def.com
SQL>
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。