将SP的输出游标合并到表中?

Posted

技术标签:

【中文标题】将SP的输出游标合并到表中?【英文标题】:MERGE output cursor of SP into table? 【发布时间】:2009-07-20 10:16:38 【问题描述】:

我有一个存储过程,它以引用游标的形式返回输出。我想使用 MERGE 语句将输出存储在另一个表中。我遇到了问题,但是将所有语句混合在一起(WITH、USING、MERGE 等)。

有人可以帮忙吗?谢谢!

这是我想要输出的表(STOP_TIME 被故意省略):

表:**USER_ALLOCATION** START_TIME 日期 NOT NULL 主键 USER_ID 号 NOT NULL 主键 TASK_ID 编号 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;

【问题讨论】:

【参考方案1】:

除非您编写大量程序代码,否则我认为您无法重用光标。

你不能写一个合并语句和删除过程 REPORT_PLAN_AV_USER 吗?

如果您仍然需要过程 REPORT_PLAN_AV_USE,您可以创建在过程 REPORT_PLAN_AV_USER 和合并语句中使用的视图(以防止代码重复)。

【讨论】:

感谢您与我一起思考,我最终使用了全局临时表。数据不是“可见的”,这就是我需要 SP 的原因。我使用全局临时表来存储输出,然后从那里继续。

以上是关于将SP的输出游标合并到表中?的主要内容,如果未能解决你的问题,请参考以下文章

遍历游标并将游标的输出存储在另一个表中

从命名阶段将数据合并到表中

如何在 PL/SQL 代码的 for 循环中创建游标并将结果批量收集到表中

无论如何将存储桶中的数据合并到表中但没有任何重复的行?

将连接的值插入到表中

T-SQL:生成数字组合并保存到表中