今天想在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