PostgreSQL 9.3:仅将值传递给函数中的选定参数

时间:2015-12-31 10:13:12

标签: postgresql postgresql-9.3

我必须有四列的表格,如下所示:

表格

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 

1 个答案:

答案 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”