[英]PostgreSQL cast record to composite type
我們知道,有一種簡單的方法可以將任何記錄轉換為PostgreSQL中相應的復合類型,如下所示:
CREATE TYPE test.t_test AS (
mytext text,
myint integer
);
SELECT ('text', 10)::test.t_test; -- will succeed
但是對此的一個不便是 - 如果目標類型被修改(例如添加了一個字段) - 那么演員將會破壞:(
ALTER TYPE test.t_test ADD ATTRIBUTE mychar char(1);
SELECT ('text', 10)::test.t_test; -- will fail
對於這種情況, CREATE CAST
可能有所幫助,但是我不能將類似RECORD
的偽類作為參數傳遞給轉換函數。 並且類型繼承和復合類型默認值(如表)都不起作用。 有沒有其他方法可以實現兼容性?
當然可以使用顯式CREATE FUNCTION test.to_t_test(t text, i integer, c char DEFAULT '') RETURNS test.t_test
函數,如CREATE FUNCTION test.to_t_test(t text, i integer, c char DEFAULT '') RETURNS test.t_test
然后再做
SELECT test.to_t_test('text', 10) -- OK
SELECT test.to_t_test('text', 10, '1') -- OK
然后使用默認參數值。 但這種方式既不清楚也不舒服。
我的建議是,如果您需要這樣做,請采取以下方法之一:
動態發現結構(使用pg_attribute
目錄表)。 這不能保證將來安全,但可能是。 它也有一堆陷阱(例如,不要使用attnum
小於0的屬性)。 這通常是我采用的方法,並在Perl中編寫庫,以便在客戶端進行此類發現。
創建使用類型和存儲類型,並在它們之間進行轉換。 因此,您可以執行SELECT ('text', 10)::test.used_test::test.stored_test
,這將正常工作。 但是有一個原因是你無法將記錄轉換為復合類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.