我的PL / 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假定在该列上执行了主键或唯一键,或唯一索引。如果没有,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>