我必须编写一个过程来检查两件事:一种是检查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。
在您的存储过程中,如果您想在违反此规则时捕获错误,则必须添加适当的异常定义,我不记得了。