【问题标题】:Easy way of changing the delimiter in postgreSQL在 postgreSQL 中更改分隔符的简单方法
【发布时间】:2016-08-31 23:22:15
【问题描述】:

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

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

这在我们想要使用存储过程或函数时非常有用。如果有的话,我正在 postgreSQL 中寻找它的等价物。

提前致谢!

【问题讨论】:

标签: mysql postgresql


【解决方案1】:

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

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

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

【讨论】:

  • 感谢您对我的问题的全面解释,我想我现在已经很好地掌握了它。文档的链接也很有帮助,非常感谢 Patrick 先生!
猜你喜欢
  • 2020-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-11-22
  • 2016-04-19
  • 1970-01-01
  • 1970-01-01
  • 2017-05-17
相关资源
最近更新 更多