检查外表(oracle)中不存在的行的过程

时间:2015-11-30 17:57:32

标签: oracle

我必须编写一个程序来检查两件事: 一种是检查国家/地区表中的重复country_id,如果存在,则不应插入值。(country_Id是主要的,因此不能重复) 2)检查不存在的region_id(来自不同的表,其中region_Id也是pk但我们必须在regions表中具有region id才能在countries表中插入相应的值。)

我已经为第一个要求编写了程序。但是,我似乎无法理解如何检查第二个条件。

有人可以指导我吗?

这是我写的代码:

CREATE OR REPLACE PROCEDURE add_vals (c_cntry_id OUT COUNTRIES.COUNTRY_ID%TYPE,
                                       c_cntr_name IN COUNTRIES.COUNTRY_NAME%TYPE, 
                                       c_rgn_id IN COUNTRIES.REGION_ID%TYPE);
BEGIN
  INSERT INTO countries(COUNTRY_ID, COUNTRY_NAME,REGION_ID)
    values (user_seq.nextval, c_cntr_name,c_rgn_id);
  c_cntry_id := user_seq.currval;
EXCEPTION
  WHEN dup_val_on_index
  THEN 
    c_cntry_id := null;
END;

1 个答案:

答案 0 :(得分:0)

可以在国家/地区定义外键约束"指向"到地区:

ALTER TABLE countries
   ADD FOREIGN KEY (REGION_ID)
   REFERENCES regions (REGION_ID)

这样,如果您尝试在区域中不存在区域ID的国家/地区插入(或更新)行,则插入(更新)将失败。也不允许删除ID在国家/地区引用的地区。如果您想允许,则必须添加ON DELETE <CASCADE | SET NULL>CASCADE表示也会从其他表中删除该行,因此,如果删除某个区域,则该区域的所有国家/地区都将被删除。 SET NULL只会在删除区域时将countries表中的所有区域ID设置为NULL。

在你的存储过程中,如果你想在违反时发现错误,你必须添加相应的异常定义,我不记得。