问题描述
我有一个包含各大洲的数据库,我想创建一个向数据库添加一个新大洲的过程(例外)。我尝试通过创建一个已经存在的大陆(亚洲)在我的软件包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
假定在该列上执行了主键或唯一键,或唯一索引。如果没有,Oracle将不知道有什么“重复的”,因此会插入一行。
因此,创建前面提到的内容(键/索引)。
这是一个示例:首先进行表格处理(注意第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>