postgresql + dblink + вставка с возвратом

Мне нужно вставить запись в удаленную базу данных и вставить идентификатор. Что я делаю не так?

DECLARE

ticketvar mytable%rowtype;

SqlCommand TEXT;

BEGIN    

ticketvar.c1 := somevalue;
ticketvar.c2 := somevalue;

SqlCommand := 'INSERT INTO mytable ( c1, c2)  VALUES (||ticketvar.c1||, ||ticketvar.c2||) returning tid';

tid =  (select *  from dblink('mydatawrapper',SqlCommand)  AS t1(bigint tid)  );

...

Выдает ошибку `

ОШИБКА: отсутствует запись FROM-предложения для таблицы "ticketvar"`

С оператором select все работает нормально:

result = (select *  from dblink('mydatawrapper','SELECT tid FROM mytable WHERE c1='||c1||'')  AS t1(bigint tid) );

person Natalie    schedule 20.04.2016    source источник
comment
Вы пробовали «ВСТАВИТЬ В mytable (c1, c2) VALUES ('||ticketvar.c1||',' ||'ticketvar.c2||'), возвращая tid', конечно, если c1 и c2 являются целыми числами. Если это строки, вы должны добавить '' в соответствующих местах. Например, ''',''' вместо ',' и '', где вы тормозите струну.   -  person Vladimir    schedule 20.04.2016
comment
да, и это действительно сработало! , забыл закрыть вопрос. все равно спасибо за помощь!   -  person Natalie    schedule 20.04.2016


Ответы (2)


http://www.postgresonline.com/journal/archives/44-Using-DbLink-to-access-other-PostgreSQL-Databases-and-Servers.html

Вам нужно соединение, на основе которого вы можете выполнить свою вставку с returning, как с вами sqlCommand.

Чтобы ответить на вопрос. Мне кажется, что вы используете plSQL - достаточно простого SQL.

person Michał Zaborowski    schedule 20.04.2016
comment
Соединение устанавливается через обёртку сторонних данных mydatawrapper - person Natalie; 20.04.2016
comment
Да... Я начал отвечать без форматирования, возможно, поэтому я это пропустил - немного. Некоторое время назад мне пришлось сделать dblink, и эта страница мне помогла, поэтому я ответил. :) - person Michał Zaborowski; 20.04.2016

Пример, который работал у меня с внешней оболочкой данных + dblink:

-- if text field has apostrophes:
value2 = replace(value2,'''','''''');

q1 = 'INSERT INTO foreign_table1( field1,field2,field3) 
      VALUES ('||value1||','''||value2||''', now()) RETURNING id';

SELECT * FROM dblink('foreign_server', q1) 
         AS foreign_rec(id INTEGER) INTO foreign_table1_id;
person transcendx    schedule 01.08.2019