Postgresql 9.6, вызов удаленной функции с оберткой данных выдает различные ошибки - PullRequest
0 голосов
/ 27 апреля 2018

Я создал функцию в базе данных, которая вставляет записи в таблицу. Эта функция возвращает VOID и принимает текстовый массив VARIADIC в качестве входного параметра. Когда я запускаю функцию из базы данных локально, она работает нормально, как и ожидалось.

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

Вот как я делаю один вид звонка:

SELECT dblink('pg_log', 
'SELECT public.insert_log(''usage'', ''txn'', ''dimensions'', ''test'', null, 
''pgwrapper'', ''temp_var'', null,  null, null, ''Start'', null, 
                     null, null, null);');

Тот выдает эту ошибку:

функция, возвращающая запись, вызванная в контексте, которая не может принять тип записи

Когда я заменяю Select dblink на PERFORM dblink, я получаю эту ошибку:

синтаксическая ошибка в или около "PERFORM"

И когда я пытаюсь, ВЫБЕРИТЕ dblink_exec:

Я получаю эту ошибку:

оператор, возвращающий результаты не разрешен

Опять же, функция работает так, как я ее вызвал, чтобы проверить ее, и она делает то, что должна.

Я проверил соединение с этим, и оно вернулось OK:

SELECT dblink_connect('pg_log');

У кого-нибудь есть идеи, почему это не получается, и предложения по исправлению?

Спасибо!

1 Ответ

0 голосов
/ 27 апреля 2018

Похоже, вам нужно попробовать SELECT * FROM dblink(...) AS t1(column_name type) вместо SELECT dblink(...).

Из документации PostgresSQL:

Функция возвращает строку (и), произведенную запросом. Поскольку dblink может использоваться с любым запросом, он объявляется для возврата записи, а не для указания какого-либо конкретного набора столбцов. Это означает, что вы должны указать ожидаемый набор столбцов в вызывающем запросе, иначе PostgreSQL не будет знать, чего ожидать. Вот пример:

SELECT *
FROM dblink('dbname=mydb options=-csearch_path=',
            'select proname, prosrc from pg_proc')
  AS t1(proname name, prosrc text)
WHERE proname LIKE 'bytea%';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...