2016-09-16 5 views
0

Ich bin ein Anfänger und ich habe diese Frage. Also ich habe eine Tabelle:Einfügen von Datensatz beim Schleifen innerhalb 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 | 

Ich möchte Aufzeichnungen nehmen, die .Move in seiner item_key hat. Nachdem ich diese Datensätze erhalten habe, möchte ich .hasFile auf jedem von ihnen hinzufügen und sie als neuen Datensatz in die Tabelle einfügen. Aber wenn dieser config_key bereits existiert (zB folder1.Move.hasFile), sollte das nicht zur Tabelle hinzugefügt werden. Ich habe folgendes getan, aber es gibt mir Primärschlüsselverletzung Fehler für ID. Kann mir jemand erklären, wo ich falsch liege?

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

Welche Spalten enthält die PK enthalten? Nur ID oder etwas anderes? – Aleksej

+0

Es ist eine schlechte Idee, 'max (id)' zu verwenden, um eindeutigen Wert des Primärschlüssels zu berechnen. Sie sollten Sequenzen verwenden - es ist besser. – AlexSmet

+0

@Aleksej ID ist die PK. item_key muss eindeutig sein. – Rthp

Antwort

0

vorausgesetzt, Sie mindestens Oracle 12c haben Sie gerade ID in der Tabelle Deklaration ein Identitätsfeld wie ID-Nummer STANDARD AUF NULL AS IDENTITY

ERSTELLT machen könnte, auf diese Weise müssen Sie nicht auf Bedenken Sie, dass Sie versuchen, das im SP zu berechnen, und lassen Sie das System den Schlüssel dafür generieren.

Wie hier beschrieben. http://docs.oracle.com/database/121/DRDAA/migr_tools_feat.htm#DRDAA109

0

in Ihrer Prozedur insert_hasFile Sie Datensätze aus config_items Tabelle zu holen, die mehrere Datensätze mit demselben Wert für ID-Spalte auswählen wird.

Versuchen einzelner Datensatz durch das Verfahren das Einfügen mit DUAL wie unten ..

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