MySQL DELIMITER的问题在PostgreSQL中表现得完全不同(首先,大多数程序员不会使用psql命令行输入函数;相反,你会编写一个SQL脚本文件并执行它,但这不是你的问题的重点。 在PostgreSQL中,函数体基本上是一个长字符串。该字符串可以由基本上不与其他任何内容冲突的任何内容分隔。在SQL标准中-以及PostgreSQL文档中-使用单引号',而不是像MySQL那样,在函数体开始时不加引号。所以当你写一个函数头时,(CREATE FUNCTION ...)在写分号终止语句之前,你会写一个引号来开始函数体。这意味着MySQL的分号问题在PostgreSQL中不存在:解析器只是阅读一个字符串,并等待该字符串用结束引号完成,然后命令用分号结束。 然而,还有更多的东西。 在PostgreSQL中,惯例是使用$$或$anything_goes_here$,即所谓的美元引号,而不是'来启动函数体。这样做的原因是它避免了在函数体中转义嵌入的引号。有关此功能的解释,请参阅the docs。 泛型函数定义看起来有点像这样:
CREATE FUNCTION my_func(arg1 data_type, ...) RETURNS data_type AS $body$
INSERT INTO foo(my_column) VALUES(arg1)
RETURNING some_column;
$body$ LANGUAGE sql;
2条答案
按热度按时间kulphzqa1#
MySQL DELIMITER的问题在PostgreSQL中表现得完全不同(首先,大多数程序员不会使用
psql
命令行输入函数;相反,你会编写一个SQL脚本文件并执行它,但这不是你的问题的重点。在PostgreSQL中,函数体基本上是一个长字符串。该字符串可以由基本上不与其他任何内容冲突的任何内容分隔。在SQL标准中-以及PostgreSQL文档中-使用单引号
'
,而不是像MySQL那样,在函数体开始时不加引号。所以当你写一个函数头时,(CREATE FUNCTION ...
)在写分号终止语句之前,你会写一个引号来开始函数体。这意味着MySQL的分号问题在PostgreSQL中不存在:解析器只是阅读一个字符串,并等待该字符串用结束引号完成,然后命令用分号结束。然而,还有更多的东西。
在PostgreSQL中,惯例是使用
$$
或$anything_goes_here$
,即所谓的美元引号,而不是'
来启动函数体。这样做的原因是它避免了在函数体中转义嵌入的引号。有关此功能的解释,请参阅the docs。泛型函数定义看起来有点像这样:
字符串
请注意,PostgreSQL中也有其他编程语言-最值得注意的是PL/pgSQL,内置的过程语言,但也有Perl,Python,Tcl,C的变体... -并且都使用相同的函数定义语法(根据SQL标准),包括分隔符,只有函数体会有所不同。
你也可以为不同的函数使用不同的分隔符,但是单个函数的开始和结束分隔符需要匹配。
rm5edbpk2#
在PostgreSQL中,我们只能使用分隔符$$和',并且没有办法更改分隔符,而MySQL可以使用更多的分隔符,只要没有冲突,并且可以使用
DELIMITER $$
,DELIMITER //
等更改分隔符。