Как сохранить выбор, чтобы привести к переменной в процедуре Oracle

StackOverflow https://stackoverflow.com/questions/1347091

Вопрос

Я пишу простую процедуру. Я пытаюсь сохранить выбор в результате переменной. Я использую запрос «Select Into», но не могу этого сделать.

Пример:

DECLARE
     v_employeeRecord  employee%ROWTYPE;
BEGIN
 SELECT * INTO v_employeeRecord
      FROM Employee WHERE Salary > 10;
END;
Это было полезно?

Решение

У вас есть пара вариантов. Вы можете превратить этот запрос в курсор:

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;

Или вы можете создать 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;

Я не пробовал эти образцы в Oracle, так что вы можете получить ошибки компилятора ...

Другие советы

Если ваш выбор возвращает более одной строки, вы не сможете использовать Select Into Synthax.

Вам нужно будет построить петлю, чтобы перемещаться по набору Resulte:

Адам продемонстрировали, как вы бы использовали явный курсор и петлю для сбора объема. Я покажу, как вы можете построить простейшую петлю (неявный курсор, не нуждается в разделе объявления):

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;
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top