如何从接受选择查询输入的函数返回数千个id


Create or replace function f(v_input nvarchar2) 
Return t_table
Is
v_table t_table;
BEGIN
Select id bulk collect into v_table from table1 where "USER"=v_input ;
Return v_table;
End; 
/
Select * from table2 where id in (select * from table(f(‘abc’)));

如何在oracle19.0中使用流水线表函数,使用带有大容量收集的limit子句来实现这一点,以减少内存使用并提高性能?

如果不是流水线函数,我们还能用什么?

如何在oracle19.0中使用流水线表函数,使用带有大容量收集的limit子句来实现这一点,以减少内存使用并提高性能?

一个简单的流水线函数是:

CREATE OR REPLACE FUNCTION f(v_input nvarchar2)
RETURN t_table PIPELINED
IS
BEGIN
FOR n IN ( SELECT id FROM table1 WHERE "USER" = v_input )
LOOP
PIPE ROW (n.id);
END LOOP;
END;
/

或者,如果您想使用光标并批量处理id

CREATE OR REPLACE FUNCTION f(v_input nvarchar2)
RETURN t_table PIPELINED
IS
CURSOR v_cur IS
SELECT id
FROM    table1
WHERE   "USER" = v_input;
v_table t_table;
BEGIN
OPEN v_cur;
LOOP
FETCH v_cur BULK COLLECT INTO v_table LIMIT 100;
FOR i IN 1 .. v_table.COUNT LOOP
PIPE ROW (v_table(i));
END LOOP;
EXIT WHEN v_cur%NOTFOUND;
END LOOP;
CLOSE v_cur;
END;
/

然后你可以使用:

SELECT *
FROM   table2
WHERE  id MEMBER OF f('abc');

db<gt;小提琴这里

管道函数不太适合您的用途:额外的上下文开关(SQL<->PL/SQL(、逐行管道、额外的用户定义类型等。

由于您使用的是Oracle19,我建议您尝试SQL表宏(19.6+(:

简单示例:DBFiddle

Create or replace function f(v_input nvarchar2)
return varchar2 sql_macro(table)
is
begin
return 'Select id from table1 where "USER"=v_input';
end;
/

然后您可以将其用作查询中的一个简单表:

Select * 
from f('user1') ff 
join table2 t2 
on t2.id=ff.id; 

相关内容

  • 没有找到相关文章

最新更新