Как сохранить выбор, чтобы привести к переменной в процедуре Oracle
-
20-09-2019 - |
Вопрос
Я пишу простую процедуру. Я пытаюсь сохранить выбор в результате переменной. Я использую запрос «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;
Не связан с StackOverflow