Oracle 流水线函数
Oracle Pipelined function
我正在尝试创建一个函数,其中 returns 一个可以在 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;
/
预期结果是 table,记录从 'na' 到 'nb',包括两者。
但是我在编译函数时遇到这个错误:
ORA 00932 inconsistent datatypes expected udt got number
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;
ORA 00932 inconsistent datatypes expected udt got number
你得到这个是因为你的代码为输出类型分配了一个标量。您需要强制转换变量以匹配赋值目标。所以:
SELECT type_struct(counter)
INTO rec
FROM dual;
您不一定需要流水线函数。我们可以将 table()
与 returns 集合的任何函数一起使用。
这里有一个更简单的实现,它只需要一个 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;
/
我正在尝试创建一个函数,其中 returns 一个可以在 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;
/
预期结果是 table,记录从 'na' 到 'nb',包括两者。
但是我在编译函数时遇到这个错误:
ORA 00932 inconsistent datatypes expected udt got number
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;
ORA 00932 inconsistent datatypes expected udt got number
你得到这个是因为你的代码为输出类型分配了一个标量。您需要强制转换变量以匹配赋值目标。所以:
SELECT type_struct(counter)
INTO rec
FROM dual;
您不一定需要流水线函数。我们可以将 table()
与 returns 集合的任何函数一起使用。
这里有一个更简单的实现,它只需要一个 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;
/