我正在学习参考光标、记录类型概念。 以下是我正在尝试的逻辑[我知道其中几行是错误的], 在高层,外部函数“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 中返回结果是强制要求。 谢谢!
这是您所拥有的一个稍微简化的示例,但应该说明问题(实际上,一个解决方案)。
我没有您的表或其他对象,因此我使用 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
是最重要的)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>
现在,将其应用到您的函数中。