2012-02-28 56 views
0

我們的PostgreSQL數據庫包含一個用PL/pgSQL編寫的函數。我可以運行它只是從SQL查詢窗口,這樣的罰款:爲什麼我不能從pgAdmin pgScript調用PL/pgSQL函數?

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 

這是爲什麼?是否可以從pgScript調用PL/pgSQL函數?

如果相關:我試圖在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 
+0

這意味着,pgScript在另一個數據庫的上下文中執行。 – 2012-02-28 10:55:41

+0

像這樣的語句:'SELECT mydb.myschema.some_func(..);'不能工作。如錯誤消息所示:跨數據庫引用未實現。您不能爲數據庫名稱加前綴。您必須在編輯時誤會。 – 2012-02-28 22:22:47

+0

上面的編輯文本是正確的。事實證明,pgAdmin中一個可能的錯誤(請參閱下面的答案中的註釋)意味着它在錯誤的數據庫上執行pgScript。因此,當執行上面的代碼作爲SQL時,前綴匹配數據庫名稱,因此不會引起任何問題;當執行代碼爲pgScript時,它運行在不同的數據庫上,所以前綴不匹配並觸發錯誤... – gutch 2012-02-28 23:42:28

回答

2

你仔細檢查你^ h在這兩種情況下都是相同的環境?請檢查

  • 同一個數據庫,
  • 相同的用戶,
  • 相同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; 

結束編輯

順便說一句:作爲錯誤消息來自所述服務器,這將與寫入任何語言功能發生(例如SQL,pljava),而不僅僅是PL/pgSQL。

+0

是的,它絕對是相同的數據庫,用戶和search_path,因爲唯一的區別是我在pgAdmin中按哪個按鈕:_Execute query_或_Execute pgScript_ – gutch 2012-02-28 08:57:23

+0

您可以嘗試顯式設置搜索路徑還是完全限定函數名稱?我知道這不應該被需要,但pgAdmin可能會做一些奇怪的事情(如包含錯誤)。 – Eelke 2012-02-28 09:39:19

+0

我試着用'SET search_path TO public;'設置搜索路徑,它沒有區別。但是,當我完全品質的功能名稱,然後我得到一個_different_錯誤消息 - 請參閱我上面的編輯! – gutch 2012-02-28 09:55:41

相關問題