如何将文本参数传递给 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 结果 table1
和 table2
也一样。
问题是:对于 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[]);
我需要从架构中获取 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 结果 table1
和 table2
也一样。
问题是:对于 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[]);