2009-08-28 10 views
7

Piszę prostą procedurę. Próbuję zapisać wynik selekcji w zmiennej. Używam kwerendy "SELECT INTO", ale nie mogę tego zrobić.Jak zapisać wyniki wyboru do zmiennej w procedurze Oracle

Przykład:

DECLARE 
    v_employeeRecord employee%ROWTYPE; 
BEGIN 
SELECT * INTO v_employeeRecord 
     FROM Employee WHERE Salary > 10; 
END; 
+0

Czy możesz podać nam prosty przykład i błąd komunikatu? –

+0

Mogę przechowywać tylko jeden wiersz, ale mój wybrany wynik zawiera wiele wierszy. –

Odpowiedz

11

Masz kilka opcji. Można z kolei, że zapytanie do kursora:

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; 

Lub można utworzyć zmienną TABLE:

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; 

nie próbowałem tych próbek w Oracle, więc może pojawić się błędy kompilatora ..

+0

Kursor rozwiązuje mój problem. –

+2

Musisz użyć "BULK COLLECT INTO" – jva

+0

@jva: Dzięki za połów! –

7

JEŚLI twój WYBÓR zwróci więcej niż jeden wiersz, nie będziesz w stanie użyć syntezatora SELECT INTO.

Trzeba będzie zbudować pętlę do poruszania się po zbiorze resulte:

Adam wykazać w jaki sposób korzystać z wyraźną kursora i luzem zbierać pętlę. Pokażę, jak zbudować najprostszą pętlę możliwą (domyślny kursor, nie potrzebujesz sekcji DECLARE):

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; 
+0

Dobry przykład, dzięki –