Oracle Pipelined功能

时间:2016-11-16 11:05:47

标签: 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;
/

预期结果是一个包含“na”到“nb”记录的表格,包括在内。

但是编译函数时出现此错误:

  

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

2 个答案:

答案 0 :(得分:5)

  

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

答案 1 :(得分:0)

CREATE OR REPLACE FUNCTION gen_nums (na NUMBER, nb NUMBER)
RETURN sys.DBMS_DEBUG_VC2COLL PIPELINED --sys.DBMS_DEBUG_VC2COLL an oracle provided collection type.
IS
    counter NUMBER;
BEGIN
    counter := na;
    WHILE (counter <= nb)
    LOOP
        PIPE ROW (counter);
        counter := counter + 1;
    END LOOP;
    RETURN;
END gen_nums;