Oracle Pipelined函数

努诺·瓦伦特(Nuno Valente)

我正在尝试创建一个函数,该函数返回可以在FROM子句中使用的对象。根据Oracle文档的研究,我发现一个管道函数正是我需要的。

我有以下代码:

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;
/

预期的结果是一个表,记录中包含从“ na”到“ nb”(包括两者)的内容。

但是我编译功能时出现此错误:

ORA 00932预期udt的数据类型不一致

装甲运兵车

ORA 00932 inconsistent datatypes expected udt got number

之所以会这样,是因为您的代码将标量分配给了输出类型。您需要强制转换变量以匹配分配目标。所以:

   SELECT type_struct(counter)
    INTO rec
    FROM dual;

你不一定需要一个管道函数。我们可以将其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;
/

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章