【发布时间】: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