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



我必须编写一个过程来检查两件事:一种是检查country_id在country表中是否重复,如果存在,则不应插入值。(country_Id是主Id,因此不能重复)2) 检查不存在的region_id(来自另一个表,其中region_id也是pk,但在国家/地区表中插入相应值之前,我们必须在区域表中具有区域id。)

我已经为第一项要求编写了程序。然而,我似乎不知道如何检查第二种情况。

有人能指导我吗?

这是我写的代码:

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;

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

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。

在您的存储过程中,如果您想在违反此规则时捕获错误,则必须添加适当的异常定义,我不记得了。

最新更新