dblink
Модуль dblink обеспечивает подключения к другим базам данных QHB из сеанса базы данных.
См. также описание модуля postgres_fdw, который предоставляет примерно ту же функциональность, используя более современную и стандартизированную инфраструктуру.
dblink_connect
dblink_connect — открывает постоянное подключение к удаленной базе данных.
Синтаксис
dblink_connect(text connstr) returns text
dblink_connect(text connname, text connstr) returns text
Описание
Функция dblink_connect() устанавливает подключение к удаленной базе данных QHB. Целевые сервер и база данных указываются в стандартной строке подключения libpq. При необходимости этому подключению можно назначить имя. Одновременно могут быть открытыми несколько именованных подключений, но только одно подключение без имени. Подключение будет сохраняться, пока не будет закрыто или до завершения сеанса базы данных.
В строке подключения также можно задать имя существующего стороннего сервера. Для
определения стороннего сервера рекомендуется использовать обертку сторонних данных
dblink_fdw. См. пример ниже, а также CREATE SERVER
and CREATE USER MAPPING
.
Аргументы
connname
Имя, назначаемое этому подключению; если опущено, открывается безымянное
подключение, заменяя любое существующее безымянное подключение.
connstr
Строка подключения в стиле libpq, например hostaddr=127.0.0.1 port=5432 dbname=mydb user=postgres password=mypasswd options=-csearch_path=
.
Дополнительную информацию см. в подразделе Строки подключения. Как вариант, в
ней можно задавать имя стороннего сервера.
Возвращаемое значение
Возвращает состояние (Это всегда строка OK, поскольку в случае любого сбоя функция выдает ошибку и не возвращает никакие значения).
Примечания
Если к базе данных, в которой не был внедрен шаблон безопасного использования схем, имеют доступ недоверенные пользователи, начинайте каждый сеанс с удаления общедоступных для записи схем из пути поиска (search_path). Например, для этого можно добавить options=-csearch_path= в connstr. Это касается не только dblink, но и любых других интерфейсов для выполнения произвольных команд SQL.
Только суперпользователи могут использовать dblink_connect для создания подключений, не требующих аутентификации по паролю. Если эта возможность нужна обычным пользователям, следует воспользоваться функцией dblink_connect_u.
Использовать в именах подключений знаки равенства не рекомендуется, так как при этом возникает риск перепутать их со строками подключения в других функциях dblink.
Примеры
SELECT dblink_connect('dbname=qhb options=-csearch_path=');
dblink_connect
----------------
OK
(1 row)
SELECT dblink_connect('myconn', 'dbname=qhb options=-csearch_path=');
dblink_connect
----------------
OK
(1 row)
-- Функциональность обертки сторонних данных (FOREIGN DATA WRAPPER)
-- Примечание: чтобы это работало как следует, для локальных подключений требуется аутентификация по паролю
-- Иначе, вызвав dblink_connect(), вы получите следующую ошибку:
-- ERROR: password is required
-- DETAIL: Non-superuser cannot connect if the server does not request a password.
-- HINT: Target server's authentication method must be changed.
-- (ОШИБКА: требуется пароль
-- ДЕТАЛИЗАЦИЯ: Обычный пользователь не может подключиться, если сервер не требует пароль.
-- ПОДСКАЗКА: Необходимо изменить метод аутентификации целевого сервера.)
CREATE SERVER fdtest FOREIGN DATA WRAPPER dblink_fdw OPTIONS (hostaddr '127.0.0.1', dbname 'contrib_regression');
CREATE USER regress_dblink_user WITH PASSWORD 'secret';
CREATE USER MAPPING FOR regress_dblink_user SERVER fdtest OPTIONS (user 'regress_dblink_user', password 'secret');
GRANT USAGE ON FOREIGN SERVER fdtest TO regress_dblink_user;
GRANT SELECT ON TABLE foo TO regress_dblink_user;
\set ORIGINAL_USER :USER
\c - regress_dblink_user
SELECT dblink_connect('myconn', 'fdtest');
dblink_connect
----------------
OK
(1 row)
SELECT * FROM dblink('myconn', 'SELECT * FROM foo') AS t(a int, b text, c text[]);
a | b | c
----+---+---------------
0 | a | {a0,b0,c0}
1 | b | {a1,b1,c1}
2 | c | {a2,b2,c2}
3 | d | {a3,b3,c3}
4 | e | {a4,b4,c4}
5 | f | {a5,b5,c5}
6 | g | {a6,b6,c6}
7 | h | {a7,b7,c7}
8 | i | {a8,b8,c8}
9 | j | {a9,b9,c9}
10 | k | {a10,b10,c10}
(11 rows)
\c - :ORIGINAL_USER
REVOKE USAGE ON FOREIGN SERVER fdtest FROM regress_dblink_user;
REVOKE SELECT ON TABLE foo FROM regress_dblink_user;
DROP USER MAPPING FOR regress_dblink_user SERVER fdtest;
DROP USER regress_dblink_user;
DROP SERVER fdtest;
dblink_connect_u
dblink_connect_u — открывает постоянное подключение к удаленной базе данных, небезопасно
Синтаксис
dblink_connect_u(text connstr) returns text
dblink_connect_u(text connname, text connstr) returns text
Описание
Функция dblink_connect_u() идентична функции dblink_connect(), за исключением того, что она позволяет подключаться обычным пользователям с любым методом аутентификации.
Если удаленный сервер выбирает метод аутентификации без пароля, возможна имперсонация и последующее повышение прав, поскольку сеанс будет установлен от имени пользователя, который исполняет локальный процесс QHB. Кроме того, даже если удаленный сервер и запрашивает пароль, этот пароль можно получить из среды сервера, например из файла ~/.pgpass, принадлежащего пользователю сервера. Это чревато не только имперсонацией, но и возможностью выдачи пароля не заслуживающему доверия удаленному серверу. Поэтому dblink_connect_u() изначально устанавливается так, что роль PUBLIC лишена всех прав на ее использование, т. е. вызвать ее могут только суперпользователи. В некоторых ситуациях может оказаться допустимым дать право EXECUTE для dblink_connect_u() определенным пользователям, которые считаются доверенными, но это следует делать с осторожностью. Также рекомендуется, чтобы файл ~/.pgpass, принадлежащий пользователю сервера, не содержал никаких записей с подстановочным знаком (например *) в качестве имени узла.
Дополнительную информацию см. в описании dblink_connect().
dblink_disconnect
dblink_disconnect — закрывает постоянное подключение к удаленной базе данных
Синтаксис
dblink_disconnect() returns text
dblink_disconnect(text connname) returns text
Описание
Функция dblink_disconnect() закрывает подключение, ранее открытое функцией dblink_connect(). Форма без аргументов закрывает безымянное подключение.
Аргументы
connname
Имя закрываемого именованного подключения.
Возвращаемое значение
Возвращает состояние (Это всегда строка OK, поскольку в случае любого сбоя функция выдает ошибку и не возвращает никакие значения).
Примеры
SELECT dblink_disconnect();
dblink_disconnect
-------------------
OK
(1 row)
SELECT dblink_disconnect('myconn');
dblink_disconnect
-------------------
OK
(1 row)
dblink
dblink — выполняет запрос в удаленной базе данных
Синтаксис
dblink(text connname, text sql [, bool fail_on_error]) returns setof record
dblink(text connstr, text sql [, bool fail_on_error]) returns setof record
dblink(text sql [, bool fail_on_error]) returns setof record
Описание
Функция dblink выполняет запрос (обычно SELECT
, но это может быть и любой
другой оператор SQL, возвращающий строки) в удаленной базе данных.
Когда этой функции передаются два аргумента типа text, первый сначала рассматривается как имя постоянного подключения; если таковое находится, команда выполняется для него. Если подключение не находится, первый аргумент воспринимается как строка подключения, как для функции dblink_connect, и указанное подключение устанавливается только на время выполнения этой команды.
Аргументы
connname
Имя используемого подключения; чтобы использовать безымянное подключение, нужно
опустить этот параметр.
connstr
Строка подключения, описанная ранее для dblink_connect.
sql
Запрос SQL, который вы хотите выполнить в удаленной базе данных, например
select * from foo
.
fail_on_error
Если равен true (это значение по умолчанию, поэтому его необязательно
указывать), то в случае ошибки, выданной на удаленной стороне соединения, ошибка
также выдается локально. Если равен false, удаленная ошибка выдается локально
как замечание (уровень важности NOTICE), и функция не возвращает строки.
Возвращаемое значение
Эта функция возвращает строки, выдаваемые в результате запроса. Поскольку dblink может выполнять любые запросы, она объявлена как возвращающая тип record, а не некоторый определенный набор столбцов. Это означает, что нужно указать ожидаемый набор столбцов в вызывающем запросе — иначе QHB не будет знать, чего ожидать. Например:
SELECT *
FROM dblink('dbname=mydb options=-csearch_path=',
'select proname, prosrc from pg_proc')
AS t1(proname name, prosrc text)
WHERE proname LIKE 'bytea%';
В части «псевдонима» предложения FROM нужно указывать имена столбцов и типы, которые будет возвращать функция. (Указание имен столбцов в псевдонимах на самом деле относится к стандартному синтаксису SQL, а вот указание типов столбцов является расширением QHB.) Это позволяет системе понять, во что должен разворачиваться знак * и на что ссылается proname в предложении WHERE, прежде чем пытаться выполнить эту функцию. Если во время выполнения действительный результат запроса из удаленной базы данных не будет содержать столько столбцов, сколько указано в предложении FROM, произойдет ошибка. Однако имена столбцов могут не совпадать, а еще dblink не настаивает на точном совпадении типов. Функция завершится успешно, если возвращаемые строки данных будут допустимыми для ввода в тип столбца, объявленный в предложении FROM.
Примечания
Использовать dblink с предопределенными запросами будет удобнее, если создать представление. Это позволит скрыть в его определении информацию о типах столбцов и не прописывать ее в каждом запросе. Например:
CREATE VIEW myremote_pg_proc AS
SELECT *
FROM dblink('dbname=qhb options=-csearch_path=',
'select proname, prosrc from pg_proc')
AS t1(proname name, prosrc text);
SELECT * FROM myremote_pg_proc WHERE proname LIKE 'bytea%';
Примеры
SELECT * FROM dblink('dbname=qhb options=-csearch_path=',
'select proname, prosrc from pg_proc')
AS t1(proname name, prosrc text) WHERE proname LIKE 'bytea%';
proname | prosrc
------------+------------
byteacat | byteacat
byteaeq | byteaeq
bytealt | bytealt
byteale | byteale
byteagt | byteagt
byteage | byteage
byteane | byteane
byteacmp | byteacmp
bytealike | bytealike
byteanlike | byteanlike
byteain | byteain
byteaout | byteaout
(12 rows)
SELECT dblink_connect('dbname=qhb options=-csearch_path=');
dblink_connect
----------------
OK
(1 row)
SELECT * FROM dblink('select proname, prosrc from pg_proc')
AS t1(proname name, prosrc text) WHERE proname LIKE 'bytea%';
proname | prosrc
------------+------------
byteacat | byteacat
byteaeq | byteaeq
bytealt | bytealt
byteale | byteale
byteagt | byteagt
byteage | byteage
byteane | byteane
byteacmp | byteacmp
bytealike | bytealike
byteanlike | byteanlike
byteain | byteain
byteaout | byteaout
(12 rows)
SELECT dblink_connect('myconn', 'dbname=regression options=-csearch_path=');
dblink_connect
----------------
OK
(1 row)
SELECT * FROM dblink('myconn', 'select proname, prosrc from pg_proc')
AS t1(proname name, prosrc text) WHERE proname LIKE 'bytea%';
proname | prosrc
------------+------------
bytearecv | bytearecv
byteasend | byteasend
byteale | byteale
byteagt | byteagt
byteage | byteage
byteane | byteane
byteacmp | byteacmp
bytealike | bytealike
byteanlike | byteanlike
byteacat | byteacat
byteaeq | byteaeq
bytealt | bytealt
byteain | byteain
byteaout | byteaout
(14 rows)
dblink_exec
dblink_exec — выполняет команду в удаленной базе данных
Синтаксис
dblink_exec(text connname, text sql [, bool fail_on_error]) returns text
dblink_exec(text connstr, text sql [, bool fail_on_error]) returns text
dblink_exec(text sql [, bool fail_on_error]) returns text
Описание
Функция dblink_exec выполняет команду (то есть любой оператор SQL, не возвращающий строки) в удаленной базе данных.
Когда этой функции передаются два аргумента типа text, первый сначала рассматривается как имя постоянного подключения; если таковое находится, команда выполняется для него. Если подключение не находится, первый аргумент воспринимается как строка подключения, как для функции dblink_connect, и указанное подключение устанавливается только на время выполнения этой команды.
Аргументы
connname
Имя используемого подключения; чтобы использовать безымянное подключение, нужно
опустить этот параметр.
connstr
Строка подключения, описанная ранее для dblink_connect.
sql
Команда SQL, которую вы хотите выполнить в удаленной базе данных, например
insert into foo values(0, 'a', '{"a0","b0","c0"}')
.
fail_on_error
Если равен true (это значение по умолчанию, поэтому его необязательно
указывать), то в случае ошибки, выданной на удаленной стороне соединения, ошибка
также выдается локально. Если равен false, удаленная ошибка выдается локально
как замечание (уровень важности NOTICE), и возвращаемым значением функции будет
ERROR.
Возвращаемое значение
Возвращает состояние (либо строки состояния команды, либо ERROR).
Примеры
SELECT dblink_connect('dbname=dblink_test_standby');
dblink_connect
----------------
OK
(1 row)
SELECT dblink_exec('insert into foo values(21, ''z'', ''{"a0","b0","c0"}'');');
dblink_exec
-----------------
INSERT 943366 1
(1 row)
SELECT dblink_connect('myconn', 'dbname=regression');
dblink_connect
----------------
OK
(1 row)
SELECT dblink_exec('myconn', 'insert into foo values(21, ''z'', ''{"a0","b0","c0"}'');');
dblink_exec
------------------
INSERT 6432584 1
(1 row)
SELECT dblink_exec('myconn', 'insert into pg_class values (''foo'')',false);
NOTICE: sql error
DETAIL: ERROR: null value in column "relnamespace" violates not-null constraint
-- УВЕДОМЛЕНИЕ: ошибка SQL
-- ДЕТАЛИЗАЦИЯ: ОШИБКА: значение NULL в столбце "relnamespace" нарушает ограничение NOT NULL
dblink_exec
-------------
ERROR
(1 row)
dblink_open
dblink_open — открывает курсор в удаленной базе данных
Синтаксис
dblink_open(text cursorname, text sql [, bool fail_on_error]) returns text
dblink_open(text connname, text cursorname, text sql [, bool fail_on_error]) returns text
Описание
Функция dblink_open() открывает курсор в удаленной базе данных. Затем этим курсором можно будет манипулировать с помощью функций dblink_fetch() и dblink_close().
Аргументы
connname
Имя используемого подключения; чтобы использовать безымянное подключение, нужно
опустить этот параметр.
cursorname
Имя, назначаемое курсору.
sql
Оператор SELECT
, который вы хотите выполнять в удаленной базе данных, например
select * from pg_class
.
fail_on_error
Если равен true (это значение по умолчанию, поэтому его необязательно
указывать), то в случае ошибки, выданной на удаленной стороне соединения, ошибка
также выдается локально. Если равен false, удаленная ошибка выдается локально
как замечание (уровень важности NOTICE), и возвращаемым значением функции будет
ERROR.
Возвращаемое значение
Возвращает состояние (OK или ERROR).
Примечания
Поскольку курсор может существовать только в рамках транзакции, функция
dblink_open начинает явный блок транзакции (командой BEGIN
) на удаленной
стороне, если транзакция там еще не начата. Эта транзакция будет снова закрыта
при соответствующем выполнении функции dblink_close. Обратите внимание, что
если вы используете dblink_exec для изменения данных между вызовами
dblink_open и dblink_close, а затем происходит ошибка, или если вы вызываете
dblink_disconnect перед dblink_close, ваши изменения будут потеряны, так
как транзакция прервется.
Примеры
SELECT dblink_connect('dbname=qhb options=-csearch_path=');
dblink_connect
----------------
OK
(1 row)
SELECT dblink_open('foo', 'select proname, prosrc from pg_proc');
dblink_open
-------------
OK
(1 row)
dblink_fetch
dblink_fetch — возвращает строки из открытого курсора в удаленной базе данных
Синтаксис
dblink_fetch(text cursorname, int howmany [, bool fail_on_error]) returns setof record
dblink_fetch(text connname, text cursorname, int howmany [, bool fail_on_error]) returns setof record
Описание
Функция dblink_fetch выбирает строки из курсора, ранее установленного функцией dblink_open.
Аргументы
connname
Имя используемого подключения; чтобы использовать безымянное подключение, нужно
опустить этот параметр.
cursorname
Имя курсора, из которого будут выбираться данные.
howmany
Максимальное число строк, которое нужно получить. Выбираются следующие howmany
строк, начиная с текущей позиции курсора и двигаясь вперед. Когда курсор доходит
до конца, строки больше не выдаются.
fail_on_error
Если равен true (это значение по умолчанию, поэтому его необязательно
указывать), то в случае ошибки, выданной на удаленной стороне соединения, ошибка
также выдается локально. Если равен false, удаленная ошибка выдается локально
как замечание (уровень важности NOTICE), и функция не возвращает строки.
Возвращаемое значение
Эта функция возвращает строки, выбираемые через курсор. Для использования этой функции нужно задать ожидаемый набор столбцов, как ранее говорилось в описании dblink.
Примечания
При несовпадении числа возвращаемых столбцов, указанного в предложении FROM,
с фактическим числом столбцов, возвращенных удаленным курсором, будет выдана
ошибка. В этом случае удаленный курсор все равно продвигается на столько строк,
на сколько он продвинулся бы, если бы ошибка не произошла. То же самое верно для
любых других ошибок, происходящих в локальном запроса после выполнения удаленной
команды FETCH
.
Примеры
SELECT dblink_connect('dbname=qhb options=-csearch_path=');
dblink_connect
----------------
OK
(1 row)
SELECT dblink_open('foo', 'select proname, prosrc from pg_proc where proname like ''bytea%''');
dblink_open
-------------
OK
(1 row)
SELECT * FROM dblink_fetch('foo', 5) AS (funcname name, source text);
funcname | source
----------+----------
byteacat | byteacat
byteacmp | byteacmp
byteaeq | byteaeq
byteage | byteage
byteagt | byteagt
(5 rows)
SELECT * FROM dblink_fetch('foo', 5) AS (funcname name, source text);
funcname | source
-----------+-----------
byteain | byteain
byteale | byteale
bytealike | bytealike
bytealt | bytealt
byteane | byteane
(5 rows)
SELECT * FROM dblink_fetch('foo', 5) AS (funcname name, source text);
funcname | source
------------+------------
byteanlike | byteanlike
byteaout | byteaout
(2 rows)
SELECT * FROM dblink_fetch('foo', 5) AS (funcname name, source text);
funcname | source
----------+--------
(0 rows)
dblink_close
dblink_close — закрывает курсор в удаленной базе данных
Синтаксис
dblink_close(text cursorname [, bool fail_on_error]) returns text
dblink_close(text connname, text cursorname [, bool fail_on_error]) returns text
Описание
Функция dblink_close закрывает курсор, ранее открытый функцией dblink_open.
Аргументы
connname
Имя используемого подключения; чтобы использовать безымянное подключение, нужно
опустить этот параметр.
cursorname
Имя закрываемого курсора.
fail_on_error
Если равен true (это значение по умолчанию, поэтому его необязательно
указывать), то в случае ошибки, выданной на удаленной стороне соединения, ошибка
также выдается локально. Если равен false, удаленная ошибка выдается локально
как замечание (уровень важности NOTICE), и возвращаемым значением функции будет
ERROR.
Возвращаемое значение
Возвращает состояние (OK или ERROR).
Примечания
Если вызов dblink_open начал явный блок транзакции и это последний открытый
курсор, оставшийся в этом подключении, то dblink_close выполнит соответствующую
команду COMMIT
.
Примеры
SELECT dblink_connect('dbname=qhb options=-csearch_path=');
dblink_connect
----------------
OK
(1 row)
SELECT dblink_open('foo', 'select proname, prosrc from pg_proc');
dblink_open
-------------
OK
(1 row)
SELECT dblink_close('foo');
dblink_close
--------------
OK
(1 row)
dblink_get_connections
dblink_get_connections — возвращает имена всех открытых именованных подключений dblink
Синтаксис
dblink_get_connections() returns text[]
Описание
Функция dblink_get_connections возвращает массив имен всех открытых именованных подключений dblink.
Возвращаемое значение
Возвращает текстовый массив имен подключений или NULL, если они отсутствуют.
Примеры
SELECT dblink_get_connections();
dblink_error_message
dblink_error_message — выдает сообщение последней ошибки для именованного подключения
Синтаксис
dblink_error_message(text connname) returns text
Описание
Функция dblink_error_message извлекает самое последнее сообщение удаленной ошибки для заданного подключения.
Аргументы
connname
Имя используемого подключения.
Возвращаемое значение
Возвращает последнее сообщение ошибки или OK, если в сеансе этого подключения не было ошибок.
Примечания
Когда функцией dblink_send_query передаются асинхронные запросы, сообщение об ошибке, связанное с подключением, может не обновиться до получения от сервера ответного сообщения. Обычно это означает, что до вызова dblink_error_message следует вызвать функцию dblink_is_busy или dblink_get_result, чтобы были видны все ошибки, возникшие при выполнении асинхронного запроса.
Примеры
SELECT dblink_error_message('dtest1');
dblink_send_query
dblink_send_query — передает асинхронный запрос в удаленную базу данных
Синтаксис
dblink_send_query(text connname, text sql) returns int
Описание
Функция dblink_send_query передает запрос для асинхронного выполнения, то есть не дожидается получения результата. В этом подключении не должно быть уже выполняющегося асинхронного запроса.
После успешной передачи асинхронного запроса состояние его завершения можно проверить при помощи функции dblink_is_busy, и в итоге получить результаты собранные функцией dblink_get_result. Также можно попытаться отменить активный асинхронный запрос, вызвав функцию dblink_cancel_query.
Аргументы
connname
Имя используемого подключения.
sql
Оператор SQL, который вы хотите выполнить в удаленной базе данных, например
select * from pg_class
.
Возвращаемое значение
Возвращает 1, если запрос был успешно отправлен на обработку, или 0 в противном случае.
Примеры
SELECT dblink_send_query('dtest1', 'SELECT * FROM foo WHERE f1 < 3');
dblink_is_busy
dblink_is_busy — проверяет, не занято ли подключение асинхронным запросом
Синтаксис
dblink_is_busy(text connname) returns int
Описание
Функция dblink_is_busy проверяет, не выполняется ли асинхронный запрос.
Аргументы
connname
Имя проверяемого подключения.
Возвращаемое значение
Возвращает 1, если подключение занято, или 0 в противном случае. Если эта функция возвращает 0, гарантируется, что вызов dblink_get_result не будет заблокирован.
Примеры
SELECT dblink_is_busy('dtest1');
dblink_get_notify
dblink_get_notify — выдает асинхронные уведомления подключения
Синтаксис
dblink_get_notify() returns setof (notify_name text, be_pid int, extra text)
dblink_get_notify(text connname) returns setof (notify_name text, be_pid int, extra text)
Описание
Функция dblink_get_notify выдает уведомления либо безымянного подключения,
либо подключения с указанным именем. Для получения уведомлений через dblink
необходимо сначала выполнить LISTEN
, используя функцию dblink_exec.
Дополнительную информацию см. на справочных страницах команд команд LISTEN
и
NOTIFY
.
Аргументы
connname
Имя именованного подключения, уведомления которого нужно получить.
Возвращаемое значение
Возвращает setof (notify_name text, be_pid int, extra text)
или пустой набор,
если уведомлений нет.
Примеры
SELECT dblink_exec('LISTEN virtual');
dblink_exec
-------------
LISTEN
(1 row)
SELECT * FROM dblink_get_notify();
notify_name | be_pid | extra
-------------+--------+-------
(0 rows)
NOTIFY virtual;
NOTIFY
SELECT * FROM dblink_get_notify();
notify_name | be_pid | extra
-------------+--------+-------
virtual | 1229 |
(1 row)
dblink_get_result
dblink_get_result — получает результат асинхронного запроса
Синтаксис
dblink_get_result(text connname [, bool fail_on_error]) returns setof record
Описание
Функция dblink_get_result собирает результаты асинхронного запроса, ранее переданного функцией dblink_send_query. Если запрос еще выполняется, dblink_get_result будет ждать его завершения.
Аргументы
connname
Имя используемого подключения.
fail_on_error
Если равен true (это значение по умолчанию, поэтому его необязательно
указывать), то в случае ошибки, выданной на удаленной стороне соединения, ошибка
также выдается локально. Если равен false, удаленная ошибка выдается локально
как замечание (уровень важности NOTICE), и функция не возвращает строки.
Возвращаемое значение
Для асинхронного запроса (то есть оператора SQL, возвращающего строки) эта функция возвращает строки, полученные в результате запроса. Чтобы использовать эту функцию, нужно задать ожидаемый набор столбцов, как говорилось ранее в описании dblink.
Для асинхронной команды (то есть оператора SQL, не возвращающего строки) эта функция возвращает одну строку с одним текстовым столбцом, содержащим строку состояния команды. Однако в предложении FROM для такого вызова необходимо указать, что результат будет содержать один текстовый столбец.
Примечания
Эта функция должна вызываться, если dblink_send_query вернула 1. Ее нужно вызывать по одному разу для каждого отправленного запроса, а затем еще раз для получения результата с пустым набором, прежде чем подключение можно будет пользоваться снова.
Когда используются dblink_send_query и dblink_get_result, dblink извлекает результат удаленного запроса целиком, прежде чем передавать любую его часть локальному процессору запросов. Если запрос возвращает большое количество строк, это может занимать много памяти в локальном сеансе. Возможно, в этом случае будет лучше открыть такой запрос как курсор с помощью dblink_open, а затем извлекать приемлемыми порциями. Как вариант, можно воспользоваться простой функцией dblink(), которая избегает заполнения памяти, выгружая большие наборы результатов на диск.
Примеры
contrib_regression=# SELECT dblink_connect('dtest1', 'dbname=contrib_regression');
dblink_connect
----------------
OK
(1 row)
contrib_regression=# SELECT * FROM
contrib_regression-# dblink_send_query('dtest1', 'select * from foo where f1 < 3') AS t1;
t1
----
1
(1 row)
contrib_regression=# SELECT * FROM dblink_get_result('dtest1') AS t1(f1 int, f2 text, f3 text[]);
f1 | f2 | f3
----+----+------------
0 | a | {a0,b0,c0}
1 | b | {a1,b1,c1}
2 | c | {a2,b2,c2}
(3 rows)
contrib_regression=# SELECT * FROM dblink_get_result('dtest1') AS t1(f1 int, f2 text, f3 text[]);
f1 | f2 | f3
----+----+----
(0 rows)
contrib_regression=# SELECT * FROM
contrib_regression-# dblink_send_query('dtest1', 'select * from foo where f1 < 3; select * from foo where f1 > 6') AS t1;
t1
----
1
(1 row)
contrib_regression=# SELECT * FROM dblink_get_result('dtest1') AS t1(f1 int, f2 text, f3 text[]);
f1 | f2 | f3
----+----+------------
0 | a | {a0,b0,c0}
1 | b | {a1,b1,c1}
2 | c | {a2,b2,c2}
(3 rows)
contrib_regression=# SELECT * FROM dblink_get_result('dtest1') AS t1(f1 int, f2 text, f3 text[]);
f1 | f2 | f3
----+----+---------------
7 | h | {a7,b7,c7}
8 | i | {a8,b8,c8}
9 | j | {a9,b9,c9}
10 | k | {a10,b10,c10}
(4 rows)
contrib_regression=# SELECT * FROM dblink_get_result('dtest1') AS t1(f1 int, f2 text, f3 text[]);
f1 | f2 | f3
----+----+----
(0 rows)
dblink_cancel_query
dblink_cancel_query — отменяет любой активный запрос в именованном подключении
Синтаксис
dblink_cancel_query(text connname) returns text
Описание
Функция dblink_cancel_query пытается отменить любой запрос, выполняющийся через именованное подключение. Обратите внимание, что ее вызов не обязательно будет успешным (например, потому что удаленный запрос может уже завершиться). Запрос отмены просто увеличивает шансы на то, что этот запрос вскоре будет прерван. При этом все равно нужно будет завершить обычную процедуру обработки запроса, например вызвав dblink_get_result.
Аргументы
connname
Имя используемого подключения.
Возвращаемое значение
Возвращает OK, если запрос отмены был отправлен, или текст сообщения об ошибке в случае неудачи.
Примеры
SELECT dblink_cancel_query('dtest1');
dblink_get_pkey
dblink_get_pkey — возвращает позиции и имена полей первичного ключа отношения
Синтаксис
dblink_get_pkey(text relname) returns setof dblink_pkey_results
Описание
Функция dblink_get_pkey предоставляет информацию о первичном ключе отношения в локальной базе данных. Иногда это полезно при формировании запросов, отправляемых в удаленные базы данных.
Аргументы
relname
Имя локального отношения, например foo или myschema.mytab. Заключите его в
кавычки, если это имя в смешанном регистре или содержит специальные символы,
например "FooBar"; без кавычек эта строка приводится к нижнему регистру.
Возвращаемое значение
Возвращает по одной строке для каждого поля первичного ключа или не возвращает строк, если в отношении нет первичного ключа. Тип результирующей строки определяется как
CREATE TYPE dblink_pkey_results AS (position int, colname text);
В столбце position содержатся просто числа от 1 до N; это номер поля в первичном ключе, а не номер столбца таблицы.
Примеры
CREATE TABLE foobar (
f1 int,
f2 int,
f3 int,
PRIMARY KEY (f1, f2, f3)
);
CREATE TABLE
SELECT * FROM dblink_get_pkey('foobar');
position | colname
----------+---------
1 | f1
2 | f2
3 | f3
(3 rows)
dblink_build_sql_insert
dblink_build_sql_insert — формирует оператор INSERT
из локального
кортежа, заменяя значения полей первичного ключа переданными альтернативными
значениями
Синтаксис
dblink_build_sql_insert(text relname,
int2vector primary_key_attnums,
integer num_primary_key_atts,
text[] src_pk_att_vals_array,
text[] tgt_pk_att_vals_array) returns text
Описание
Функция dblink_build_sql_insert может быть полезна при избирательной
репликации локальной таблицы в удаленную базу данных. Она выбирает строку из
локальной таблицы по заданному первичному ключу, а затем формирует команду SQL
INSERT
, которая дублирует эту строку, но заменяет в ней значения первичного
ключа значениями из последнего аргумента. (Чтобы получить точную копию строки,
просто укажите одинаковые значения в двух последних аргументах.)
Аргументы
relname
Имя локального отношения, например foo или myschema.mytab. Заключите его в
кавычки, если это имя в смешанном регистре или содержит специальные символы,
например "FooBar"; без кавычек эта строка приводится к нижнему регистру.
primary_key_attnums
Номера атрибутов (начиная с 1) полей первичного ключа, например 1 2.
num_primary_key_atts
Число полей первичного ключа.
src_pk_att_vals_array
Значения полей первичного ключа, по которым будет выполняться поиск локального
кортежа. Каждое поле представляется в текстовом виде. Если локальной строки с
этими значениями первичного ключа нет, выдается ошибка.
tgt_pk_att_vals_array
Значения полей первичного ключа, которые будут помещены в результирующую команду
INSERT
. Каждое поле представляется в текстовом виде.
Возвращаемое значение
Возвращает запрошенный оператор SQL в текстовом виде.
Примечания
Номера атрибутов в primary_key_attnums воспринимаются как логические
номера столбцов, соответствующие позициям столбцов в SELECT * FROM relname
, а
не как физические позиции столбцов.
Примеры
SELECT dblink_build_sql_insert('foo', '1 2', 2, '{"1", "a"}', '{"1", "b''a"}');
dblink_build_sql_insert
--------------------------------------------------
INSERT INTO foo(f1,f2,f3) VALUES('1','b''a','1')
(1 row)
dblink_build_sql_delete
dblink_build_sql_delete — формирует оператор DELETE
со значениями,
передаваемыми для полей первичного ключа
Синтаксис
dblink_build_sql_delete(text relname,
int2vector primary_key_attnums,
integer num_primary_key_atts,
text[] tgt_pk_att_vals_array) returns text
Описание
Функция dblink_build_sql_delete может быть полезна при избирательной
репликации локальной таблицы в удаленную базу данных. Она формирует команду SQL
DELETE
, которая удалит строку с заданными значениями первичного ключа.
Аргументы
relname
Имя локального отношения, например foo или myschema.mytab. Заключите его в
кавычки, если это имя в смешанном регистре или содержит специальные символы,
например "FooBar"; без кавычек эта строка приводится к нижнему регистру.
primary_key_attnums
Номера атрибутов (начиная с 1) полей первичного ключа, например 1 2.
num_primary_key_atts
Число полей первичного ключа.
tgt_pk_att_vals_array
Значения полей первичного ключа, которые будут использоваться в результирующей
команде DELETE
. Каждое поле представляется в текстовом виде.
Возвращаемое значение
Возвращает запрошенный оператор SQL в текстовом виде.
Примечания
Номера атрибутов в primary_key_attnums воспринимаются как логические
номера столбцов, соответствующие позициям столбцов в SELECT * FROM relname
, а
не как физические позиции столбцов.
Примеры
SELECT dblink_build_sql_delete('"MyFoo"', '1 2', 2, '{"1", "b"}');
dblink_build_sql_delete
---------------------------------------------
DELETE FROM "MyFoo" WHERE f1='1' AND f2='b'
(1 row)
dblink_build_sql_update
dblink_build_sql_update — формирует оператор UPDATE
из локального
кортежа, заменяя значения полей первичного ключа переданными альтернативными
значениями
Синтаксис
dblink_build_sql_update(text relname,
int2vector primary_key_attnums,
integer num_primary_key_atts,
text[] src_pk_att_vals_array,
text[] tgt_pk_att_vals_array) returns text
Описание
Функция dblink_build_sql_update может быть полезна при избирательной
репликации локальной таблицы в удаленную базу данных. Она выбирает строки из
локальной таблицы по первичному ключу, а затем формирует команду SQL UPDATE
,
которая дублирует эту строку, но заменяет значения первичного ключа на значения
из последнего аргумента. (Чтобы получить точную копию строки, просто укажите
одинаковые значения в двух последних аргументах.) Команда UPDATE
всегда
присваивает значения всем полям строки — главное отличие этой функции от
dblink_build_sql_insert в том, что она предполагает, что целевая строка уже
существует в удаленной таблице.
Аргументы
relname
Имя локального отношения, например foo или myschema.mytab. Заключите его в
кавычки, если это имя в смешанном регистре или содержит специальные символы,
например "FooBar"; без кавычек эта строка приводится к нижнему регистру.
primary_key_attnums
Номера атрибутов (начиная с 1) полей первичного ключа, например 1 2.
num_primary_key_atts
Число полей первичного ключа.
src_pk_att_vals_array
Значения полей первичного ключа, по которым будет выполняться поиск локального
кортежа. Каждое поле представляется в текстовом виде. Если локальной строки с
этими значениями первичного ключа нет, выдается ошибка.
tgt_pk_att_vals_array
Значения полей первичного ключа, которые будут помещены в результирующую команду
UPDATE
. Каждое поле представляется в текстовом виде.
Возвращаемое значение
Возвращает запрошенный оператор SQL в текстовом виде.
Примечания
Номера атрибутов в primary_key_attnums воспринимаются как логические
номера столбцов, соответствующие позициям столбцов в SELECT * FROM relname
, а
не как физические позиции столбцов.
Примеры
SELECT dblink_build_sql_update('foo', '1 2', 2, '{"1", "a"}', '{"1", "b"}');
dblink_build_sql_update
-------------------------------------------------------------
UPDATE foo SET f1='1',f2='b',f3='1' WHERE f1='1' AND f2='b'
(1 row)