2012-02-28 1 views
0

Наша база данных PostgreSQL содержит функцию, написанную в PL/pgSQL. Я могу запустить это прекрасно из окна SQL запроса, как это:Почему я не могу вызвать функцию PL/pgSQL из pgAdmin pgScript?

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

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

[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 
+0

Это означает, что pgScript выполняется в контексте другой базы данных. –

+0

Оператор вроде: SELECT mydb.myschema.some_func (..); 'никогда не может работать. Как говорится в сообщении об ошибке: ссылки на междоменные базы данных не реализованы. Вы не можете префикс имени базы данных. Вы должны ошибаться в своем редактировании. –

+0

Текст, указанный выше, верен. Оказывается, вероятная ошибка в pgAdmin (см. Комментарии в ответе ниже) означает, что он выполняет pgScript в неправильной базе данных.Поэтому при выполнении кода выше как SQL префикс соответствует имени базы данных и, следовательно, не вызывает проблем; при выполнении кода в виде pgScript он запускается в другой базе данных, поэтому префикс не соответствует и вызывает ошибку ... – gutch

ответ

2

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

  • же база данных,
  • же пользователь,
  • же search_path

Проблема наиболее вероятно, что некоторые параметры в 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; 

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

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

+0

Да, это определенно та же база данных, пользователь и search_path, поскольку единственная разница в том, какая кнопка я нажимаю в pgAdmin : _Execute query_ или _Execute pgScript_ – gutch

+0

Не могли бы вы попытаться установить путь поиска явно или полностью квалифицировать имя функции? Я знаю, что это не нужно, но pgAdmin может делать что-то странное (например, содержать ошибку). – Eelke

+0

Я попытался установить путь поиска с помощью 'SET search_path To public;' и это не имеет значения. Однако, когда я полностью меняю имя функции, я получаю сообщение об ошибке _different_ - см. Мое редактирование выше! – gutch

 Смежные вопросы

  • Нет связанных вопросов^_^