dblink#
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
, а не указывающий какой-либо конкретный набор столбцов. Это означает, что вы должны указать ожидаемый набор столбцов в вызывающем запросе - в противном случае Tantor BE не будет знать, что ожидать. Вот пример:
SELECT * FROM dblink('dbname=mydb options=-csearch_path=', 'select proname, prosrc from pg_proc') AS t1(proname name, prosrc text) WHERE proname LIKE 'bytea%';
Часть “alias” предложения FROM
должна указывать имена столбцов и типы, которые функция вернет. (Указание имен столбцов в псевдониме на самом деле является стандартным синтаксисом SQL, но указание типов столбцов является расширением Tantor BE). Это позволяет системе понять, что должно быть развернуто вместо *
и на что ссылается proname
в предложении WHERE
, до попытки выполнить функцию. Во время выполнения будет сгенерирована ошибка, если фактический результат запроса из удаленной базы данных не имеет того же количества столбцов, что и в предложении FROM
. Однако имена столбцов не обязательно должны совпадать, и dblink
не настаивает на точном соответствии типов. Он будет успешным, если возвращаемые строки данных являются допустимым вводом для типа столбца, объявленного в предложении FROM
.
Примечания
Удобный способ использования dblink
с предопределенными запросами - создание представления.
Это позволяет информацию о типе столбца замаскировать в представлении,
вместо того, чтобы каждый раз указывать ее в каждом запросе. Например,
CREATE VIEW myremote_pg_proc AS SELECT * FROM dblink('dbname=postgres 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=postgres 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=postgres 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)