基于 hstore 键的动态 INSERT 语句

Dynamic INSERT statement based on hstore keys

给定以下场景: 我有一个 table,其中基本上有 2 个相关列:

hstore 键对应于 table_name 中引用的 table 的列。 我想根据这 2 列自动生成一个 INSERT 语句,将每个键的数据插入到引用 table 的列中。键当然可以变化,因为基本上任何 table 的数据都可以出现在 hstore 列中。

所有这些都发生在一个更大的函数中。 keys/colums 在一个数组中可用。

示例:

table_name = test_table
data = "id"=>"1", "trans"=>"4", "comment"=>"asdf"

结果语句:

INSERT INTO test_table (id, trans, comment) VALUES (1,4,'asdf');

目标是有一个函数,可以动态地将数据插入到右边 table,而不管 table_name 和数据中指定的是什么。

类似这样的方法可行:

CREATE OR REPLACE FUNCTION test.ins(table_name character varying, data jsonb)
    RETURNS character varying AS
$BODY$
DECLARE
    _keys character varying;
    _vals character varying;
    _comma character varying;
    x RECORD;
BEGIN
    _keys = '';
    _vals = '';
    _comma = '';
    FOR x IN (SELECT * FROM jsonb_each(data))
    LOOP
        _keys = _keys || _comma || x.key;
        _vals = _vals || _comma || x.value;
        _comma = ', ';
    END LOOP;
    RETURN 'INSERT INTO ' || table_name || ' (' || _keys || ') VALUES (' || _vals || ')';
END
$BODY$
    LANGUAGE plpgsql IMMUTABLE
    COST 100;