【问题标题】:Create table with names from rows in a table使用表中行的名称创建表
【发布时间】:2020-09-28 12:37:51
【问题描述】:

我有一个带有一个文本列的表格。我想创建一个函数来创建以原始表的行命名的表。 (然后用我现在不相关的东西填满表格。) 根据我找到here 的例子,我做了这个:

CREATE OR REPLACE FUNCTION public.create_tables(t_name character varying)
RETURNS void AS
$BODY$
DECLARE
    rec RECORD;
BEGIN
    FOR rec IN SELECT table_names FROM format('%I',t_name)
    LOOP
        -- create table with the name as the current row of table_names
        -- do something
        -- in this case I used raise notice to see if it's working
        RAISE NOTICE '%', rec.table_names;
    END LOOP;
END;
$BODY$
 LANGUAGE plpgsql VOLATILE

为此,我收到一条错误消息,提示“column table_names 不存在”,即使这是我的表中包含我要创建的表名的列的名称。由于这是唯一的列,我也尝试过“SELECT *”,但它不起作用

我也试过这个:

CREATE OR REPLACE FUNCTION public.create_tables(t_name character varying)
RETURNS void AS
$BODY$
DECLARE 
    rec RECORD;
BEGIN
    FOR rec IN SELECT * FROM format('%I',t_name)
    LOOP
        RAISE NOTICE '%', rec;
    END LOOP;
END;
$BODY$
 LANGUAGE plpgsql VOLATILE

结果我得到了函数的 t_name 参数。 我也试过直接调用表:

CREATE OR REPLACE FUNCTION public.create_tables()
RETURNS void AS
$BODY$
DECLARE 
    rec RECORD;
BEGIN
    FOR rec IN SELECT table_names FROM mytable
    LOOP
        RAISE NOTICE '%', rec;
    END LOOP;
END;
$BODY$
 LANGUAGE plpgsql VOLATILE

它可以很好地工作并列出所有行,但是将来我想在不同的表上多次使用此函数,因此在函数中为表名提供参数很重要。

【问题讨论】:

    标签: postgresql function for-loop plpgsql psql


    【解决方案1】:

    最简单的方法是使用psql\gexec

    SELECT format(
              'CREATE TABLE %I (id integer PRIMARY KEY);',
              t_name
           )
    FROM table_names \gexec
    

    但您也可以在 PL/pgSQL 循环中循环查询结果并在结果语句中循环EXECUTE

    DO $$DECLARE
       sql text;
    BEGIN
       FOR sql IN
          SELECT format(
                    'CREATE TABLE %I (id integer PRIMARY KEY);',
                    t_name
                 )
          FROM table_names
       LOOP
          EXECUTE sql;
       END LOOP;
    END;$$;
    

    【讨论】:

    • 我不太确定我是否理解正确。我应该在循环中使用它吗?你能详细说明一下吗?我也在使用 pgAdmin III 来创建这个函数。您是否建议使用 psql 控制台更容易?
    • 不,第一个示例不需要循环,它是完整的psql 代码(是的,我认为psql 比pgAdmin 更可取)。我在 PL/pgSQL 中添加了第二个示例,该循环也可以在 pgAdmin 中使用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-23
    • 2022-08-14
    • 1970-01-01
    • 2021-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多