2017-05-23 3 views
2

Ich versuche, herauszufinden, wie einen Datensatz zu löschen, die für die Verwendung .. IN .. LOOPPL/SQL - Löschen aktuellen Datensatz in IN LOOP

FOR REC IN (SELECT * FROM WORKLIST) LOOP 
    GET_DATA(REC); 
    --DELETE REC FROM WORKLIST 
END LOOP; 

Die GET_DATA Prozedur jede Zeile auf mehrere diejenigen explodiert so wird der aktuelle veraltet. Ich versuche gerade den aktuellen Datensatz zu löschen. Nicht sicher, ob dies in diesem Fall mit dem REC-Objekt möglich ist.

Leider hat WORKLIST keine Schlüssel.

Antwort

3

Verwenden current of auf cursor:

DECLARE 
CURSOR c1 IS 
    SELECT * from worklist FOR UPDATE <any column name>; 
BEGIN 
     open c1; 
     loop 
      fetch c1 into crow; 
      exit when c1%notfound; 
      DELETE FROM worklist WHERE CURRENT OF c1; 
     end loop;   
     COMMIT; 
     close c1; 
END; 
+0

'For Update' wird im Allgemeinen entwertet. Dies kann Deadlocks verursachen. Lesen Sie hier mehr https://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:4530093713805 – XING

+0

@XING - Ich glaube, Sie haben Tom Kytes Antwort missverstanden. FOR UPDATE ermöglicht uns die Implementierung einer pessimistischen Sperrstrategie, die * Deadlocks vermeidet. – APC

+0

@APC. Im vorherigen Abschnitt wurde auch gezeigt, dass 'FOR UPDATE 'Deadlocks verursachte. Ich meinte richtig. Bitte beachten Sie den ganzen Artikel – XING

0

Wenn WORKLIST einen Primärschlüssel hat, es einfach verwenden:

DELETE FROM WORKLIST WHERE <PK> = REC.<PK> 

Wenn kein Primärschlüssel ich versuchen würde,:

DECLARE 
    vTmp schema.worklist%rowtype; 
BEGIN 
    FOR rec IN (SELECT rowid, w.* FROM WORKLIST w) LOOP 
    vTmp := null; 
    vTmp.col1 := rec.col1; 
    vTmp.col2 := rec.col2; 
    -- And so on ... 
    GET_DATE(vTmp); 
    DELETE FROM WORKLIST WHERE rowid = rec.rowid; 
    END LOOP; 
END; 
+0

Leider WORKLIST hat keine Schlüssel. – Delphy

+0

In diesem Fall können Sie die ROWID verwenden. Antwort aktualisiert – Sal

+0

Oh ich mag das, nur jetzt bekomme ich einen Fehler in der GET_DATA (REC) Zeile. Fehler: PLS-00306: Falsche Anzahl oder Arten von Argumenten beim Aufruf von 'GET_DATA'. Die Definition dieser Prozedur lautet wie folgt: PROCEDURE GET_DATA (P_REC WWMT_WORKLIST% ROWTYPE) IS ... Gibt es eine Möglichkeit, ROWID in diesen ROWTYPE aufzunehmen? – Delphy