今天想在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客户端自身的问题。