2009-07-20 8 views
0

J'ai une procédure stockée qui retourne la sortie en tant que curseur de référence. Je voudrais stocker la sortie dans une autre table en utilisant l'instruction MERGE. J'ai cependant des problèmes en mélangeant toutes les déclarations ensemble (AVEC, UTILISATION, MERGE etc.).Fusionner le curseur de sortie de SP dans la table?

Quelqu'un peut-il vous aider? Merci!

Voici le tableau que je veux la sortie dans (Stop_Time est laissé exprès):

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

C'est le 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; 

Répondre

2

Je ne pense pas que vous pouvez le resuse curseur sauf si vous écrivez beaucoup de code de procédure. Vous ne pouvez pas écrire une seule instruction de fusion et abandonner la procédure REPORT_PLAN_AV_USER?

Si vous avez toujours besoin de la procédure REPORT_PLAN_AV_USE, vous pouvez créer une vue que vous utilisez dans la procédure REPORT_PLAN_AV_USER et dans votre instruction de fusion (pour éviter la duplication de code).

+0

Merci de penser avec moi, j'ai fini par utiliser une table temporaire mondiale. Les données ne sont pas visibles, c'est pourquoi j'ai besoin d'un SP. J'utilise la table temporaire globale pour stocker la sortie, et continuer à partir de là. – Ropstah

Questions connexes