Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle流水线函数_Oracle_Plsql_Pipelined Function - Fatal编程技术网

Oracle流水线函数

Oracle流水线函数,oracle,plsql,pipelined-function,Oracle,Plsql,Pipelined Function,我试图创建一个函数,它返回一个可以在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 PIPEL

我试图创建一个函数,它返回一个可以在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;
/
创建类型结构作为对象
(
我的号码
);
创建类型tp_struct作为类型_struct的表;
创建或替换功能gen_nums(na编号、nb编号)
返回tp_结构流水线
是
rec类型结构;
计数器编号;
开始
计数器:=na;
WHILE(计数器
创建或替换功能gen_nums(na编号、nb编号)
返回sys.DBMS_DEBUG_VC2COLL PIPELINED--sys.DBMS_DEBUG_VC2COLL oracle提供的集合类型。
是
计数器编号;
开始
计数器:=na;
WHILE(柜台)
ORA 00932不一致的数据类型预期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;
/
创建类型tp_编号作为编号表;
/
创建或替换功能gen_nums(na编号、nb编号)
返回tp_编号
是
返回\u值tp\u编号;
开始
选择(na+级别)-1
批量收集到返回值中
来自双重

按级别连接由于内部分配名称与参数名称不匹配,您的代码将无法编译。如果您要编辑代码以进行发布,请确保其仍然正确。感谢您的注意!编辑完成!谢谢!回复很好,并帮助我更好地了解如何实现此功能!
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;
/