我有多达100个项目,我想插入一批操作。我是这样做的:
INSERT INTO MyTable (f1, f2, ..., fk) VALUES
(v11, v12, ..., v1k),
(v21, v22, ..., v2k),
...
(vn1, vn2, ..., vnk)一切都很好,但是我正在通过按原样连接值来构建这个字符串,这意味着我的代码容易受到SQL注入的影响。
一方面,如何继续使用批量插入语法,但又不受SQL注入的影响?
编辑1
我想提供一个更多的背景。我将要使用的实际SQL (此时编写代码)有以下形式:
WITH new_parent AS (
INSERT into parent (g1, g2, ..., gm) VALUES (v1, v2, ..., vm) RETURNING id
) INSERT INTO MyTable (parent_id, f1, f2, ..., fk) VALUES
(new_parent.id, v11, v12, ..., v1k),
(new_parent.id, v21, v22, ..., v2k),
...
(new_parent.id, vn1, vn2, ..., vnk)发布于 2013-10-20 13:22:07
使用复制语句--如果可能的话。它有点快,需要的内存要少得多,而且它是SQL注入防弹的--因为数据使用的是不同的通道。
发布于 2021-01-28 08:31:19
您可以构建一个串联的参数字符串,而不是实际的值,然后用一个数组传递值,其中包括所有的值。例如:
CREATE TYPE paramValues AS {
"ID" integer,
"V1" text
.
.
.
}
CREATE OR REPLACE FUNCTION bulk(data paramValues[])
RETURNS integer AS
$BODY$
DECLARE
BEGIN
WITH new_parent AS (
INSERT into parent (g1, g2, ..., gm) VALUES (v1, v2, ..., vm) RETURNING id
) INSERT INTO MyTable (parent_id, f1, f2, ..., fk) VALUES
($1, $2, $3, ..., $k),
($k+1, $k+2, $k+3, ..., $k+k),
...
($m, $m+1, $m+2, ..., $m+k);
return 1;
END$BODY$
LANGUAGE 'plpgsql' VOLATILE;https://stackoverflow.com/questions/19476208
复制相似问题