postgresql 创建函数动态地将值插入不同的 table
postgresql create function dynamically insert value into different table
我想创建一个函数,可以将任何数据类型的值动态插入到任何 table 和多列中。但是我的函数只能向一列插入一个值:
CREATE OR REPLACE FUNCTION public.dynamic_insert(
tablename character varying,
columname character varying,
datatype character varying,
valuee text
)
RETURNS void
LANGUAGE 'plpgsql'
COST 100
VOLATILE AS
$BODY$
begin
Execute format('insert into %I ('||columname||')
values (cast( as '||datatype||'))',tablename,columname);
end;
$BODY$;
有人能帮忙吗?
我不是很清楚你的想法。我猜您想编写一个函数以使用您指定的列列表和值插入到 table 中。
如果我猜对了。我建议这样的功能:
CREATE OR REPLACE FUNCTION public.dynamic_insert(
tablename character varying,
columname character varying[],
datatype character varying[],
valuee character varying[]
)
RETURNS void AS
$BODY$
DECLARE
var_sql varchar;
var_sql_column varchar := '';
var_sql_values varchar := '';
begin
var_sql_column := CONCAT('("',ARRAY_TO_STRING(columname, '","'),'")');
FOR i IN 1..ARRAY_LENGTH(columname,1)
LOOP
var_sql_values := var_sql_values || quote_literal(valuee[i]) || '::' || datatype[i] || ',';
END LOOP;
var_sql_values := CONCAT('(',regexp_replace(var_sql_values, ',$', '', 'g'),')');
var_sql := CONCAT('INSERT INTO ', quote_ident(tablename), var_sql_column, ' VALUES ', var_sql_values);
IF (var_sql IS NOT NULL) THEN
EXECUTE(var_sql);
END IF;
end;
$BODY$;
LANGUAGE 'plpgsql'
COST 100
VOLATILE;
希望它符合您的要求。
p/s:以我的经验,在Format
和String concatenation
之间选择一个解决方案即可,不要在一个查询中同时使用这两个,这让我很难查看和查找错误。
------------ 更新以下问题---------------------------- ------
循环请参考文档here
基本上,它将 运行 从 1 到 n(n 是数组中的元素数)并构建一个查询。
查看它的一个简单方法 运行 是您可以将一些打印输出数据放入您的函数中,例如 RAISE
。请参考文档 here
我想创建一个函数,可以将任何数据类型的值动态插入到任何 table 和多列中。但是我的函数只能向一列插入一个值:
CREATE OR REPLACE FUNCTION public.dynamic_insert(
tablename character varying,
columname character varying,
datatype character varying,
valuee text
)
RETURNS void
LANGUAGE 'plpgsql'
COST 100
VOLATILE AS
$BODY$
begin
Execute format('insert into %I ('||columname||')
values (cast( as '||datatype||'))',tablename,columname);
end;
$BODY$;
有人能帮忙吗?
我不是很清楚你的想法。我猜您想编写一个函数以使用您指定的列列表和值插入到 table 中。 如果我猜对了。我建议这样的功能:
CREATE OR REPLACE FUNCTION public.dynamic_insert(
tablename character varying,
columname character varying[],
datatype character varying[],
valuee character varying[]
)
RETURNS void AS
$BODY$
DECLARE
var_sql varchar;
var_sql_column varchar := '';
var_sql_values varchar := '';
begin
var_sql_column := CONCAT('("',ARRAY_TO_STRING(columname, '","'),'")');
FOR i IN 1..ARRAY_LENGTH(columname,1)
LOOP
var_sql_values := var_sql_values || quote_literal(valuee[i]) || '::' || datatype[i] || ',';
END LOOP;
var_sql_values := CONCAT('(',regexp_replace(var_sql_values, ',$', '', 'g'),')');
var_sql := CONCAT('INSERT INTO ', quote_ident(tablename), var_sql_column, ' VALUES ', var_sql_values);
IF (var_sql IS NOT NULL) THEN
EXECUTE(var_sql);
END IF;
end;
$BODY$;
LANGUAGE 'plpgsql'
COST 100
VOLATILE;
希望它符合您的要求。
p/s:以我的经验,在Format
和String concatenation
之间选择一个解决方案即可,不要在一个查询中同时使用这两个,这让我很难查看和查找错误。
------------ 更新以下问题---------------------------- ------
循环请参考文档here
基本上,它将 运行 从 1 到 n(n 是数组中的元素数)并构建一个查询。
查看它的一个简单方法 运行 是您可以将一些打印输出数据放入您的函数中,例如 RAISE
。请参考文档 here