Я хотел бы пояснить это, сказав, что у меня не было много времени, чтобы поработать над этим, поэтому может быть несколько ошибок, но это должно дать вам суть того, что я пытаюсь вам сказать:
CREATE or REPLACE
PROCEDURE TEST(
activationStartDate IN DATE,
activationEndDate IN DATE,
deActivationStartDate IN DATE,
deActivationEndDate IN DATE )
AS
CURSOR main_cur
IS
WITH include_rec
AS (SELECT first_name,
start_date,
COUNT(1) OVER (PARTITION BY first_name) name_count
FROM Employee
WHERE start_date BETWEEN activationStartDate
AND activationEndDate)
SELECT DISTINCT
first_name
FROM include_rec
WHERE start_date NOT BETWEEN deActivationStartDate
AND deActivationEndDate
AND name_count > 2;
--
FirstNameListTable dbms_sql.varchar2_table;
BEGIN
OPEN main_cur;
FETCH main_cur BULK COLLECT INTO FirstNameListTable;
CLOSE main_cur;
FOR i IN FirstNameListTable.FIRST .. FirstNameListTable.LAST
LOOP
---business logic
END LOOP;
etc...
Я бы также сказал, что если вы ожидаете большой набор результатов, то поместите BULK COLLECT в цикл, чтобы уменьшить ваши требования к памяти.
В идеальном мире вы должны передать переменные ActivationStartDate, активацииEndDate, deActivationStartDate и deActivationEndDate в качестве параметров курсора, чтобы курсор оставался модульным, но это зависит от вас. ; -)
Надеюсь, это поможет ...
Олли.
EDIT:
Отвечая на ваш вопрос об использовании записей для выбора * из таблицы, вы можете объявить ассоциативный массив на основе столбцов курсора, например, в приведенном выше примере, если вы хотите выбрать более одного столбца из EMPLOYEE, то после предложения WITH вы должны выбрать именованные столбцы от работника, которого вы хотите, а не:
FirstNameListTable dbms_sql.varchar2_table;
объявляет тип ассоциативного массива и переменную как:
TYPE main_cur_tabtype IS TABLE OF main_cur%ROWTYPE
INDEX BY PLS_INTEGER;
main_cur_tab main_cur_tabtype;
Это дает вам гибкий массив, который будет автоматически содержать столбцы, выделенные вашим курсором (main_cur).
Вы должны собрать записи в этот массив с помощью BULK COLLECT:
OPEN main_cur;
FETCH main_cur BULK COLLECT INTO main_cur_tab;
CLOSE main_cur;
и перебрать их с помощью:
FOR i IN main_cur_tab.FIRST .. main_cur_tab.LAST
LOOP
etc.
что касается возврата вашего набора результатов в Java, я не эксперт по Java, вам нужно будет задать это на другом форуме или пометить этот вопрос тегом Java и надеяться, что специалист по Java заберет его и ответит за вас. .