2017-05-02 5 views
2

Ich habe eine ziemlich generische/dynamische Prozedur, wo ich den Tabellennamen als Parameter übergeben und Abfragen dynamisch mit EXECUTE IMMEDIATE ausführen. Ich muss einen Cursor durchlaufen und jeden Datensatz aktualisieren. Gibt es eine Möglichkeit, meinen Tabellennamen nicht hart codieren zu müssen?Dynamic SQL mit 'where current of'

habe ich versucht, diese aber es funktioniert nicht:

open cur for v_sql; 
    loop 
     fetch cur into v_recid; 
     EXIT WHEN cur%NOTFOUND; 
     EXECUTE IMMEDIATE 'update '||p_table||q'[ set status = 'I' where current of cur]'; 
    end loop; 
    close cur; 
+2

Haben Sie erwogen, die 'ROWID' als Schlüssel für das Update zu verwenden? –

+0

Was ist der Fehler, den Sie haben? Wenn Sie "current of" verwenden, muss Ihre dem Cursor zugeordnete Abfrage die Klausel "for update" enthalten. –

Antwort

1

SQL eine Reihe orientierte Sprache ist. Ihre Lösung ist eine Zeile auf einmal oder "langsam auf einmal". Ich würde empfehlen, Ihre Zeit zu verbringen, um einen Weg zu finden, nicht zu loopen und das Update in einer einzigen Anweisung zu tun.

+0

Danke. Dies wurde mir bald nach der Veröffentlichung der Frage bewusst und ich entschied mich für diesen Ansatz. Aber war immer noch neugierig, ob es getan werden könnte. Ich habe nicht bemerkt, wo der Strom so langsam ist. – Soyf