今天想在PostgeSQL數據庫裏建一個存儲過程(或函數也行),因爲對存儲過程比較生疏,上網搜了不少教程和源代碼例子,照着寫,發現怎麼都不行,甚至把網上教程包括官方教程的源代碼原封不動的複製下來一執行都會報錯,
html
教程示例:web
---建立自定義函數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機器上也是同樣報錯。sql
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也能夠改爲存儲過程:post
create or replace procedure my_proc(subtotal real, INOUT tax real) AS ' BEGIN tax := subtotal * 0.07; END; ' LANGUAGE plpgsql;
注意:存儲過程不能有out類型的參數,須要改爲INOUT型,表示輸入或輸出類型。網站
----------------------------------------------------------------------------------------------------spa
後續:後來發現,$$符號也能夠用,但須要配合PostgreSQL的PG Admin4的web頁面的編輯框使用,在DBVisualizer客戶端用不了, 看來應該是DBVisualizer客戶端自身的問題。code