Почему я не могу вызвать функцию PL / pgSQL из pgAdmin pgAdmin? - PullRequest
0 голосов
/ 28 февраля 2012

Наша база данных PostgreSQL содержит функцию, написанную на PL / pgSQL. Я могу просто запустить его из окна SQL-запроса, например:

BEGIN TRANSACTION;
SELECT sg_copy_form(414, 2621, 1, 1035);
ROLLBACK TRANSACTION;

Однако, если я запускаю точно такой же SQL, что и pgScript выше (например, нажмите кнопку Выполнить pgScript в pgAdmin вместо Выполнить запрос ), тогда я получу следующую ошибку:

[QUERY    ] BEGIN TRANSACTION
[WARNING  ] SELECT sg_copy_form(414, 2621, 1, 1035)
        ERROR:  function sg_copy_form(integer, integer, integer, integer) does not exist
        LINE 1: SELECT sg_copy_form(414, 2621, 1, 1035)
                       ^
        HINT:  No function matches the given name and argument types. You might need to add explicit type casts.
[QUERY    ] ROLLBACK TRANSACTION

Почему это? Можно ли вызвать функцию PL / pgSQL из pgScript?

Если уместно: я пытаюсь сделать это на PostgreSQL 8.3.14 с помощью pgAdmin III 1.12.2.


РЕДАКТИРОВАТЬ: Я попытался полностью определить название функции, как предложено Eelke, например:

BEGIN TRANSACTION;
SELECT db_dev.public.sg_copy_form(414, 2621, 1, 1035);
ROLLBACK TRANSACTION;

Он по-прежнему работает правильно, когда выполняется как обычный запрос SQL, но теперь я получаю сообщение об ошибке Другой , когда я запускаю его как pgScript:

[QUERY    ] BEGIN TRANSACTION
[WARNING  ] SELECT db_dev.public.sg_copy_form(414, 2621, 1, 1035)
        ERROR:  cross-database references are not implemented: db_dev.public.sg_copy_form
[QUERY    ] ROLLBACK TRANSACTION

1 Ответ

2 голосов
/ 28 февраля 2012

Вы дважды проверили, что у вас одинаковая среда в обоих случаях? Пожалуйста, проверьте

  • та же база данных,
  • тот же пользователь,
  • тот же путь поиска

Скорее всего, проблема в том, что некоторые настройки в pgadmin3 отличаются, и вы просто не «видите» функцию.

Редактировать

Вы можете сравнить настройки следующим образом:

Выполнить это как обычный SQL (т.е. только «Выполнить»):

select current_database(), current_user, current_setting('search_path');

Выполнить это как pgScript:

declare @foo{ @db, @usr, @p };
set @foo = select current_database(), current_user, current_setting('search_path');
print @foo;

Конец редактирования

Кстати: поскольку сообщение об ошибке приходит с сервера, это может произойти с функциями, написанными на любом языке (например, SQL, pljava), а не только на PL / pgSQL.

...