我想知道如何做到这一点,因为在环顾四周之后,我发现所有这些都是漫长而复杂的方法来完成这项看似简单的工作。 在MySQL中,我们有
DELIMITER //
...function start
INSERT INTO table VALUES (1);
...function end//
DELIMITER ;
在我们想要使用存储过程或功能时非常有用。我正在寻找postgreSQL中的等价物,如果有的话。
提前致谢!
答案 0 :(得分:3)
MySQL DELIMITER的问题在PostgreSQL中有很大不同。 (首先,大多数程序员不会使用psql
命令行来输入函数;而是你编写一个SQL脚本文件并执行它,但这不仅仅是你的问题。)< / p>
在PostgreSQL中,函数体基本上是一个长字符串。该字符串可以基本上由任何与其他任何东西都不冲突的东西分隔。在SQL标准中 - 以及在PostgreSQL文档中 - 使用单引号'
,而不是像MySQL一样启动未引用的函数体。因此,当您编写函数头(CREATE FUNCTION ...
)时,您会在编写任何分号以终止函数内部的语句之前编写引号来启动函数体。这意味着PostgreSQL中不存在使用分号的MySQL问题:解析器只是读取一个字符串并等待该字符串以结束引号完成,然后命令以分号结束。
然而,还有更多内容。
在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;
请注意,PostgreSQL中还有其他编程语言 - 最值得注意的是PL / pgSQL,内置的过程语言,还有Perl,Python,Tcl,C等的变体 - 并且都使用相同的函数定义语法(根据SQL标准)包括分隔符,只有函数体不同。
您也可以为不同的函数使用不同的分隔符,但是单个函数的开始和结束分隔符需要匹配。