Je verwart niveaus van abstractie. Zoals andere antwoorden al aangeven, CREATE TYPE
registreert alleen een (samengesteld / rij) type in het systeem. Terwijl een ROW
constructor retourneert eigenlijk een rij.
Een rijtype gemaakt met de ROW
constructor bewaart geen kolomnamen, wat duidelijk wordt wanneer u de rij naar JSON probeert te converteren.
Terwijl je toch bezig bent, ROW
is slechts een ruiswoord meestal. De documentatie:
Demo:
SELECT t AS r1, row_to_json(t) AS j1
, ROW(1, 'x', NUMERIC '42.1') AS r2, row_to_json(ROW(1, 'x', NUMERIC '42.1')) AS j2
, (1, 'x', NUMERIC '42.1') AS r3, row_to_json( (1, 'x', NUMERIC '42.1')) AS j3
, (1, 'x', '42.1')::myrowtype AS r4, row_to_json((1, 'x', '42.1')::myrowtype) AS j4
FROM (SELECT 1, 'x', NUMERIC '42.1') t;
r1
en j1
originele kolomnamen behouden.r2
en j2
niet doen.r3
en j3
zijn hetzelfde; om te demonstreren hoe ROW
is gewoon ruis.r4
en j4
dragen de kolomnamen van het geregistreerde type.
U kunt de rij (record) casten naar een geregistreerd rijtype als nummer en gegevenstypen van de elementen komt overeen met het rijtype - namen invoervelden worden genegeerd.