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;
Welche Spalten enthält die PK enthalten? Nur ID oder etwas anderes? – Aleksej
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
@Aleksej ID ist die PK. item_key muss eindeutig sein. – Rthp