Мои клиенты, пытающиеся работать с OID-ами, часто задают мне вопросы об отношениях, которые надо куда-нибудь добавить (3 раза только на этой неделе). Например, кто-то хочет добавить специальную конфигурацию autovacuum-а для определённой таблицы. Ему надо выяснить OID этой таблицы. Обычно люди используют такой запрос:
SELECT oid FROM pg_class WHERE relname = 'foo' AND relkind = 'r';Возвращается текущий OID таблицы по её имени, который может в дальнейшем быть использован для ваших нужд. Однако, есть более простой способ получения такой информации, просто приведением имени отношения к типу regclass:
oid
-------
16385
(1 row)
SELECT 'foo'::regclass::oid;Вернёмся к примеру с autovacuum-ом:
oid
-------
16385
(1 row)
INSERT INTO pg_autovacuumТут не используется прямое приведение к OID, т.к. будет использовано неявное.
VALUES('foo'::regclass, 't', -1, 0.05, -1, -1, -1, -1, -1, -1);
Доступны также другие reg* приведения, например:
SELECT 'now'::regproc::oid;
oid
------
1299
(1 row)
SELECT 'int4'::regtype::oid;
oid
-----
23
2 comments:
А есть обратное преобразование: как, зная OID таблицы, сделать запрос к самой таблице?
В хранимой функции, например PL/PgSQL, выбрать имя таблицы по OID из pg_class, а затем сформировать и выполнить с помощью EXECUTE нужный динамический запрос с участием полученного имени таблицы.
Post a Comment