我的 PL/SQL 过程异常似乎不起作用
My PL/SQL procedure exception doesn't seem to work
我有一个包含大洲的数据库,我想创建一个过程来向数据库中添加一个新大洲,但有例外。我尝试通过创建一个已经存在的大陆(亚洲)来在我的包 GEST_GEO 中执行该过程,但没有引发我的异常。有谁知道为什么它不起作用? (nom 是名字)
这是我的代码:
CREATE OR REPLACE PACKAGE GEST_GEO AS
Procedure ADDCONTINENT(pnom continent.nom%TYPE, psuperficie continent.superficie%TYPE);
END GEST_GEO;
/
CREATE OR REPLACE PACKAGE BODY GEST_GEO AS
-- ADDCONTINENT
Procedure ADDCONTINENT(pnom CONTINENT.NOM%TYPE, psuperficie CONTINENT.SUPERFICIE%TYPE) IS
BEGIN
INSERT INTO CONTINENT VALUES (pnom, psuperficie);
COMMIT;
EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN DBMS_OUTPUT.PUT_LINE('The continent already exists');
WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE(SQLCODE || '–' || SQLERRM);
END ADDCONTINENT;
END GEST_GEO;
/
execute GEST_GEO.ADDCONTINENT('Asia',99380);
执行它时它只是告诉我 PL/SQL procedure successfully completed
谢谢
DUP_VAL_ON_INDEX
假定在该列上强制执行了主键或唯一键或唯一索引。如果有 none,Oracle 不知道有任何“重复”的东西,所以它会插入一行。
因此,创建前面提到的东西 (keys/indexes)。
这是一个例子:table 首先(注意第 2 行中的主键约束):
SQL> create table continent
2 (nom varchar2(30) constraint pk_cont primary key,
3 superficie number
4 );
Table created.
程序:注意
- 第 5 行 - 始终在
INSERT
语句 中包含目标列名称
- 异常处理程序部分:不要输出消息 - 除非您使用的工具支持它,否则任何人都看不到缓冲区的内容。
RAISE
错误改为
- 不要在程序内提交;让调用者决定是否提交
所以:
SQL> create or replace procedure addcontinent
2 (pnom continent.nom%type, psuperficie continent.superficie%type)
3 is
4 begin
5 insert into continent (nom, superficie) values (pnom, psuperficie);
6 exception
7 when dup_val_on_index then
8 raise_application_error(-20001, 'The continent already exists');
9 when others then
10 raise;
11 end addcontinent;
12 /
Procedure created.
测试:
SQL> exec addcontinent('Asia', 99380);
PL/SQL procedure successfully completed.
SQL> exec addcontinent('Asia', 99380);
BEGIN addcontinent('Asia', 99380); END;
*
ERROR at line 1:
ORA-20001: The continent already exists
ORA-06512: at "SCOTT.ADDCONTINENT", line 8
ORA-06512: at line 1
SQL> select * from continent;
NOM SUPERFICIE
------------------------------ ----------
Asia 99380
SQL>
我有一个包含大洲的数据库,我想创建一个过程来向数据库中添加一个新大洲,但有例外。我尝试通过创建一个已经存在的大陆(亚洲)来在我的包 GEST_GEO 中执行该过程,但没有引发我的异常。有谁知道为什么它不起作用? (nom 是名字)
这是我的代码:
CREATE OR REPLACE PACKAGE GEST_GEO AS
Procedure ADDCONTINENT(pnom continent.nom%TYPE, psuperficie continent.superficie%TYPE);
END GEST_GEO;
/
CREATE OR REPLACE PACKAGE BODY GEST_GEO AS
-- ADDCONTINENT
Procedure ADDCONTINENT(pnom CONTINENT.NOM%TYPE, psuperficie CONTINENT.SUPERFICIE%TYPE) IS
BEGIN
INSERT INTO CONTINENT VALUES (pnom, psuperficie);
COMMIT;
EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN DBMS_OUTPUT.PUT_LINE('The continent already exists');
WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE(SQLCODE || '–' || SQLERRM);
END ADDCONTINENT;
END GEST_GEO;
/
execute GEST_GEO.ADDCONTINENT('Asia',99380);
执行它时它只是告诉我 PL/SQL procedure successfully completed
谢谢
DUP_VAL_ON_INDEX
假定在该列上强制执行了主键或唯一键或唯一索引。如果有 none,Oracle 不知道有任何“重复”的东西,所以它会插入一行。
因此,创建前面提到的东西 (keys/indexes)。
这是一个例子:table 首先(注意第 2 行中的主键约束):
SQL> create table continent
2 (nom varchar2(30) constraint pk_cont primary key,
3 superficie number
4 );
Table created.
程序:注意
- 第 5 行 - 始终在
INSERT
语句 中包含目标列名称
- 异常处理程序部分:不要输出消息 - 除非您使用的工具支持它,否则任何人都看不到缓冲区的内容。
RAISE
错误改为 - 不要在程序内提交;让调用者决定是否提交
所以:
SQL> create or replace procedure addcontinent
2 (pnom continent.nom%type, psuperficie continent.superficie%type)
3 is
4 begin
5 insert into continent (nom, superficie) values (pnom, psuperficie);
6 exception
7 when dup_val_on_index then
8 raise_application_error(-20001, 'The continent already exists');
9 when others then
10 raise;
11 end addcontinent;
12 /
Procedure created.
测试:
SQL> exec addcontinent('Asia', 99380);
PL/SQL procedure successfully completed.
SQL> exec addcontinent('Asia', 99380);
BEGIN addcontinent('Asia', 99380); END;
*
ERROR at line 1:
ORA-20001: The continent already exists
ORA-06512: at "SCOTT.ADDCONTINENT", line 8
ORA-06512: at line 1
SQL> select * from continent;
NOM SUPERFICIE
------------------------------ ----------
Asia 99380
SQL>