2016-09-16 81 views
0

我是初學者,我有這個問題。所以我有一個表:在光標內循環插入記錄

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 | 

我要帶它有.Move在其item_key記錄。獲得這些記錄後,我想在每個記錄上添加.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; 
+0

沒有了PK包含哪些列?只有身份證或其他東西? – Aleksej

+0

使用'max(id)'來計算主鍵的唯一值是個不錯的主意。你應該使用序列 - 這是更好的方法。 – AlexSmet

+0

@Aleksej id是PK。 item_key必須是唯一的。 – Rthp

回答

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; 
/`