外部函数借助引用游标返回多行值

问题描述 投票:0回答:1

我正在学习参考光标、记录类型概念。 以下是我正在尝试的逻辑[我知道其中几行是错误的], 在高层,外部函数“get_modified_ssd_rsd2”将订单号作为参数之一[其下有多行],其中 line_id 一一传递给内部函数。 'get_modified_ssd_rsd1' 这是内部函数,在引用游标中返回 2 个日期。已测试成功。我正在尝试/问的是, 如何通过外部函数返回 orderno、lineid、date1、date2 - 四个参数 [即get_modified_ssd_rsd2] 在 refcursor 中?


CREATE OR REPLACE FUNCTION get_modified_ssd_rsd2 (
    p_depot_i                 IN VARCHAR2,
    p_planned_delivery_dttm   IN DATE,
    p_service_level_id        IN NUMBER,
    p_rmaord_no               IN NUMBER)

    RETURN SYS_REFCURSOR
IS
    CURSOR c1 (p_rmaord_no NUMBER)
    IS SELECT line_id
          FROM SalesOrerLinesTable
         WHERE 1 = 1 AND order_number = 801259549;

    l_ssd              tablename.column%TYPE;
    l_rsd              tablename.column%TYPE;
    l_rmaord_no        tablename.column%TYPE;
    j                  NUMBER := 0;
    l_dates            SYS_REFCURSOR;
    
    TYPE line_ssdrsd_rectype IS REF CURSOR;
    line_ssdrsd_type   line_ssdrsd_rectype;

    TYPE rec_orderline
        IS RECORD
    (
        rmaord_no             tablename.column%TYPE,
        line_id               tablename.column%TYPE,
        schedule_ship_date    tablename.column%TYPE,
        request_ship_date     tablename.column%TYPE
    );
    ro                 rec_orderline;

BEGIN
    l_rmaord_no := p_rmaord_no;

    FOR i IN c1 (l_rmaord_no)LOOP
        j := j + 1;

        l_dates :=
            get_modified_ssd_rsd1 (p_depot_i,
                                   p_planned_delivery_dttm,
                                   p_service_level_id,
                                   i.line_id);

        lst (j).rmaord_no := l_rmaord_no;
        lst (j).line_id := i.line_id;
        lst (j).schedule_ship_date := l_dates.l_ssd;
        lst (j).request_ship_date := l_dates.l_rsd;
    END LOOP;

EXCEPTION
    WHEN OTHERS
    THEN
        DBMS_OUTPUT.put_line (' Error - ' || SQLERRM);

END get_modified_ssd_rsd2;

谢谢!

  • 尝试了管道函数,但无法捕获引用游标中外部函数的结果
  • 尝试过记录类型,在外部函数中记录引用游标的类型,然后在引用游标中捕获内部函数返回的多行......等等,但没有运气。

通过外部函数在 refcursor 中返回结果是强制要求。 谢谢!

function plsql sys-refcursor ref-cursor
1个回答
0
投票

这是您所拥有的一个稍微简化的示例,但应该说明问题(实际上,一个解决方案)。

我没有您的表或其他对象,因此我使用 Scott 的示例架构,其 EMP(员工)表,返回员工姓名、工作和薪资信息。

在 SQL 级别创建类型,而不是在函数内:

SQL> CREATE OR REPLACE TYPE rec_orderline IS OBJECT
  2  (
  3     ename VARCHAR2 (20),
  4     job VARCHAR2 (20),
  5     sal NUMBER
  6  );
  7  /

Type created.

SQL> CREATE OR REPLACE TYPE rot IS TABLE OF rec_orderline;
  2  /

Type created.

功能:

  • 声明适当的变量(
    ro
    是最重要的)
  • 我用游标获取的值填充它(在游标 FOR 循环内)
  • 注意它的完成方式(第 13 和 14 行)
  • 最后,打开引用游标(对于
    ro
    中包含的值)并返回它

SQL> CREATE OR REPLACE FUNCTION f_get (i_deptno IN NUMBER)
  2     RETURN SYS_REFCURSOR
  3  IS
  4     ro      rot := rot ();
  5     j       NUMBER := 0;
  6     retval  SYS_REFCURSOR;
  7  BEGIN
  8     FOR i IN (SELECT ename, job, sal
  9                 FROM emp
 10                WHERE deptno = i_deptno)
 11     LOOP
 12        j := j + 1;
 13        ro.EXTEND;
 14        ro (j) := rec_orderline (i.ename, i.job, i.sal);
 15     END LOOP;
 16
 17     OPEN retval FOR SELECT * FROM TABLE (ro);
 18
 19     RETURN retval;
 20  END;
 21  /

Function created.

测试:

SQL> SELECT f_get (10) FROM DUAL;

F_GET(10)
--------------------
CURSOR STATEMENT : 1

CURSOR STATEMENT : 1

ENAME                JOB                         SAL
-------------------- -------------------- ----------
CLARK                MANAGER                    2450
KING                 PRESIDENT                  5000
MILLER               CLERK                      1300


SQL>

现在,将其应用到您的函数中。

© www.soinside.com 2019 - 2024. All rights reserved.