Почему я не могу вызвать функцию PL/pgSQL из pgScript pgAdmin?

Наша база данных 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.


EDIT: я попытался полностью уточнить имя функции, предложенное 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

person gutch    schedule 28.02.2012    source источник
comment
Это означает, что pgScript выполняется в контексте другой базы данных.   -  person A.H.    schedule 28.02.2012
comment
Такое заявление: SELECT mydb.myschema.some_func(..); никогда не может работать. Как говорится в сообщении об ошибке: ссылки между базами данных не реализованы. Вы не можете префикс имени базы данных. Вы, должно быть, ошиблись в своем редактировании.   -  person Erwin Brandstetter    schedule 29.02.2012
comment
Текст редактирования выше правильный. Оказывается, вероятная ошибка в pgAdmin (см. комментарии в ответе ниже) означает, что он выполняет pgScript не в той базе данных. Таким образом, при выполнении приведенного выше кода в виде SQL префикс соответствует имени базы данных и, таким образом, не вызывает проблем; при выполнении кода как pgScript он работает в другой базе данных, поэтому префикс не совпадает и вызывает ошибку...   -  person gutch    schedule 29.02.2012


Ответы (1)


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

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

Проблема скорее всего в том, что некоторые настройки в 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.

person A.H.    schedule 28.02.2012
comment
Да, это определенно одна и та же база данных, пользователь и search_path, потому что единственная разница заключается в том, какую кнопку я нажимаю в pgAdmin: Выполнить запрос или Выполнить pgScript - person gutch; 28.02.2012
comment
Не могли бы вы попробовать указать путь поиска явно или полностью указать имя функции? Я знаю, что это не нужно, но pgAdmin может делать что-то странное (например, содержать ошибку). - person Eelke; 28.02.2012
comment
Я пытался установить путь поиска с помощью SET search_path TO public;, и это не имеет значения. Однако, когда я полностью уточняю имя функции, я получаю другое сообщение об ошибке — см. мое редактирование выше! - person gutch; 28.02.2012
comment
Я не уверен, что pgscript может обрабатывать хранимые процедуры. - person fluca1978; 28.02.2012
comment
@fluca1978: сервер не различает свои собственные функции и функции, определяемые пользователем. Сообщение об ошибке является сообщением сервера. Таким образом, pgAdmin отсутствует, если только он не делает что-то очень волшебно. - person A.H.; 28.02.2012
comment
Я принимаю этот ответ, потому что ваш пример кода помог мне найти проблему: похоже, это ошибка в pgAdmin. Значение, возвращаемое current_database(), изменяется при запуске как SQL по сравнению с запуском как pgScript, хотя я запускаю его в том же окне pgAdmin. Чтобы быть точным, pgScript работает с неправильной базой данных, поскольку current_database() возвращает значение, отличное от имени базы данных, отображаемого в строке заголовка окна. Я сообщу об этом как о вероятной ошибке в список рассылки pgadmin-support. - person gutch; 29.02.2012
comment
Вот мой отчет об ошибке: archives.postgresql.org/pgadmin-support/2012 -02/msg00151.php - person gutch; 29.02.2012