2016-08-25 4 views
1

дал следующий сценарий: У меня есть таблица, которая в основном имеет - среди других - 2 соответствующих столбцов:Динамический оператор INSERT на основе ключей hstore

  • table_name (текст)
  • данных (hstore)

Ключи hstore соответствуют столбцам таблицы, на которые ссылается имя_таблицы. Я хотел бы автоматически генерировать инструкцию INSERT на основе тех двух столбцов, которые вставляют данные каждого ключа в столбцы этой ссылочной таблицы. Разумеется, ключи могут меняться, так как в таблице hstore могут присутствовать данные любой таблицы.

Все это происходит в рамках большей функции. Клавиши/столбцы доступны в массиве.

Пример:

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

Смежные вопросы