今天想在PostgeSQL數據庫里建一個存儲過程(或函數也行),由於對存儲過程比較生疏,上網搜了很多教程和源代碼例子,照着寫,發現怎么都不行,甚至把網上教程包括官方教程的源代碼原封不動的復制下來一執行都會報錯,
教程示例:
---創建自定義函數sales_tax CREATE or replace FUNCTION sales_tax(subtotal real) RETURNS real AS $$ BEGIN RETURN subtotal * 0.06; END; $$ LANGUAGE plpgsql; ---調用自定義函數sales_tax select * from sales_tax(0.5)
但在我的Mac上,報錯,說是美元符號$$未結束,在Windows機器上也是一樣報錯。
Unterminated dollar quote started at position 71 in SQL ....
但網上根本找不到可用的解決辦法,都快崩潰了,想改成用Python來實現算了。直到找到萬能的stackoverflow網站(https://stackoverflow.com/questions/55596620/unterminated-dollar-quote):
For platforms that don't recognize dollar quoting you can use ' instead. You'll need to escape any ' in the body of the anonymous function though.
意思是,有些PostgreSQL版本是不支持$$符號的,這時可以換成單引號''來包裹住函數(存儲過程)的主體語句。於是我替換成單引號之后,馬上就可以了:
---創建自定義函數sales_tax CREATE or replace FUNCTION sales_tax(subtotal real) RETURNS real AS ' BEGIN RETURN subtotal * 0.06; END; ' LANGUAGE plpgsql; ---調用自定義函數sales_tax select * from sales_tax(0.5)
特記錄一下。另外,存儲過程(StoredProcedure)和函數(Function)還是有區別的,用慣了微軟的SQL Server的人應該都很清楚,但發現網上用PostgreSQL的人很多都把兩者搞混淆了,認為Function就是存儲過程。這可能是因為在PostgreSQL里,二者非常相似,函數和存儲過程都可以有輸入、輸出參數。例如,上面的Function也可以改成存儲過程:
create or replace procedure my_proc(subtotal real, INOUT tax real) AS ' BEGIN tax := subtotal * 0.07; END; ' LANGUAGE plpgsql;
注意:存儲過程不能有out類型的參數,需要改成INOUT型,表示輸入或輸出類型。
----------------------------------------------------------------------------------------------------
后續:后來發現,$$符號也可以用,但需要配合PostgreSQL的PG Admin4的web頁面的編輯框使用,在DBVisualizer客戶端用不了, 看來應該是DBVisualizer客戶端自身的問題。