вставка строк по времени создания

в одной БД1 есть таблица, содоржащая одну запись из столбца со времен посденей операции вставки.

CREATE TABLE time_rep
(
tm timestamp without time zone NOT NULL
)
WITH (OIDS=FALSE);
ALTER TABLE time_rep OWNER TO postgres;

в другой БД2 есть таблица:
CREATE TABLE inserted
(
id serial NOT NULL,
"name" character varying(20) NOT NULL,
data text,
"time" timestamp without time zone NOT NULL,
CONSTRAINT inserted_pkey PRIMARY KEY (id)
)
WITH (OIDS=FALSE);
ALTER TABLE inserted OWNER TO postgres;

где храняться строки со времем вставки.

Теперь мне надо из таблицы БД2 в таблицу БД1 вставить строки, время которых больше чем время строки из БД1.

пишу код
CREATE OR REPLACE FUNCTION table_update()
returns boolean as
$body$
declare
begin
insert into tab_slave SELECT * from
dblink('host=127.0.0.1 dbname=test user=postgres password=zzcz2com','select id, name from inserted where "time" >' || time_rep.tm)
as t (id integer, name varchar(20));
return true;
end;
$body$
LANGUAGE 'plpgsql' VOLATILE
COST 100;
ALTER FUNCTION table_update() OWNER TO postgres;

не нравится ему....как сделать?

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

А какая

А какая собственно ошибка?

если нужно догадаться, то предположительно здесь
dblink('host=127.0.0.1 dbname=test user=postgres password=zzcz2com','select id, name from inserted where "time" >' || time_rep.tm)

что можно исправить например так:
dblink('host=127.0.0.1 dbname=test user=postgres password=zzcz2com','select id, name from inserted where "time" >' || quote_literal((select tm from time_rep)))

именно так я и

именно так я и сделал уже)

толко у меня

толко у меня теперь новая пробелемма:
мне нужно вставить в удаленную таблицу строку, делаю так:

perform dblink_connect('host=127.0.0.1 dbname=slave user=postgres password=zzcz2com');
	SELECT dblink_exec('insert into tab_slave values (' || quote_literal((SELECT id, name FROM inserted WHERE id=11)) || ')');	
	perform dblink_disconnect();
	RETURN true;

возвращает ошибку:
ERROR:  subquery must RETURN only one COLUMN
КОНТЕКСТ:  SQL statement "select dblink_exec('insert into tab_slave values (' || quote_literal((select id, name from inserted where id=11)) || ')')"
PL/pgSQL FUNCTION "table_insert" line 4 at SQL statement

в принципе

в принципе сделал, но мне не нравиться, может можно как то по другому:

             perform dblink_connect('host=127.0.0.1 dbname=slave user=postgres password=zzcz2com');
	SELECT * FROM dblink_exec('insert into tab_slave values (' || quote_literal((SELECT id FROM inserted WHERE id=11)) || ', ' || quote_literal((SELECT name FROM inserted WHERE id=11)) || ')', true)
	AS t(ex_resutl);	
	perform dblink_disconnect();
	RETURN true;

и при етом выдает ошибку:

ERROR:  query has no destination FOR result DATA
ПОДСКАЗКА:  IF you want TO discard the results of a SELECT, USE PERFORM instead.
КОНТЕКСТ:  PL/pgSQL FUNCTION "table_insert" line 4 at SQL statement

но данные все таки вставляет в удаленную таблицу.
Можно ли сделать так, что бы вставить весь селект? Ведь иначе если будет 100 столбцов то и quote_literal()
надо будет 100 раз писать....

ошибку он

ошибку он выдает, потому что результат селекта вы никуда не сохраняете, должно быть либо

SELECT foo INTO var  FROM dblink_exec(...)

или так
perform dblink_exec(...)

perform dblink_exec('insert into tab_slave values (' || (
   SELECT quote_literal(id)||','|| 
          quote_literal(name)||','||
          quote_literal(name2)
   FROM inserted WHERE id=11)||')', TRUE)
	AS t(ex_resutl);

спасибо, я

спасибо, я сделал через perform.
просто перевел ошибку =)

Опции просмотра комментариев

Выберите предпочитаемый вами способ показа комментариев и нажмите "Сохранить настройки" для активации изменений.

Back to top

(С) Виктор Вислобоков, 2008-2023