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"
我必须 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"