首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >PostgreSQL:遍历文本数组并执行SQL

PostgreSQL:遍历文本数组并执行SQL
EN

Stack Overflow用户
提问于 2022-05-27 11:47:14
回答 2查看 79关注 0票数 0

我将表从一种模式复制到另一种模式。我正在试图传递要复制的表的名称的参数。但是,当我执行调用时,不会在Schema中创建任何表。

命令:CALL copy_table('firstname', 'tableName1,tableName2,tableName3');

代码语言:javascript
运行
复制
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;
$$

你能帮忙吗?谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-05-27 13:55:00

函数string_to_array返回一个数组值。循环遍历数组是由FOREACH命令执行的,而不是由FOR执行的。

见文件:

https://www.postgresql.org/docs/14/plpgsql-control-structures.html#PLPGSQL-FOREACH-ARRAY

代码语言:javascript
运行
复制
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;
票数 0
EN

Stack Overflow用户

发布于 2022-05-29 23:04:00

像西蒙建议的那样,用FOREACH循环数组。或在旧版本(或任何版本)中使用FOR。请参见:

通常,基于集合的解决方案会越来越短,但是:

代码语言:javascript
运行
复制
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

调用,传递表名列表:

代码语言:javascript
运行
复制
CALL copy_tables('firstname', 'tableName1', 'tableName2', 'tableName3');

或者,传递真正的数组:

代码语言:javascript
运行
复制
CALL copy_tables('foo', VARIADIC '{tableName1,tableName2,tableName3}');

或者,传递(和转换)逗号分隔的字符串(原始输入):

代码语言:javascript
运行
复制
CALL copy_tables('foo', VARIADIC string_to_array('tableName1,tableName2,tableName3', ','));

我使用format()来安全地连接SQL字符串。注意,标识符必须作为case-sensitive字符串传递!请参见:

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72404966

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档