在游标内循环时插入记录

时间:2016-09-16 14:39:28

标签: sql database oracle plsql cursor

我是初学者,我有这个问题。所以我有一张桌子:

config_items:

id | item_key            | item_alias |   
---|---------------------|------------|  
5  | folder1.Move.hasFile| hasFile    |
4  | folder1.Move        | Move       |    
3  | folder2.Move        | Move       |
2  | folder3.Move        | Move       |  
1  | folder4.Download    | Download   |

我想在其item_key中记录具有.Move的记录。在我获得这些记录之后,我想在每个记录上添加.hasFile并将它们作为新记录插入到表中。但是,如果该config_key已经存在(例如folder1.Move.hasFile),则不应该在表上添加。我已经完成了以下但它给了我id的主键违规错误。有人可以解释我在哪里做错了吗?

CREATE OR REPLACE PROCEDURE insert_hasFile(v_key IN config_items.item_key%TYPE)
AS 
BEGIN
    insert into config_items
            (id,
            item_key,
            item_alias)
            (select 
                (select max(id) from config_items)+1,
                 v_key,
                'hasFile'
            from 
                config_items
            where
                not exists(select * from config_items where v_key =item_key )
            );
END; 
/

DECLARE
CURSOR item_records_curr
IS
SELECT * from config_items
where item_key LIKE '%.Move';

v_item_key config_items.item_key%TYPE;
v_all_info item_records_curr%ROWTYPE;

BEGIN
   OPEN item_records_curr;

   LOOP 
      FETCH item_records_curr into v_all_info;     
       v_item_key := v_all_info.item_key || '.hasFile';
       insert_hasFile(v_item_key);
      EXIT WHEN item_records_curr%NOTFOUND;
   END LOOP;

   CLOSE item_records_curr;
END;

2 个答案:

答案 0 :(得分:0)

假设你至少拥有Oracle 12c,你可以在你的表声明中创建一个身份字段ID,例如ID NUMBER由DEFAULT ON NULL作为IDEN生成

这样你就不必担心在SP中尝试计算它,并且可以让系统生成密钥。

如此处所述。 http://docs.oracle.com/database/121/DRDAA/migr_tools_feat.htm#DRDAA109

答案 1 :(得分:0)

在您的程序 insert_hasFile 中,您将从 config_items 表中提取记录,该记录将为ID列选择多个具有相同值的记录。

尝试使用 DUAL 在过程中插入单个记录,如下所示。

`CREATE OR REPLACE PROCEDURE insert_hasFile(v_key IN config_items.item_key%TYPE)
AS 
BEGIN
    insert into config_items
            (id,
             item_key,
             item_alias)
             (select 
                 (select max(id) from config_items)+1,
                  v_key,
                 'hasFile'
             from 
                 dual
             where
                 not exists(select * from config_items where v_key =item_key )
            ) ;
END;  
/`