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:以我的经验,在FormatString concatenation之间选择一个解决方案即可,不要在一个查询中同时使用这两个,这让我很难查看和查找错误。

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

循环请参考文档here

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

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