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

PostgreSQL 9.3: Pass values to only selected parameter in function

我必须 table 有四列,如下所示:

Table:

create table fortesting
(
    cola int not null,
    colb timestamp null,
    colc text null,
    cold int null
)

现在我想创建一个函数来将记录插入 table 使用动态 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;

调用函数:

我只将两个值传递给两个参数,其余的应该为 table。

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 

原因是,将 null 值与某个 return 值连接起来是一个 null 值,即使其他元素不为空。

不过这个不需要动态SQL,直接传参数即可:

insert into fortesting(cola,colb,colc,cold) values (, , , );

如果您确实想使用动态 SQL(即使不需要),您也应该这样做:

v_query := 'insert into fortesting(cola,colb,colc,cold) values (, , , )';

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 子句中,因为它不 return "table"