如何返回PL / SQL中的列表

时间:2017-11-03 20:54:30

标签: sql oracle plsql

我尝试使用Oracle 11在函数PL / SQL中返回char列表,​​但没有成功。 我理解他们的跑步时遇到了一些困难...

例如,我为测试创建了此代码:

    create type test is table of varchar(500);
/

CREATE OR REPLACE FUNCTION test2 (id INT)
RETURN test
is
tt_t test;
BEGIN

SELECT descriptifSpecifique INTO tt_t(1)
FROM DECOMPOSE
where idRecette=id
AND idEtape=2;


SELECT descriptifSpecifique INTO tt_t(2)
FROM DECOMPOSE
where idRecette=id
AND idEtape=3;
RETURN tt_t;
END;
/


show errors function test;

创建的函数没有编译问题,但在执行时,我收到此消息:ORA-06531:未初始化集合的引用。

另外,如何返回一个类型(例如,使用varchar和一个由select生成的int)IN PL / SQL。因为当我尝试使用RECORD进行类型声明,并返回此类型时,我有编译问题,因为类型未声明...

谢谢

1 个答案:

答案 0 :(得分:1)

你基本上是这样做的。但是在将新元素添加到其中之前,您需要EXTEND您的收藏。

就我个人而言,我更喜欢BULK COLLECT进入集合,以避免必须EXTEND并管理每个索引的条目。像这样(代码未经测试):

CREATE OR REPLACE FUNCTION test2 (id INT)
RETURN test
is
tt_t test;
BEGIN

SELECT descriptifSpecifique
BULK COLLECT INTO tt_t
FROM DECOMPOSE
where idRecette=id
AND idEtape IN (2,3)
ORDER BY idEtape;

RETURN tt_t;
END;
/

要返回包含多列的TYPE,您需要创建两种类型:OBJECT类型和TABLE OF该对象类型。

像这样,

CREATE TYPE test_rec IS OBJECT ( a_varchar VARCHAR2(500), a_number NUMBER);

CREATE TYPE test_tbl IS TABLE OF test_rec;

然后,您可以相应地修改您的功能:

CREATE OR REPLACE FUNCTION test2 (id INT)
RETURN test_tbl
is
tt_t test_tbl;
BEGIN

SELECT test_rec(idEtape, descriptifSpecifique)
BULK COLLECT INTO tt_t
FROM DECOMPOSE
where idRecette=id
AND idEtape IN (2,3)
ORDER BY idEtape;

RETURN tt_t;
END;
/