簡體   English   中英

PostgreSQL將記錄轉換為復合類型

[英]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

然后使用默認參數值。 但這種方式既不清楚也不舒服。

我的建議是,如果您需要這樣做,請采取以下方法之一:

  1. 動態發現結構(使用pg_attribute目錄表)。 這不能保證將來安全,但可能是。 它也有一堆陷阱(例如,不要使用attnum小於0的屬性)。 這通常是我采用的方法,並在Perl中編寫庫,以便在客戶端進行此類發現。

  2. 創建使用類型和存儲類型,並在它們之間進行轉換。 因此,您可以執行SELECT ('text', 10)::test.used_test::test.stored_test ,這將正常工作。 但是有一個原因是你無法將記錄轉換為復合類型。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM