我的 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>