Oracle 流水线功能

Posted

技术标签:

【中文标题】Oracle 流水线功能【英文标题】:Oracle Pipelined function 【发布时间】:2016-11-16 11:05:47 【问题描述】:

我正在尝试创建一个函数,该函数返回一个可在 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 得到了编号

【问题讨论】:

您的代码无法编译,因为内部赋值名称与参数名称不匹配。如果您要编辑发布代码,请确保它仍然正确。 感谢您的关注!编辑完成! 【参考方案1】:

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

【讨论】:

谢谢!很好的回复,帮助我更好地了解如何实施!【参考方案2】:
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;

【讨论】:

以上是关于Oracle 流水线功能的主要内容,如果未能解决你的问题,请参考以下文章

Oracle ebs 中如何查找银行流水

任何人都可以帮助我使用流水线功能吗?

Oracle 流水线表函数并将结果插入到 Oracle 表中

Oracle SQL - 如何使用 JSP 调用 ODCI 流水线函数

在 PL/SQL Oracle 中需要此 T-Sql 函数的等效函数。如果有其他解决方案,那么流水线

oracle 中生成流水号 方法