views:

261

answers:

1

Hi,

i have a Stored Procedure which returns output as a ref cursor. I would like to store the output in another table using the MERGE statement. I'm having problems however mixing all the statements together (WITH, USING, MERGE etc..).

Can somebody assist? Thanks!

This is the table i want the output in (STOP_TIME is left out on purpose):

TABLE: **USER_ALLOCATION**
START_TIME date   NOT NULL Primary Key
USER_ID    number NOT NULL Primary Key
TASK_ID    number NULL

This is the SP:

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;
+2  A: 

I don't think you can resuse the cursor unless you write a lot of procedural code.

Can't you write a single merge statement and drop procedure REPORT_PLAN_AV_USER?

If you still need procedure REPORT_PLAN_AV_USE you can create a view that you use in procedure REPORT_PLAN_AV_USER and in your merge statement (to prevent code duplication).

Theo
Thanks for thinking with me, i ended up using a Global Temporary Table. The data is not 'viewable' thats why i need a SP. I use the global temp table to store the output in, and go on from there.
Ropstah