我创建了一个供我使用。下面以json作为输入并创建动态SQL查询并执行。
示例用法
create table employee(name character varying(20), address character varying(100), basic integer);
--sample call-1
call insert_into(true, 'employee', '{
"name" : "''Ravi Kumar''",
"address" : "''#1, 2nd Cross, Bangalore''",
"basic" : 35000
}',
'');
--sample call-2
call insert_into(true, 'employee', '{
"name" : "eo.name",
"address" : "eo.address",
"basic" : "eo.basic"
}',
'
from employee_old eo
');
程序
CREATE or REPLACE PROCEDURE insert_into(
debug BOOLEAN,
tableName TEXT,
jsonTxt json,
fromWhere TEXT
)
LANGUAGE plpgsql
as $$
DECLARE
field TEXT;
fieldQuery TEXT;
valueQuery TEXT;
finalQuery TEXT;
noOfRecords INT;
BEGIN
IF debug THEN
raise notice 'preparing insert query';
END IF;
fieldQuery := CONCAT('INSERT INTO ', tableName, '(', E'\n');
valueQuery := CONCAT('SELECT ', E'\n');
FOR field IN SELECT * FROM json_object_keys(jsonTxt)
LOOP
fieldQuery := CONCAT(fieldQuery, field, E',\n');
valueQuery := CONCAT(valueQuery, json_extract_path_text(jsonTxt, field), E',\n');
END LOOP;
fieldQuery := RTRIM(fieldQuery, E',\n');
fieldQuery := CONCAT(fieldQuery, ')');
valueQuery := RTRIM(valueQuery, E',\n');
finalQuery := CONCAT(fieldQuery, E'\n', valueQuery, E'\n', fromWhere, ';');
IF debug THEN
RAISE NOTICE 'query:: %', finalQuery;
END IF;
EXECUTE finalQuery;
get diagnostics noOfRecords = row_count;
RAISE NOTICE 'Inserted:: %', noOfRecords;
END
$$;