2012-02-28 3 views
0

PostgreSQL 데이터베이스에는 PL/pgSQL로 작성된 함수가 포함되어 있습니다. 나는 pgScript (예를 들어 위와 동일 SQL을 실행하면 실행 pgAdmin에 실행 pgScript 버튼을 클릭하는 대신 , 그러나pgAdmin pgScript에서 PL/pgSQL 함수를 호출 할 수없는 이유는 무엇입니까?

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

:이 같은 SQL 쿼리 창에서 그것이 잘 실행할 수 있습니다 쿼리) 나는 다음과 같은 오류 얻을 :

[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 

이 왜입니까? pgScript에서 PL/pgSQL 함수를 호출 할 수 있습니까?

관련 사항 : PostgreSQL 8.3.14에서 pgAdmin III 1.12.2를 사용하고 있습니다.


편집 : 나는 Eelke에 의해 제안과 같이, 함수의 이름을 완전히 자격을 시도 : 일반 SQL 쿼리로 실행할 때

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

그것은 여전히 ​​제대로 작동하지만 지금은 나는 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 (..);'는 절대로 작동하지 않습니다. 오류 메시지에 : 데이터베이스 간 참조가 구현되어 있지 않습니다. database-name에는 접두사를 붙일 수 없습니다. 당신은 편집에 착각해야합니다. –

+0

위 편집의 텍스트가 정확합니다. pgAdmin의 버그 (아래 답변의 주석 참조)가 잘못된 데이터베이스에서 pgScript를 실행한다는 것을 알 수 있습니다.따라서 위의 코드를 SQL로 실행하면 접두어가 데이터베이스 이름과 일치하므로 문제가 발생하지 않습니다. 코드를 pgScript로 실행하면 다른 데이터베이스에서 실행되므로 접두사가 일치하지 않아 오류가 발생합니다 ... – gutch

답변

2

당신이 다시 확인 했 당신 시간 두 경우 모두 같은 환경을 가졌습니까? 확인하시기 바랍니다

  • 동일한 데이터베이스,
  • 동일한 사용자,
  • 같은 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

예를 들어, pgAdmin에서 어떤 버튼을 누르는 것이 유일한 차이점이기 때문에 분명히 동일한 데이터베이스, 사용자 및 search_path입니다. : _Execute query_ 또는 _Execute pgScript_ – gutch

+0

명시 적으로 검색 경로를 설정하거나 함수 이름을 완전히 한정 해 줄 수 있습니까? 필요한 것은 아니지만 pgAdmin이 이상한 일을하고있을 수도 있다는 것을 알고 있습니다 (버그가있는 것처럼). – Eelke

+0

'SET search_path TO public; '으로 검색 경로를 설정하려고했지만 아무런 효과가 없습니다. 그러나 완전히 함수 이름을 질 때 _different_ 오류 메시지가 나타납니다 - 위의 편집을 참조하십시오! – gutch

관련 문제