1

我是 PL/SQL 的新手。我在一个包中创建了一个流水线函数,该函数将一个数字数组(嵌套表)作为其参数输入。

但是我在尝试通过 sql 查询运行它时遇到了麻烦。请看下面

我的输入数组

 CREATE OR REPLACE TYPE num_array is TABLE of number;

我的函数声明

CREATE OR REPLACE PACKAGE "my_pack" as
    TYPE myRecord is RECORD(column_a NUMBER);
    TYPE myTable IS TABLE of myRecord;

    FUNCTION My_Function(inp_param num_array) return myTable PIPELINED;

end my_pack;

我的函数定义

CREATE OR REPLACE PACKAGE BODY "my_pack" as

FUNCTION My_Function(inp_param num_array) return myTable PIPELINED as
        rec myRecord;
    BEGIN

        FOR i in 1..inp_param.count LOOP
            FOR e IN 
                (
                   SELECT column_a FROM  table_a where id=inp_param(i)

                )
                LOOP
                rec.column_a := e.column_a;

                PIPE ROW (rec); 

            END LOOP;
        END LOOP;

    RETURN;
END;

end my_pack;

这是我尝试从 toad 运行的最新代码。但它不起作用

declare
    myarray num_array;
    qrySQL varchar2(4000);
begin
    myarray := num_array(6341,6468);
    qrySQL := 'select * from TABLE(my_pack.My_Function(:myarray))';
    execute immediate qrySQL;
end;

所以我的问题是如何将数组从 TOAD 或 SQL Developer 提供给这个流水线函数。一个例子真的很方便。

谢谢

4

1 回答 1

1

错误很明显,您有一个未分配任何内容的绑定变量。您需要通过以下方式传递您的实际数组:

qrySQL := 'select * from TABLE(my_pack.My_Function(:myarray))';
execute immediate qrySQL using myarray;

如果您想从 PL/SQL 调用它,使用静态 SQL 作为游标可能更有用:

set serveroutput on
declare
    myarray num_array;
begin
    myarray := num_array(6341,6468);
    for r in (select * from TABLE(my_pack.My_Function(myarray))) loop
      dbms_output.put_line(r.column_a);
    end loop;
end;
/

或者只是静态查询它作为测试,对于固定值:

select * from TABLE(my_pack.My_Function(num_array(6341,6468)));

SQL Fiddle对函数进行了一些小的调整,以消除我认为来自编辑到发布的错误。

于 2015-02-03T15:49:00.373 回答