重置行类型的所有列设置为NULL

问题描述:

我在想,如果有可能批量初始化从一个类型为空创建的变量没有初始化它们各自独立重置行类型的所有列设置为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; 

电话:

select * from sp_function(); 

上面显然是错误的,但是在Informix中,我可以使用类似“初始化lr_data。*为null”的东西。有没有办法在plpgsql中做类似的事情?

+0

您是否尝试过使用如下方式定义您的类型:'.... data01 text DEFAULT NULL,....' –

+0

这不会有帮助,因为数据将会填充来自sql查询的结果点。我需要能够清除所有结果返回该行后sql查询已经运行 – Trent

你可以只分配 NULL整个行类型:

lr_data := null; 

这每列设置为NULL。

另外:你的函数有一些语法错误。而整个功能可以极为简化...

这种查询可以更换整个功能:

SELECT (CASE WHEN data01 = 'cancelled' THEN NULL::tp_data ELSE d::tp_data END).* 
FROM (SELECT data01, data02, data03 FROM data) d; 

不是你的问题的时候,我知道了。坚果它表明我们也可以转换 NULL为行类型使所有列为NULL。

+0

这个答案是完美的,谢谢一堆 – Trent

+0

也是啊,这个函数被写成完整的废话只是为了让我的问题明确 – Trent

+0

该附录是很高兴知道,但空分配需要更复杂的功能 – Trent