如何更改 PostgreSQL 中的分隔符

问题描述 投票:0回答:2

我想知道如何做到这一点,因为环顾四周后,我发现所有这些看似简单的工作都是漫长而复杂的方法。 在 MySQL 中,我们有:

DELIMITER //
...function start
INSERT INTO table VALUES (1);
...function end//
DELIMITER ;

当我们想要使用存储过程或函数时,这非常有用。我正在寻找 PostgreSQL 中的等效项(如果有的话)。

提前致谢!

mysql database postgresql delimiter equivalent
2个回答
6
投票

MySQL DELIMITER 的问题在 PostgreSQL 中的表现完全不同。 (首先,大多数程序员不会使用

psql
命令行来输入函数;相反,您会编写一个 SQL 脚本文件并执行它,但这不是您问题的重点。)

在 PostgreSQL 中,函数体基本上是一个长字符串。该字符串基本上可以由任何不与其他内容冲突的内容来分隔。在 SQL 标准以及 PostgreSQL 文档中,使用单引号

'
,而不是像 MySQL 中那样仅在不加引号的情况下启动函数体。因此,当您编写函数头(
CREATE FUNCTION ...
)时,您需要先编写一个引号来启动函数体,然后再编写任何分号来终止函数内的语句。这意味着 PostgreSQL 中不存在分号的 MySQL 问题:解析器只是读取一个字符串并等待该字符串用结束引号完成,然后命令以分号终止。

然而,还有更多。

在 PostgreSQL 中,惯例是使用

$$
$anything_goes_here$
,即所谓的美元引用,而不是
'
来启动函数体。这样做的原因是它避免了必须转义函数体中嵌入的引号。有关此功能的说明,请参阅文档

通用函数定义看起来有点像这样:

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 标准),包括分隔符,只有函数体会有所不同。

您也可以对不同的函数使用不同的分隔符,但单个函数的开始和结束分隔符需要匹配。


0
投票

在 PostgreSQL 中,我们只能使用分隔符 $$' 并且无法更改分隔符,而 MySQL 可以使用更多的分隔符,只要不冲突,可以使用

DELIMITER $$
 更改分隔符DELIMITER //
等*我的回答详细解释了PostgreSQL中的分隔符。

© www.soinside.com 2019 - 2024. All rights reserved.