2014-04-10 16 views
8

Jak wiemy, nie jest to prosta droga do oddania żadnego rekordu do odpowiedniego typu złożonego w PostgreSQL, tak:PostgreSQL cast rekord kompozytowego typu

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

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

Ale jedna niedogodność polega na tym, że - jeśli typ docelowy jest modyfikowany (na przykład pole jest dodana) - odlew następnie przełamać :(

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

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

CREATE CAST w tym przypadku może pomóc, ale nie mogą przejść pseudo typu jak RECORD jako argumentu w funkcji odlewania. Ani typ-dziedziczenie, ani typ złożony Działają także wartości domyślne (takie jak tabela). Czy istnieje tutaj inny sposób uzyskania zgodności?

Oczywiście jest to możliwe, aby korzystać z jawnych lanego funkcje jak CREATE FUNCTION test.to_t_test(t text, i integer, c char DEFAULT '') RETURNS test.t_test a następnie zrobić

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

następnie użyć domyślnych wartości parametrów. Ale ta droga nie jest ani jasna, ani wygodna.

Odpowiedz

2

Moja rada jest taka, że ​​jeśli trzeba to zrobić, a następnie podjąć jedną z następujących metod:

  1. Dynamiczny odkrycie struktury (używając katalogowy tabeli pg_attribute). Nie gwarantuje to bezpieczeństwa w przyszłości, ale prawdopodobnie jest. Ma również garść getch (na przykład nie używaj atrybutów o wartości mniejszej niż 0). Zwykle jest to podejście, które stosuję i które napisałem w Perlu w celu wykonania takich odkryć po stronie klienta.

  2. Utwórz typ użytkowania i typ przechowywania i odlcz między nimi W ten sposób możesz wykonać SELECT ("tekst", 10) :: test.used_test :: test.stored_test i to zadziała poprawnie. Ale jest powód, dla którego nie można nagrywać płyty na kompozytowy.

Powiązane problemy