我需要从架构中获取表名,除了一些表
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
运算符?
答案 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
。