2016-08-25 6 views
1

次のシナリオを与えられた: は、私は基本的に持っているテーブルがある - 特に - 2つの関連コラム:動的なINSERT文は

  • table_nameの(テキスト)
  • データ(hstoreのを)

hstoreのキーがTABLE_NAMEで参照されるテーブルの列に対応します。 私はこれらの2つの列に基づいてINSERTステートメントを自動的に生成して、各キーのデータを参照先テーブルの列に挿入したいとします。基本的にどのテーブルのデータもhstoreカラムに存在することができるので、キーはもちろん変更できます。

このすべてが大きな関数内で起こります。 keys/columは配列で使用できます。

例:

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

結果文:

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

目標は、動的に関係なく、TABLE_NAMEとデータで指定されているもの、右のテーブルにデータを挿入していない機能を持つことです。このような

答えて

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