Календарь класс может обработать большую часть связанной с датой математики. Необходимо будет получить результат compareTo и произвести формат сами все же. Нет стандартной библиотеки, которая делает точно, что Вы ищете, хотя могла бы быть сторонняя библиотека, которая делает.
У вас есть несколько вариантов. Вы можете превратить этот запрос в курсор:
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 возвращает более одной строки, вы не сможете использовать синтаксис SELECT INTO.
Вам нужно будет построить цикл для навигации по результирующему набору:
Адам продемонстрировал, как использовать явный курсор и цикл массового сбора. Я покажу, как можно построить простейший возможный цикл (неявный курсор, раздел 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;