如何将文本参数传递给 IN 运算符的存储函数

How to pass text parameter to stored function for `IN` operator

我需要从架构中获取 table 个名称,除了一些 tables

CREATE OR REPLACE FUNCTION  func(unnecessary_tables TEXT)
returns void
as $$
begin
      EXECUTE 'SELECT table_name FROM information_schema.tables   
      WHERE 
      table_schema=''public''
      AND 
      table_name NOT IN(  )
      ' USING unnecessary_tables

      --here execute retrieved result, etc ...

end;
$$language plpgsql

然后调用函数

select func('table1'',''table2');

这行不通,returns 结果 table1table2 也一样。

问题是:对于 IN 运算符,如何将文本参数传递给存储函数?

传递文本数组而不是文本:

create or replace function func(unnecessary_tables text[])
returns void as $$
begin
    select table_name
    from information_schema.tables   
    where
        table_schema = 'public'
        and
        not(table_name = any())
    ;
end;
$$language plpgsql    

这样称呼它:

select func(array['t1','t2']::text[]);

顺便说一句,上面的代码可以用 SQL 代替 PL/pgSQL

要回答您确切的问题(如何传递给 IN 运算符的函数文本)您需要:

SELECT func( '''table1'',''table2''');

原因是table名字必须是字符串,所以需要用引号括起来。 为了让它工作,需要对代码进行一个更改,我一开始没有看到:

  CREATE OR REPLACE FUNCTION  func(unnecessary_tables TEXT)
returns void
as $$
begin
      EXECUTE 'SELECT table_name FROM information_schema.tables   
      WHERE 
      table_schema=''public''
      AND 
      table_name NOT IN(' || unnecessary_tables || ')'; 

      --here execute retrieved result, etc ...

end;
$$language plpgsql

它是必需的,因为 USING 知道类型,而不只是 "paste" 参数代替

我认为 none 以上答案不正确。

select pg_typeof(table_name),table_name::text 
   from information_schema.tables   
   where table_schema = 'public';

会return:

             pg_typeof             |        table_name
-----------------------------------+--------------------------
 information_schema.sql_identifier | parent_tree

from 这意味着至少 table_name 应该转换为文本。 这是我的解决方案:

create or replace function n_fnd_tbl(_other_tables text[])
returns table(__table_name text) as 
$$
begin
  return query EXECUTE format('
    select table_name::text
    from information_schema.tables   
    where table_schema = ''public''
    and table_name  <> ''%s''',_other_tables );
end
$$language plpgsql;

然后调用它:

select * from n_fnd_tbl(array['tableb','tablea']::text[]);