我必须有四列的表格,如下所示:
表格:
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;
调用功能:
我只将两个值传递给两个参数,其余值应该为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
答案 0 :(得分:1)
原因是将null
值与某个值连接会返回null
值,即使其他元素不为空。
但是你不需要动态SQL,你可以直接传递参数:
insert into fortesting(cola,colb,colc,cold) values ($1, $2, $3, $4);
如果您确实想使用动态SQL(即使不需要),您应该这样做:
v_query := 'insert into fortesting(cola,colb,colc,cold) values ($1, $2, $3, $4)';
RAISE INFO '%',v_query;
EXECUTE v_query
using p_cola, p_colb, p_colc, p_cold;
执行功能使用:
SELECT functionTest( p_cola := 1, p_colc:='abc');
不要将其放入from
子句中,因为它不会返回“table”