2014-04-10 19 views
8

Bildiğimiz gibi, PostgreSQL uygun birleşik tip herhangi kaydını döküm için basit bir yol böyle bulunmadığını beyan eder rekor döküm:PostgreSQL kompozit tip

CREATE TYPE test.t_test AS (
    mytext text, 
    myint integer 
); 

SELECT ('text', 10)::test.t_test; -- will succeed 

Ama bu sadece bir rahatsızlık olduğunu - eğer hedef türü (örneğin, bir alan eklenir) modifiye edilir - dökme sonra :(parçalanmasına yardımcı olabilir, bu durum için

ALTER TYPE test.t_test ADD ATTRIBUTE mychar char(1); 

SELECT ('text', 10)::test.t_test; -- will fail 

CREATE CAST ama bir döküm işlev için bağımsız değişken olarak RECORD gibi bir psödo-tipi geçemez olacaktır. Ve ne tür-devralma ne de kompozit tip e varsayılanlar (tablo gibi) da çalışır. Burada uyumluluk sağlamak için başka bir yolu var mı?

Tabii ki CREATE FUNCTION test.to_t_test(t text, i integer, c char DEFAULT '') RETURNS test.t_test gibi açık dökme işlevlerini kullanın ve sonra

SELECT test.to_t_test('text', 10) -- OK 
SELECT test.to_t_test('text', 10, '1') -- OK 

sonra varsayılan parametre değerleri kullanmak yapmak mümkün. Ama bu şekilde ne açık ne de rahattır.

cevap

2

Benim tavsiye bunu yapmak gerekiyorsa o zaman aşağıdaki yaklaşımlardan birini almak olmasıdır: yapının

  1. Dinamik keşif (pg_attribute katalog tablosunu kullanarak). Bu geleceğin güvenli olduğu garanti edilmez ama muhtemelen. Ayrıca bir grup tuğlayı da (örneğin, 0'dan daha az bir attnum ile öznitelikleri kullanmayın). Bu genellikle alıp benimsediğim yaklaşımdır ve istemci tarafında böyle bir keşif yapmak için Perl'de yazılı kütüphaneler vardır.

  2. Kullanım türü ve depolama türü oluşturun ve bunlar arasında bir yayın yapın Bu nedenle SELECT ('text', 10) :: test.used_test :: test.stored_test komutunu yazabilirsiniz ve bu da sorunsuz çalışacaktır. Ancak, kompozit tipte kayıt yapamayacağınız bir sebep var.