Ne, k regclass
nepotřebujete obsazení při volání funkce jako nextval
který přijímá regclass
parametr, protože existuje implicitní přetypování z text
do regclass
. V některých jiných kontextech explicitní přetypování na regclass
může být vyžadováno.
Vysvětlení:
::regclass
je přetypování, jako ::integer
.
regclass
je "magický" datový typ; je to vlastně alias pro oid
, nebo "identifikátor objektu". Viz Typy identifikátorů objektů
v dokumentaci. Odesílání do regclass
je zkratka, jak říci „toto jméno relace, převeďte jej prosím na oid tohoto vztahu“. Odesílá do regclass
jsou si vědomi search_path
, na rozdíl od dotazování pg_class
pro oid
vztahu přímo, takže přetypování na regclass není přesně ekvivalentní s dílčím dotazem pg_class
.
Tabulky jsou vztahy. Stejně tak sekvence a pohledy. Takže můžete získat oid pohledu nebo sekvence také přetypováním do regclass.
Pro text
jsou definována implicitní přetypování do regclass
, takže pokud vynecháte explicitní přetypování a voláte funkci, která přijímá regclass
obsazení se provádí automaticky. Takže ne potřebujete jej například v nextval
hovory.
Jsou i jiná místa, kde můžete. Nemůžete například porovnávat text
přímo pomocí oid
; takže můžete udělat toto:
regress=> select * from pg_class where oid = 'table1'::regclass;
ale ne toto:
regress=> select * from pg_class where oid = 'table1';
ERROR: invalid input syntax for type oid: "table1"
LINE 1: select * from pg_class where oid = 'table1';
Jen pro zábavu jsem zkusil napsat dotaz, který provedl ekvivalentní operaci přetypování do regclass
. Nepoužívejte to, je to hlavně pro zábavu a jako pokus o ukázku toho, co se vlastně děje. Pokud vás opravdu nezajímá, jak fungují vnitřnosti Pg, můžete přestat číst zde.
Pokud tomu rozumím, 'sequence_name'::regclass::oid
je zhruba ekvivalentní následujícímu dotazu:
WITH sp(sp_ord, sp_schema) AS (
SELECT
generate_series(1, array_length(current_schemas('t'),1)),
unnest(current_schemas('t'))
)
SELECT c.oid
FROM pg_class c INNER JOIN pg_namespace n ON (c.relnamespace = n.oid)
INNER JOIN sp ON (n.nspname = sp.sp_schema)
WHERE c.relname = 'sequence_name'
ORDER BY sp.sp_ord
LIMIT 1;
až na to, že je mnohem kratší a mnohem rychlejší. Viz Funkce systémových informací
pro definici current_schemas(...)
, atd.
Jinými slovy:
- Získejte pole ab se seznamem všech schémat, ke kterým máme přístup, a spárujte každý záznam s pořadovým číslem pro jeho pozici v poli
- Vyhledejte
pg_class
pro vztahy s odpovídajícími jmény a přidružit každý k jeho jmennému prostoru (schématu) - Seřaďte seznam zbývajících vztahů podle pořadí, ve kterém se jejich schémata objevila v
search_path
- a vyberte první shodu