Nun*_*nte 3 oracle plsql pipelined-function
我正在尝试创建一个函数,它返回一个可以在FROM子句中使用的对象.根据对oracle文档的研究,我发现PIPELINED函数是我需要的.
我有这个代码:
CREATE TYPE type_struct AS OBJECT
(
i NUMBER
);
CREATE TYPE tp_struct AS TABLE OF type_struct;
CREATE OR REPLACE FUNCTION gen_nums (na NUMBER, nb NUMBER)
RETURN tp_struct PIPELINED
IS
rec type_struct;
counter NUMBER;
BEGIN
counter := na;
WHILE (counter <= nb)
LOOP
SELECT counter
INTO rec
FROM dual;
counter := counter + 1;
PIPE ROW (rec);
END LOOP;
RETURN;
END gen_nums;
/
Run Code Online (Sandbox Code Playgroud)
预期结果是一个表格,其中包含从"na"到"nb"的记录.
但是在编译函数时出现此错误:
ORA 00932不一致的数据类型预计udt得到的数字
ORA 00932 inconsistent datatypes expected udt got number
你得到这个,因为你的代码为输出类型分配了一个标量.您需要转换变量以匹配分配目标.所以:
SELECT type_struct(counter)
INTO rec
FROM dual;
Run Code Online (Sandbox Code Playgroud)
您不一定需要流水线功能.我们可以使用table()任何返回集合的函数.
这是一个更简单的实现,只需要一个UDT.
CREATE TYPE tp_numbers AS TABLE OF number;
/
CREATE OR REPLACE FUNCTION gen_nums (na NUMBER, nb NUMBER)
RETURN tp_numbers
IS
return_value tp_numbers ;
BEGIN
SELECT (na + level) - 1
bulk collect INTO return_value
FROM dual
connect by level <= nb;
RETURN return_value ;
END gen_nums;
/
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1612 次 |
| 最近记录: |