2009-07-20 9 views
0

私は参照カーソルとして出力を返すストアドプロシージャを持っています。私は、MERGEステートメントを使用して別のテーブルに出力を保存したいと思います。私はすべてのステートメントを一緒に(WITH、USING、MERGEなど)混在させて問題を抱えています。SPのテーブルへのMERGE出力カーソル?

誰かが助けることができますか?ありがとう!

これは私が(STOP_TIMEを目的に取り残されている)で出力したいテーブルです:

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

これは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

私はあなたがは再使用できないと思いますあなたが多くの手続き型コードを書かない限り、カーソル。

単一のマージ文を作成してプロシージャREPORT_PLAN_AV_USERを削除できませんか?

プロシージャREPORT_PLAN_AV_USEが必要な場合は、プロシージャREPORT_PLAN_AV_USERおよびマージステートメント(コードの重複を防ぐため)で使用するビューを作成できます。

+0

私と一緒に考えてくれてありがとう、グローバルテンポラリーテーブルを使用してしまった。データは「閲覧可能」ではないので、SPが必要なのです。グローバルtempテーブルを使用して出力を格納し、そこから移動します。 – Ropstah