Oracle PL/SQL 数组输入到流水线函数的参数中
Oracle PL/SQL array input into parameter of pipelined function
我是 PL/SQL 的新手。我在一个包内创建了一个流水线函数,它将一个数字数组(嵌套 table)作为其参数输入。
但是我在尝试通过 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;
这是我从蟾蜍 运行ning 尝试过的最新代码。但是不行
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 将数组输入到此流水线函数中。一个例子会非常方便。
谢谢
错误很明显,您有一个未分配任何内容的绑定变量。你需要传递你的实际数组:
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 对功能进行了一些小的调整,以消除我认为来自编辑 post.
的错误
我是 PL/SQL 的新手。我在一个包内创建了一个流水线函数,它将一个数字数组(嵌套 table)作为其参数输入。
但是我在尝试通过 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;
这是我从蟾蜍 运行ning 尝试过的最新代码。但是不行
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 将数组输入到此流水线函数中。一个例子会非常方便。
谢谢
错误很明显,您有一个未分配任何内容的绑定变量。你需要传递你的实际数组:
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 对功能进行了一些小的调整,以消除我认为来自编辑 post.
的错误