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

Oto Shavadze picture Oto Shavadze · Dec 1, 2015 · Viewed 10.8k times · Source

I need obtain table names from schema, except some 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( $1 )
      ' USING unnecessary_tables

      --here execute retrieved result, etc ...

end;
$$language plpgsql

Then call function

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

This not works and returns in result table1 and table2 also.

Question is: How to pass text parameter to stored function, for IN operator ?

Answer

Clodoaldo Neto picture Clodoaldo Neto · Dec 1, 2015

Pass a text array in instead of text:

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    

Call it like:

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

BTW the code above can be plain SQL in instead of PL/pgSQL