postgresql create function动态地将值插入到不同的表中

时间:2018-03-29 02:21:14

标签: postgresql plpgsql dynamic-sql

我想创建一个可以动态地将任何数据类型值插入任何表和多列的函数。但我的函数只能将一个值插入一列:

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($1 as '||datatype||'))',tablename,columname);

end;
$BODY$;

任何人都可以帮忙吗?

1 个答案:

答案 0 :(得分:0)

我不明白你的想法。我想你想写一个函数插入到表中,列表中包含您指定的列和值。 如果我猜对了。我建议这样的功能:

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:根据我的经验,只需在FormatString concatenation之间选择一个解决方案,不要在一个查询中同时使用它们,这使我很难查看并发现错误。

-------------以下问题更新------------------------------ -----

对于循环,请参阅文档here

基本上,它将从1运行到n(n是数组中的数字元素)并构建查询。

查看其运行方式的一个简单方法是,您可以将一些打印输出数据放入您的函数中,例如RAISE。请参阅文档here