2016-08-25 135 views
1

給出以下情形: 我基本上有一個表 - 等等 - 2相關列:動態INSERT語句

  • 表名(文本)
  • 數據(hstore)

hstore鍵對應於table_name中引用的表的列。 我想自動生成一個基於這兩列的INSERT語句,將每個鍵的數據插入到引用表的列中。關鍵當然可以有所不同,因爲基本上任何表的數據都可以存在於hstore列中。

所有這一切發生在一個更大的功能。鍵/柱可用於數組中。

實施例:

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

所得聲明:

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

的目標是具有動態數據插入到右表,不管是什麼在表名和數據指定的功能。

回答

1

像這樣的東西可以工作:

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; 
+0

太好了,謝謝!非常有用的功能。我現在只需要擺弄數據類型,因爲函數假定每個值都是一個字符串。 – andehhh