【发布时间】:2015-12-31 18:31:08
【问题描述】:
我必须有四列的表格,如下所示:
表格:
create table fortesting
(
cola int not null,
colb timestamp null,
colc text null,
cold int null
)
现在我想创建一个函数来将记录插入到表中 使用动态 sql 所以我使用了如下所示的语言 plpgsql 函数。
功能:
create or replace function functionTest
(
p_cola int,
p_colb timestamp = null,
p_colc text = '',
p_cold int = null
)
returns void as
$body$
Declare v_query varchar;
begin
v_query := 'insert into fortesting(cola,colb,colc,cold) values('||p_cola||','''||p_colb||''','''||p_colc||''','||p_cold||')';
RAISE INFO '%',v_query;
EXECUTE v_query;
end;
$body$
language plpgsql;
调用函数:
我只将两个值传递给两个参数,rest 应该将 null 放入表中。
SELECT * FROM functionTest( p_cola := 1, p_colc:='abc');
错误详情:
INFO: <NULL>
ERROR: query string argument of EXECUTE is null
CONTEXT: PL/pgSQL function functiontest(integer,timestamp without time zone,text,integer) line 11 at EXECUTE statement
【问题讨论】:
-
在编写 SQL 命令时,必须使用正确的参数引用函数:
quote_ident或quote_literal或使用USING子句。 没有它,代码很容易受到 SQL 注入攻击! -
这对您或任何读者都非常重要。这个错误很愚蠢,仍然很广泛。当你使用@a_horse_with_no_name 建议的语法时,你的代码会更快、更干净、更安全。
-
@Pavel Stehule,好的!