【发布时间】:2020-08-20 14:20:01
【问题描述】:
我目前正在尝试想出一种从 PL/SQL 包返回数据集合的方法。以下代表包中指定的内容以及我正在尝试做的事情:
这是包装规格:
TYPE MYRECORD IS RECORD
(
ID NUMBER,
SOME_TEXT1 VARCHAR2(50),
SOME_TEXT2 VARCHAR2(50),
SOME_TEXT3 VARCHAR2(50),
SOME_TEXT4 VARCHAR2(255),
);
TYPE VTABLE is table of MYRECORD;
FUNCTION lookup_values (
ANUMBER IN VARCHAR2,
SOMETEXT1 IN VARCHAR2,
SOMETIME IN VARCHAR2,
) RETURN VTABLE
当我在函数中引用 VTABLE 的实例时,我的问题就出现了:
这是在包体中:
FUNCTION Lookup_Values(
ANUMBER IN VARCHAR2,
SOME_TEXT1 IN VARCHAR2,
SOME_TIME IN VARCHAR2,
) RETURN VTABLE
IS
v_records VTABLE;
r_record MYRECORD;
CURSOR OUR_RECORDS IS
SELECT * FROM OUR_TABLE
BEGIN
OPEN OUR_RECORDS
LOOP
FETCH OUR_RECORDS
INTO r_record;
EXIT WHEN OUR_RECORDS %NOTFOUND;
-- I want to do something like the pseudo code below. Is it possible?
v_records.Extend(1);
v_records.ID := r_record.ID;
v_records.SOME_TEXT1 := r_record.SOMETEXT1;
v_records.SOME_TEXT2 := r_record.SOMETEXT2;
v_records.SOME_TEXT3 := r_record.SOMETEXT3;
v_records.SOME_TEXT4 := r_record.SOMETEXT4;
END LOOP;
RETURN (v_records);
END;
希望我已经设法传达了我想要实现的目标。道歉并非如此。如果有什么不清楚的,请反馈回来,我会尽力澄清。
亲切的问候 保罗·J。
【问题讨论】:
-
很有可能。你的方法是正确的。我没有从一般语法的角度进行检查,但这应该可以工作并为您提供所需的结果。
-
我相信您只是缺少集合的初始化。试试
v_records VTABLE := VTABLE(); -
正如@ChrisHep 所指出的,您需要初始化 v_records,但您还需要将索引引用到您正在分配值的 v_records 中,例如
v_records(v_records.last).id := r_record.id;
标签: plsql oracle11g oracle-sqldeveloper