【问题标题】:how to fetch plsql table type values into refcursor如何将 plsql 表类型值提取到 refcursor
【发布时间】:2019-03-11 14:45:12
【问题描述】:

我正在尝试创建一个过程,其中正在调用另一个过程并返回 pl/sql 表类型。如何将 plsql 表的值收集到 ref 游标中并作为 OUT 类型的 refcursor 返回。请帮忙。

谢谢!

我有这段代码:p_rec 是表类型

DECLARE

p_rec PORTAL_LOAD_PKG.header_tab@test_link;
p_status VARCHAR2(200);

BEGIN

DASHBOARD_PRC@test_link('XYZ LIMITED', p_rec, p_status);

END;

上面的代码工作正常,但我的要求是创建一个返回 refcursor 中 p_rec 值的过程。

【问题讨论】:

  • 请使用标签下方的edit 按钮编辑您的问题,并添加运行上述代码时发生的情况的说明。谢谢。

标签: oracle plsql plsqldeveloper


【解决方案1】:

终于解决了。

首先我们必须在本地创建一个 Object 和 table 类型。对象定义应该 与您在远程数据库上声明的记录类型相同。

CREATE OR REPLACE TYPE dashboard_obj AS OBJECT (
    i_num         VARCHAR2(500),
    desc          VARCHAR2(1000),
    od_num        VARCHAR2(200),
    i_amount      NUMBER,
    amount_paid   NUMBER,
    status        VARCHAR2(200),
    terms_date    DATE,
    i_id          NUMBER,
    v_id          NUMBER
);

之后创建该对象的表类型。

CREATE OR REPLACE TYPE tab1 IS
    TABLE OF dashboard_obj;

现在创建程序:

    CREATE OR REPLACE PROCEDURE proc_test (
        recordset OUT SYS_REFCURSOR
    ) IS

        p_rec      portal_load_pkg.header_tab@test_link;
        p_status   VARCHAR2(200);
        obj        dashboard_obj;
        v_tab      tab1 := tab1 ();
    BEGIN
        dashboard_prc@test_link ( 'XYZ LIMITED',p_rec,p_status );
        FOR i IN 1.._rec.count LOOP
            v_tab.extend;
            v_tab(v_tab.count) := dashboard_obj(p_rec(i).i_num,
                                                p_rec(i).desc,
                                                p_rec(i).od_num,
                                                p_rec(i).i_amount,
                                                p_rec(i).amount_paid,
                                                p_rec(i).status,
                                                p_rec(i).terms_date,
                                                p_rec(i).i_id,
                                                p_rec(i).v_id
                                               );

        END LOOP;

        OPEN recordset FOR SELECT
                              *
                          FROM
                              TABLE ( v_tab );

    END;

如果有其他解决方案,请告诉我。谢谢!

【讨论】:

    猜你喜欢
    • 2021-05-03
    • 2018-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-22
    • 2020-09-24
    • 1970-01-01
    • 2022-08-20
    相关资源
    最近更新 更多