powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / робота с таблицами из разних бд
6 сообщений из 31, страница 2 из 2
робота с таблицами из разних бд
    #38814243
Лопата
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Христиналопата,

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
-- это отдельный запрос,
select dblink_connect ('dbname=db1 host=111.11.11.1 user=user password=111');
-- он открывает неименованное [в вашем случае] соединение.

-- а вот как-то так должен выглядеть ваш запрос
--// который должен исполняться в том же сеансе, что и передыдущий 
-- открытие соединения

INSERT INTO a_tbl (id_a,....id_keep_filter)

SELECT * FROM dblink('SELECT
id_a,.....1,null,null FROM a_tbl')
AS T(id_a,nick_a1 VARCHAR,num_a1 VARCHAR .....id_keep__filter INTEGER)
WHERE num_a1 like '20146';





т.е. схема проста: в сеансе вы "открываете" встроенного клиента к другой бД -- открыватее соединение.
а дальше в нем, в открытом соединении, делаете свое черное дело -- запрашиваете на свою сторону сторониие данные, или напротив, выполняете dml [и даже ddl] на стороне.

единственное отличие [от обычных клиентов] -- вы получаете не "рекордсеты" и т.п. объекты, а табличные наборы, которые можете джойнить (с объектами местной бд), фильтровать и т.п. средствами SQL.

PS при такой плотности общения с темой, лет за 5 вы научитесь что-то передавать туда и обратно. не надо боятся приводить ошибочный код, а тем паче его писать , и тут же смотреть образцы в rtfm.
кожение -- это наработка рефлексов , большей частью. Редко, когда требуется что-то большее.
...
Рейтинг: 0 / 0
робота с таблицами из разних бд
    #38814245
Лопата
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
/\/\/\/\/\/\ХристинаМожет быть проблема в чем-то другом ???

Проблема классическая. Находится по другую сторону монитора.

Вы написали какую-то хрень вместо реального текста запроса. Это действительно проблема: делать то, что Вас не просят.

А мелкие глупые вопросы не читавших документацию - здесь к ним привыкли, отвечают вполне спокойно.скорее всего ТС написал[а] (сократив) то, что пыталась выполнить --
т.е. всавить в таблицу возврат dblink_connect (который, как известно -- строка, если я ничего не запамятовал).
на это и произошла упомянутая выше ругань -- возврат "Ok" не захотел ложиться в кучку полей, несколько более числом, чем 1.

а дальнейший запрос -- который оказался просто выборкой из открытого соединеия (и никуда не собирался вставиться, а просто был синтаксически безвредным) -- просто не выполнился по причине ошибки в предыдущем стейтменте батча.
...
Рейтинг: 0 / 0
робота с таблицами из разних бд
    #38814299
/\/\/\/\/\/\
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
лопата,

Последний запрос - это не просто выборка.
Там зачем-то выбираются значения NULL, которые можно выбрать на клиенте, а не на удаленном сервере. И фильтрация так же идет на клиенте, а не на удаленном сервере.
То есть получаем большее количество строк с более широкими записями. Это совершенно не нужно.

А так да, автору можно попробовать обратиться к форме вызова процедуры:
Код: sql
1.
dblink(text connstr, text sql [, bool fail_on_error]) returns setof record


Это из RTFM .

После того, как этот запрос заработает с выборкой нужного количества полей и строк, к нему сверху можно приписать конструкцию INSERT INTO .... (....) для непосредственной вставки.

Если автор желает воспользоваться именованными соединениями, то настоятельно рекомендую обернуть в анонимные блоки.
...
Рейтинг: 0 / 0
робота с таблицами из разних бд
    #38814341
Лопата
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
/\/\/\/\/\/\лопата,

Последний запрос - это не просто выборка.
Там зачем-то выбираются значения NULL, которые можно выбрать на клиенте, а не на удаленном сервере. И фильтрация так же идет на клиенте, а не на удаленном сервере.
То есть получаем большее количество строк с более широкими записями. Это совершенно не нужно.

А так да, автору можно попробовать обратиться к форме вызова процедуры:
Код: sql
1.
dblink(text connstr, text sql [, bool fail_on_error]) returns setof record


Это из RTFM .

После того, как этот запрос заработает с выборкой нужного количества полей и строк, к нему сверху можно приписать конструкцию INSERT INTO .... (....) для непосредственной вставки.

Если автор желает воспользоваться именованными соединениями, то настоятельно рекомендую обернуть в анонимные блоки.

узбагойтеса, имелось в виду, что "пазледний заброз" никуда не вставляедза.
а пытаедся вставидса аккурат возврат дблинк-коннекта.

в ртфм афтара отсылали недели 2 тому. но афтар боицца чо-то делать руками в темпе чуть быстрее, чем одна попытка в неделю.
т.ч. тут напирать с особостями работы клиента с БД (т.е. разъяснять, что фильтрация дешевле на сервере, чем на клиенте) -- пока рано, евпочя. пусть хоть что-то начнёт делать.

такошто зо всеми вашими зловесами в предыдущем постинге згорее зогласен

я бы вощбе рекомендовал аффтару начать с получения SELECT 1; с удаленного сервера, ну или чего попроще из информативного -- SELECT version(); SELECT pg_.....()
т.е. с примитивов,
постепенно обдумывая, что же происходит на той стороне.



а анонимные блоки вовсе не обязательны, если вы сами контролируете сеанс, или транзакцию (не отдавая пулеру возможность подменить вам соединение) , но в большинстве сложных случаев -- удобны.
...
Рейтинг: 0 / 0
робота с таблицами из разних бд
    #38814353
Лопата
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Христина,

вот примерно таких пассов руками поделайте:

наработка рефлексов
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
create extension IF NOT EXISTS dblink;
-- без предустановки соединения:
SELECT * FROM dblink('dbname=test password=postgres','SELECT 1;') AS 
	t (f integer);
-- 1

-- проверка, что соединение, в таком случае, не держится:
SELECT * FROM dblink('SELECT 1;') AS t (f integer);
-- ERROR: connection not available
-- SQL-состояние: 08003
-- открытие явного неименованного соединения
SELECT dblink_connect('dbname=test password=postgres');
-- OK
-- проверка, что соединение, в таком случае, держится:
SELECT * FROM dblink('SELECT 1;') AS t (f integer);
-- 1
SELECT * FROM dblink('SELECT 1;') AS t (f integer);
-- 1
-- закрытие неименованного соединения:
SELECT dblink_disconnect();
--'OK'
SELECT * FROM dblink('SELECT 1;') AS t (f integer);
--ERROR: connection not available
--SQL-состояние: 08003

-- открытие именованного соединения 
SELECT dblink_connect('test connection','dbname=test password=postgres');
-- OK
SELECT dblink_connect('test connection','dbname=test password=postgres');
--ERROR: duplicate connection name
--SQL-состояние: 42710
-- попытка  использо как неименое
SELECT * FROM dblink('SELECT 1;') AS t (f integer);
--ERROR: connection not available
--SQL-состояние: 08003
SELECT * FROM dblink('test connection','SELECT 1;') AS t (f integer);
-- 1
SELECT * FROM dblink('test connection','SELECT version();') AS t (f text);
--'PostgreSQL 9.3.5 on x86_64-unknown-linux-gnu, compiled by gcc...
--
SELECT dblink_get_connections();
-- '{"test connection"}'
SELECT * FROM dblink('test connection','SELECT dblink_get_connections();') AS t (f text);
--RROR: function dblink_get_connections() does not exist
--SQL-состояние: 42883
SELECT * FROM dblink('test connection','create extension IF NOT EXISTS dblink;SELECT dblink_get_connections();') AS t (f text);
--'OK'
SELECT * FROM dblink('test connection','SELECT dblink_connect(''test connection'',''dbname='||current_database() ||' password=postgres'');') AS t (f text);
--'OK'
SELECT * FROM dblink('test connection','SELECT dblink_get_connections();') AS t (f text);
-- '{"test connection"}'
SELECT * FROM dblink('test connection','SELECT * FROM dblink(''test connection'', ''SELECT current_database()'') AS t (f text) ;') AS t (f text);
--'testdb'
SELECT * FROM dblink('test connection','SELECT * FROM dblink($$test connection$$,$x$SELECT dblink_connect($$test connection$$,$$dbname=test password=postgres$$);$x$) AS t (f text)') AS t (f text);
--'OK'
SELECT * FROM dblink('test connection','SELECT * FROM dblink($$test connection$$,$x$SELECT dblink_get_connections();$x$) AS t (f text)') AS t (f text);

SELECT current_database(), dblink_get_connections(),pg_backend_pid();
-- 'testdb','{"test connection"}',3558
SELECT * FROM dblink('test connection','SELECT * FROM dblink($$test connection$$,$x$SELECT current_database(), dblink_get_connections(),pg_backend_pid();;$x$)
	AS t (f text, f2 text[],f3 integer)')
	AS t (f text, f2 text[],f3 integer);
-- 'testdb','{"test connection"}',3707
--Внимание, впорос: почему  в одной БД 2 одноименных соединения  разных сеансах [PID] ?


...
Рейтинг: 0 / 0
робота с таблицами из разних бд
    #38816126
Христина
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
лопата,Все пошло, все работает, очень Вам благодарна !!!
авторPS при такой плотности общения с темой, лет за 5 вы научитесь что-то передавать туда и обратно.
Я знаю, просто у меня еще маленький ребенок и мало свободного времени
...
Рейтинг: 0 / 0
6 сообщений из 31, страница 2 из 2
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / робота с таблицами из разних бд
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]