2016-05-25 16 views
0

ich ein Beispiel gemacht, um besser die Situation zu erklären:Oracle-Cursor wird nicht aktualisiert Daten

Ich habe zwei Tabellen

CREATE TABLE AA 
(
    ID NUMBER NOT NULL PRIMARY KEY, 
    REFERENCE NVARCHAR2(100) NULL 
) 

CREATE TABLE BB 
(
    ID NUMBER NOT NULL PRIMARY KEY, 
    IDA NUMBER NOT NULL, 
    REFERENCE NVARCHAR2(100) NULL, 

    FOREIGN KEY (IDA) REFERENCES AA(ID) 
) 

und einige Datensätze

INSERT INTO AA VALUES(1, NULL) 
INSERT INTO AA VALUES(2, NULL) 
INSERT INTO AA VALUES(3, NULL) 
INSERT INTO AA VALUES(4, NULL) 
INSERT INTO AA VALUES(5, NULL) 

INSERT INTO BB VALUES(6, 1, 'AAA') 
INSERT INTO BB VALUES(7, 2, 'BBB') 
INSERT INTO BB VALUES(8, 3, 'CCC') 

I REFERENCE Feld gesetzt haben von AA mit dem Wert, der in BB von IDA ist.

Also beschloss ich, einen Cursor es

DECLARE 
    idA NUMBER; 
    reference NVARCHAR2(100); 

    CURSOR ref_cursor 
    IS 
     SELECT IDA, REFERENCE FROM BB; 
BEGIN 

    OPEN ref_cursor; 

    LOOP 
     FETCH ref_cursor into idA, reference; 
     EXIT WHEN ref_cursor%NOTFOUND; 

     UPDATE AA 
     SET REFERENCE = reference 
     WHERE ID = idA; 

     DBMS_OUTPUT.put_line('reference of movement ' || idA || ' updated with ' || reference); 

    END LOOP; 

    CLOSE ref_cursor; 
END; 

Durch die Ausführung zu verwenden, ich

reference of movement 1 updated with AAA 
reference of movement 2 updated with BBB 
reference of movement 3 updated with CCC 

Das ist genau eine Ausgabe bekommen, was ich will, aber wenn ich die Daten von Check-Sterne-Auswahl der Tabelle Ich fand die REFERENCE Spalte noch NULL.

So fand ich diesen anderen Cursor

DECLARE 
    CURSOR ref_cursor 
    IS 
     SELECT IDA, REFERENCE FROM BB; 

BEGIN 
    FOR ref_c IN ref_cursor 
    LOOP 
     UPDATE AA SET REFERENCE = ref_c.REFERENCE WHERE ID = ref_c.IDA;    
    END LOOP; 
END; 

Dieses das Update tatsächlich tut. Warum sind diese 2 Cursor unterschiedlich?

+1

Können Sie Ihre lokale Variablenreferenz auf einen anderen Namen (in Ihrem ersten Cursorbeispiel) ändern und es erneut versuchen? – cableload

+2

[Verwandte Fragen] (http://StackOverflow.com/q/18875833/266304), nicht sicher, ob es nahe genug ist, um ein Duplikat zu sein, aber es ist das gleiche Namensauflösungsproblem. [Wie ist das] (http://stackoverflow.com/a/25574647/266304). –

+0

Es gibt keine Festschreibung. –

Antwort

1

umbenennen Wenn eine SQL-Anweisung in einer PL/SQL-Block verarbeitet wird, nimmt die SQL-Namensauflösung Priorität Tabellenfelder haben daher Vorrang vor Variablen mit demselben Namen. Um dieses Problem zu lösen, haben Sie zwei Möglichkeiten:

  • Ändern Sie den Variablennamen.

  • fügen Sie dem Variablennamen ein Präfix hinzu, wie Sie es bereits in Ihrer zweiten Abfrage getan haben.

+0

Ändern der Var Name funktionierte, grazie! – Phate01

0

Im ersten Cursor Sie schrieb

UPDATE AA 
     SET REFERENCE = reference 
     WHERE ID = idA; 

Ich denke, Sie sollten die Variable unterschiedliche Namen