在 oracle 中以多个游标作为输出执行过程

Posted

技术标签:

【中文标题】在 oracle 中以多个游标作为输出执行过程【英文标题】:Executing a procedure in oracle with multiple cursors as output 【发布时间】:2019-01-25 13:35:42 【问题描述】:

如何在 oracle 中执行具有多个光标作为输出的过程。

CREATE OR REPLACE PROCEDURE TC_OWNER.usp_GetGEGAllDataBySecurityID(
p_SecurityID NUMBER,
cur1 OUT sys_refcursor,
cur2 OUT sys_refcursor,
cur3 OUT sys_refcursor,
cur4 OUT sys_refcursor,
cur5 OUT sys_refcursor)
AS 

v_EffectiveDate TIMESTAMP(3);
v_CompanyID NUMBER(10);
BEGIN

SELECT MAX(EffectiveStartDate) INTO v_EffectiveDate
FROM    tblGEGSecurityDtls
WHERE    SecurityId = p_SecurityID AND SYSDATE BETWEEN EffectiveStartDate 
and EffectiveEndDate;


SELECT  CompanyID INTO v_CompanyID
FROM    tblGEGSecurityDtls
WHERE    SecurityId = p_SecurityID AND EffectiveStartDate = 
v_EffectiveDate;

usp_GetGEGSecurityDtls(p_SecurityID,cur1);
usp_GetGEGRecommendations(p_SecurityID,cur2);
usp_GetGEGCompanyDtls(v_CompanyID,cur3);
usp_GetGEGSectorRegionData(v_CompanyID,null,cur4);
usp_GetGEGCompanyDivisionData(v_CompanyID,null,cur5);

END;

这里以 usp_ 开头的任何东西都表示一个过程。 每个过程都返回一个表。

同样可以在 sql 中轻松实现,但我无法在 oracle 中执行。

编辑:根据 vc74 给出的答案,我尝试使用以下代码打印所有五个表,但它抛出错误:

declare
lcur1 sys_refcursor;
lcur2 sys_refcursor; 
lcur3 sys_refcursor; 
lcur4 sys_refcursor; 
lcur5 sys_refcursor; 
begin
usp_GetGEGAllDataBySecurityID(
    p_SecurityID => 457, 
    cur1 => lcur1, 
    cur2 => lcur2,
    cur3 => lcur3,
    cur4 => lcur4,
    cur5 => lcur5
);
end;
print lcur1;
print lcur2;
print lcur3;
print lcur4;
print lcur5;

如何打印输出窗口中的所有表格?

【问题讨论】:

在哪里执行表单 - 您只是从 SQL*Plus 或 SQL Developer 等客户端运行/测试它(如果是的话,是哪一个)? Possibly related, if so。或者从应用程序调用它 - 通过 JDBC、.net 或其他方式? 我正在 TOAD for oracle 中对此进行测试。 【参考方案1】:

在 Oracle 中事情不是那么简单,您必须显式声明游标。在 Toad 的网格中显示光标。

variable outer_cur1 refcursor
variable outer_cur2 refcursor
variable outer_cur3 refcursor
variable outer_cur4 refcursor
variable outer_cur5 refcursor

declare
    inner_cur1 sys_refcursor;
    inner_cur2 sys_refcursor; 
    inner_cur3 sys_refcursor; 
    inner_cur4 sys_refcursor; 
    inner_cur5 sys_refcursor; 
begin
    pkg_cur1s.get(
        pnum_scen_id => 671, 
        pcsr_cur1 => inner_cur1, 
        pcsr_cur2 => inner_cur2,
        pcsr_cur3 => inner_cur3,
        pcsr_cur4 => inner_cur4,
        pcsr_cur5 => inner_cur5
    );

    :outer_cur1 := inner_cur1;
    :outer_cur2 := inner_cur2;
    :outer_cur3 := inner_cur3;
    :outer_cur4 := inner_cur4;
    :outer_cur5 := inner_cur5;
end;

print outer_cur1
print outer_cur2
print outer_cur3
print outer_cur4
print outer_cur5

【讨论】:

但是如何在输出窗口中看到五张表的数据。有什么命令吗?请您编辑代码以在输出窗口中打印输出。 @vikky 我已更新代码以在 Toad 中显示光标

以上是关于在 oracle 中以多个游标作为输出执行过程的主要内容,如果未能解决你的问题,请参考以下文章

Oracle定时任务执行存储过程备份日志记录表

大家帮忙看看Oracle存储过程怎样给变量赋值

Oracle PL/SQL:如何使用可变数组作为输出参数执行过程?

如何通过 SQL Developer 执行带有游标和表 OUT 参数的存储过程?

Oracle数据库存储过程中输出参数为自定义游标类型时,使用call或者exec调用时,用啥来给游标赋值

oracle 存储过程执行动态SQL 返回结果给游标,外部程序获得dataset结果集。