Frage

Ich schreibe eine einfache Prozedur. Ich versuche, die Auswahl zu variabler zu speichern. Ich benutze "SELECT in" Abfrage, kann das aber nicht tun.

Beispiel:

DECLARE
     v_employeeRecord  employee%ROWTYPE;
BEGIN
 SELECT * INTO v_employeeRecord
      FROM Employee WHERE Salary > 10;
END;
War es hilfreich?

Lösung

Sie haben ein paar Optionen. Sie könnten diese Abfrage in einen Cursor verwandeln:

DECLARE
     CURSOR v_employeeRecords IS
          SELECT * FROM Employee WHERE Salary > 10;
     v_employeeRecord  employee%ROWTYPE;
BEGIN
     FOR v_employeeRecord IN v_employeeRecords LOOP
          /* Do something with v_employeeRecord */
     END LOOP;
END;

Oder Sie können a erstellen TABLE Variable:

DECLARE
     v_employeeRecord  employee%ROWTYPE;
     v_employeeRecords IS TABLE OF employee%ROWTYPE;
     i BINARY_INTEGER;
BEGIN
 SELECT * BULK COLLECT INTO v_employeeRecords
      FROM Employee WHERE Salary > 10;

 i := v_employeeRecords.FIRST;
 WHILE v_employeeRecords.EXISTS(i) LOOP
     v_employeeRecord := v_employeeRecords(i);
     /* Do something with v_employeeRecord */
     i := v_employeeRecords.NEXT(i);
 END;
END;

Ich habe diese Muster nicht in Oracle ausprobiert, also erhalten Sie möglicherweise Compiler -Fehler ...

Andere Tipps

Wenn Ihre Auswahl mehr als eine Zeile zurückgibt, können Sie die Auswahl in Synthax nicht verwenden.

Sie müssen eine Schleife erstellen, um durch den resultierenden Satz zu navigieren:

Adam Zeigen Sie, wie Sie einen expliziten Cursor und eine Schüttung ansammeln würden. Ich werde zeigen, wie Sie die einfachste Schleife erstellen können (implizite Cursor, benötigt keinen Deklar -Abschnitt):

BEGIN
   FOR c_emp IN (SELECT * 
                   FROM Employee 
                  WHERE Salary > 10) LOOP
      /* do something with each row, for example:*/
      UPDATE foo SET bar = bar + c_emp.salary WHERE id = c_emp.id;
   END LOOP;
END;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top