0
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’)));

如何使用 oracle 19.0 中的流水线表函数来实现这一点,使用带有批量收集的限制子句来减少内存使用量并提高性能?

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

4

2 回答 2

1

如何使用 oracle 19.0 中的流水线表函数来实现这一点,使用带有批量收集的限制子句来减少内存使用量并提高性能?

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

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批量处理 s:

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<>在这里摆弄

于 2022-02-14T21:43:39.867 回答
0

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

由于您使用的是 Oracle 19,我建议您尝试SQL Table Macros (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; 
于 2022-02-14T23:37:37.303 回答