2015-10-14 19 views
3

我在想,如果有可能批量初始化從一個類型爲空創建的變量沒有初始化它們各自獨立重置行類型的所有列設置爲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

回答

2

你可以只分配 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

相關問題