7

我需要从模式中获取表名,除了一些表

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( $1 )
      ' USING unnecessary_tables

      --here execute retrieved result, etc ...

end;
$$language plpgsql

然后调用函数

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

这不起作用并返回 table1结果table2

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

4

3 回答 3

10

传入一个文本数组而不是文本:

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($1))
    ;
end;
$$language plpgsql    

像这样称呼它:

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

顺便说一句,上面的代码可以是纯 SQL 而不是 PL/pgSQL

于 2015-12-01T13:11:15.737 回答
3

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

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

原因是表名必须是字符串,所以它们需要在引号内。为了使其正常工作,需要对代码进行一个更改,而我一开始没有看到:

  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它知道类型并且不只是“粘贴”参数来代替$1.

于 2015-12-01T13:13:25.247 回答
0

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

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

它将返回:

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

从这意味着至少应该将 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[]);
于 2021-12-14T07:32:44.550 回答