我尝试使用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进行类型声明,并返回此类型时,我有编译问题,因为类型未声明...
谢谢
答案 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;
/