我們的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
這意味着,pgScript在另一個數據庫的上下文中執行。 – 2012-02-28 10:55:41
像這樣的語句:'SELECT mydb.myschema.some_func(..);'不能工作。如錯誤消息所示:跨數據庫引用未實現。您不能爲數據庫名稱加前綴。您必須在編輯時誤會。 – 2012-02-28 22:22:47
上面的編輯文本是正確的。事實證明,pgAdmin中一個可能的錯誤(請參閱下面的答案中的註釋)意味着它在錯誤的數據庫上執行pgScript。因此,當執行上面的代碼作爲SQL時,前綴匹配數據庫名稱,因此不會引起任何問題;當執行代碼爲pgScript時,它運行在不同的數據庫上,所以前綴不匹配並觸發錯誤... – gutch 2012-02-28 23:42:28