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;