Oracle 存储过程插入非重复值和外键约束的考虑

Posted

技术标签:

【中文标题】Oracle 存储过程插入非重复值和外键约束的考虑【英文标题】:Oracle Stored procedure to insert non-duplicate values and foreign key constraint consideration 【发布时间】:2015-12-01 20:30:40 【问题描述】:

我的要求是编写一个在COUNTRIES 表中添加值的过程。但是,首先它应该检查对应的值是否存在于另一个表中,REGIONS 因为它是一个外键。只有值存在时才允许插入COUNTRIES 表。第二个要求是COUNTRIES 表中的country_id 不应有重复值,因为country_idPK。我写了这段代码,但它抛出了异常:

PLS-00103 Encountered the symbol "WHEN" when expecting one of the following:
begin case
PLS-00103:Encountered the symbol "WHEN" when expecting one of the following: ERROR

我的代码是:

create or replace procedure addi5 (c_cntry_id  in out countries.country_id%type,
                                   c_cntr_name in countries.country_name%type, 
                                   c_rgn_id    in countries.region_id%type)
is
    region_exists pls_integer;
begin
    begin
        select 1 into region_exists
        from regions r 
        where r.region_id = c_rgn_id;
    exception
        when no_data_found then
            region_exists := 0;
            DBMS_OUTPUT.PUT_LINE('Region not present '||sqlerrm);
    end;

   BEGIN
     INSERT INTO countries(COUNTRY_ID, COUNTRY_NAME,REGION_ID)
     values (c_cntry_id, c_cntr_name,c_rgn_id);

   EXCEPTION
     WHEN dup_val_on_index THEN 
       c_cntry_id := null;
       DBMS_OUTPUT.PUT_LINE('Already present');
   END;    

   if region_exists = 1 then
     insert into countries(country_id, country_name,region_id)
     values (c_cntry_id, c_cntr_name, c_rgn_id);

     DBMS_OUTPUT.PUT_LINE('Inserted');

   ELSE
     WHEN dup_val_on_index
     THEN 
     c_cntry_id := null;

     DBMS_OUTPUT.PUT_LINE('Already present');
   END IF;

end addi5;
/

有人可以指导我做错了什么吗?或者这两个条件怎么写或者检查?

【问题讨论】:

可能是***.com/questions/34006475/…的欺骗 我会去掉主键和外键。只需使用从源表到区域的内部连接,因此您只加载区域中存在的数据。至于重复项,您可以使用 select minus 语句通过查找基于 rowid 的重复项来消除这些重复项。这将使您的工作不会失败,并且很可能会运行得更快。 谢谢,你能编辑我的代码重新编写吗?我是 oracle pl/sql 的新手 不,我不会那样做,你需要像其他人一样把头撞在墙上,然后弄清楚 【参考方案1】:

您自己的编码实践不正确。首先,如果可能,您应该尝试在 sql 中编写逻辑以提高可读性以及减少 sql 和 pl/sql 引擎之间的上下文切换。这是示例代码,您可能需要添加异常处理。

create or replace procedure addi5 (c_cntry_id in countries.country_id%type,
                                   c_cntr_name in countries.country_name%type, 
                                   c_rgn_id in countries.region_id%type)
is
begin
  insert into countries select c_cntry_id, c_cntr_name, c_rgn_id from dual
  where c_rgn_id in (select region_id from regions)
  and c_cntry_id not in (select country_id from countries);
  commit;
end;
/

【讨论】:

以上是关于Oracle 存储过程插入非重复值和外键约束的考虑的主要内容,如果未能解决你的问题,请参考以下文章

phpmyadmin 和外键

关于 主键和外键

sqlserver外键关系有啥用?

oracle中外键的作用

SQL的主键和外键的作用

Oracle中禁用了外键约束对系统有没有影响