我将表从一种模式复制到另一种模式。我正在试图传递要复制的表的名称的参数。但是,当我执行调用时,不会在Schema中创建任何表。
命令:CALL copy_table('firstname', 'tableName1,tableName2,tableName3');
CREATE OR REPLACE PROCEDURE copy_table(user VARCHAR(50), strs TEXT)
LANGUAGE PLPGSQL
AS $$
DECLARE
my_array TEXT;
BEGIN
FOR my_array IN
SELECT string_to_array(strs, ',')
LOOP
EXECUTE 'CREATE TABLE ' || user || '.' || my_array || ' (LIKE public.' || my_array || ' INCLUDING ALL)';
END LOOP;
$$
你能帮忙吗?谢谢。
发布于 2022-05-27 13:55:00
函数string_to_array
返回一个数组值。循环遍历数组是由FOREACH
命令执行的,而不是由FOR
执行的。
见文件:
https://www.postgresql.org/docs/14/plpgsql-control-structures.html#PLPGSQL-FOREACH-ARRAY
CREATE FUNCTION sum(int[]) RETURNS int8 AS $$
DECLARE
s int8 := 0;
x int;
BEGIN
FOREACH x IN ARRAY $1
LOOP
s := s + x;
END LOOP;
RETURN s;
END;
$$ LANGUAGE plpgsql;
发布于 2022-05-29 23:04:00
像西蒙建议的那样,用FOREACH
循环数组。或在旧版本(或任何版本)中使用FOR
。请参见:
通常,基于集合的解决方案会越来越短,但是:
CREATE OR REPLACE PROCEDURE copy_tables(_schema text, VARIADIC _tables text[])
LANGUAGE plpgsql AS
$proc$
BEGIN
EXECUTE
(SELECT string_agg(format('CREATE TABLE %1$I.%2$I (LIKE public.%2$I INCLUDING ALL)', _schema, t), E';\n')
FROM unnest(_tables) t);
END
$proc$;
关于VARIADIC
调用,传递表名列表:
CALL copy_tables('firstname', 'tableName1', 'tableName2', 'tableName3');
或者,传递真正的数组:
CALL copy_tables('foo', VARIADIC '{tableName1,tableName2,tableName3}');
或者,传递(和转换)逗号分隔的字符串(原始输入):
CALL copy_tables('foo', VARIADIC string_to_array('tableName1,tableName2,tableName3', ','));
我使用format()
来安全地连接SQL字符串。注意,标识符必须作为case-sensitive字符串传递!请参见:
https://stackoverflow.com/questions/72404966
复制相似问题