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

时间:2015-12-01 12:59:07

标签: postgresql plpgsql postgresql-9.5

我需要从架构中获取表名,除了一些表

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');

这不起作用,并在结果table1table2中返回。

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

2 个答案:

答案 0 :(得分: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[]);

BTW上面的代码可以是普通的SQL而不是PL / pgSQL

答案 1 :(得分:2)

回答您的确切问题(如何传递给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