ОБЪЕДИНИТЬ выходной курсор SP в таблицу?
-
18-09-2019 - |
Вопрос
у меня есть Хранимая процедура, которая возвращает выходные данные в виде курсора ref.Я хотел бы сохранить выходные данные в другой таблице, используя оператор MERGE .Однако у меня возникают проблемы со смешиванием всех операторов вместе (WITH, USING, MERGE и т.д.).
Кто-нибудь может помочь?Спасибо!
Это таблица, в которой я хочу получить выходные данные (STOP_TIME специально не указан).:
TABLE: **USER_ALLOCATION** START_TIME date NOT NULL Primary Key USER_ID number NOT NULL Primary Key TASK_ID number NULL
Это и есть ИП:
create or replace
PROCEDURE REPORT_PLAN_AV_USER
(
from_dt IN date,
to_dt IN date,
sysur_key IN number,
v_reservations OUT INTRANET_PKG.CURSOR_TYPE
)
IS
BEGIN
OPEN v_reservations FOR
with
MONTHS as (select FROM_DT + ((ROWNUM-1) / (24*2)) as DT from DUAL connect by ROWNUM <= ((TO_DT - FROM_DT) * 24*2) + 1),
TIMES as (select DT as START_TIME,(DT + 1/48) as STOP_TIME from MONTHS where TO_NUMBER(TO_CHAR(DT,'HH24')) between 8 and 15 and TO_NUMBER(TO_CHAR(DT,'D')) not in (1,7))
select
TIMES.START_TIME,
TIMES.STOP_TIME,
T.TASK_ID,
sysur_key USER_ID,
from
TIMES
left outer join (ALLOCATED_USER u INNER JOIN REQUIRED_RESOURCE r ON u.AU_ID = r.RR_ID INNER JOIN TASK t ON r.TASK_ID = t.TASK_ID)
ON u.USER_ID = sysur_key AND t.PLAN_TYPE = 3 AND TIMES.start_time >= TRUNC30(t.START_DATE) AND TIMES.start_time < TRUNC30(t.FINISH_DATE)
where u.USER_ID is null OR u.USER_ID = sysur_key
order by START_TIME ASC;
END;
Решение
Я не думаю, что вы сможете повторно использовать курсор, если не напишете много процедурного кода.
Разве вы не можете написать единую инструкцию слияния и удалить процедуру REPORT_PLAN_AV_USER?
Если вам все еще нужна процедура REPORT_PLAN_AV_USE, вы можете создать представление, которое вы используете в процедуре REPORT_PLAN_AV_USER и в вашем заявлении merge (для предотвращения дублирования кода).