在 postgreSQL 中更改分隔符的简单方法

Dra*_*tle 3 mysql postgresql

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

 DELIMITER //
 ...function start
 INSERT INTO table VALUES (1);
 ...function end//
 DELIMITER ;
Run Code Online (Sandbox Code Playgroud)

当我们想使用存储过程或函数时,这非常有用。如果有的话,我正在 postgreSQL 中寻找与此等效的内容。

提前致谢!

Pat*_*ick 5

MySQL DELIMITER 的问题在 PostgreSQL 中表现得完全不同。(首先,大多数程序员不会使用psql命令行来输入函数;相反,您会编写一个 SQL 脚本文件并执行它,但这不是您的问题的重点。)

在 PostgreSQL 中,函数体基本上是一个长字符串。该字符串基本上可以由不与其他任何内容冲突的任何内容分隔。在 SQL 标准中 - 以及在 PostgreSQL 文档中 - 使用单引号',而不是像在 MySQL 中那样不加引号地启动函数体。因此,当您编写函数头 ( CREATE FUNCTION ...) 时,在编写任何分号来终止函数内部的语句之前,您应该先写一个引号来启动函数体。这意味着 MySQL 的分号问题在 PostgreSQL 中不存在:解析器只是读取一个字符串并等待该字符串以结束引号完成,然后命令以分号终止。

然而,还有更多。

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

泛型函数定义看起来有点像这样:

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;
Run Code Online (Sandbox Code Playgroud)

请注意,PostgreSQL 中还有其他编程语言——最著名的是 PL/pgSQL,内置过程语言,但也有 Perl、Python、Tcl、C 等的变体——并且都使用相同的函数定义语法(如根据 SQL 标准)包括分隔符,只有函数体会有所不同。

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