The*_*age 4 postgresql null initialization bulk plpgsql
我想知道是否可以批量初始化从类型创建的变量为 null,而不需要单独初始化它们
create type tp_data as (
data01 text,
data02 integer,
data03 text
);
create function sp_function()
returns setof tp_data as
$$
declare
lr_data tp_data;
begin
for lr_data in
select data.data01, data.data02, data.data03
from data
loop
if lr_data.data01 = "cancelled" then
-- what is the correct way to do this?
lr_data.* := null;
-- without having to do this
lr_data.data01 := null;
lr_data.data02 := null;
lr_data.data03 := null;
end if;
return next lr_data;
end loop;
end
$$
language plpgsql;
Run Code Online (Sandbox Code Playgroud)
称呼:
select * from sp_function();
Run Code Online (Sandbox Code Playgroud)
上面的内容显然是错误的,但是在 Informix 中我可以使用“将 lr_data.* 初始化为 null”之类的内容。有没有办法在 plpgsql 中做类似的事情?
您可以分配 NULL给整个行类型:
lr_data := null;
Run Code Online (Sandbox Code Playgroud)
这会将每一列设置为NULL。
另外:您的函数中有一些语法错误。整个功能可以从根本上简化。此查询替换整个函数:
SELECT (CASE WHEN data01 = 'cancelled' THEN NULL::tp_data ELSE d::tp_data END).*
FROM (SELECT data01, data02, data03 FROM data) d;
Run Code Online (Sandbox Code Playgroud)
我知道这不是你问题的重点。但它表明我们也可以将值转换NULL为行类型来创建所有列NULL。