我正在寻找在表中解析、验证和插入数据的最快方法( Postgresql 9.3)。
数据是一个包含 1..N 个项目的 json 数组。
[{"name":"a","value":"1"},{"name":"b","value":"2"}]
该表如下所示:
CREATE TABLE logs
(
id serial NOT NULL,
name text ,
value text,
CONSTRAINT "log_Pkey" PRIMARY KEY (id)
);
为此,我有存储过程:
CREATE OR REPLACE FUNCTION insert_logs(v json)
RETURNS integer AS
$BODY$
DECLARE
sql text;
i json;
logs_part_id int;
BEGIN
SELECT INTO logs_part_id id from another_table_with_that_id where some_condition.
sql = '';
FOR i IN SELECT * FROM json_array_elements(v)
LOOP
sql = sql||'insert into logs_'||logs_part_id ||'
(name, value)
values( ' ||quote_literal(i->>'name')||' , ' ||quote_literal(i->>'value')||' );';
END LOOP;
raise notice '%',sql;
EXECUTE sql;
return 1;
END
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
(函数返回整数作为响应状态)
函数调用:
select * from insert_logs('[{"name":"a","value":"1"},{"name":"b","value":"2"}]'::json);
实际上,“insert..”语句要大得多——要插入 15 列,显然应该检查其中的一些列,以防止 sql 注入。
问题:有没有办法重写这个存储过程以提高性能?我应该使用准备好的语句吗?
编辑。
我构建 sql 字符串的原因是因为表分区导致表名未知。表名格式为:logs_id where id - int 是在插入之前获得的。