postgresql - 在 PostgreSQL 中,PL/pgSQL 和 SQL 有不同的 CREATE FUNCTION 命令吗?
问题描述
在 PostgreSQL 文档中,创建 PL/pgSQL 函数和创建 SQL 函数的命令看起来非常相似,但有区别:
用 PL/pgSQL 编写的函数通过执行 CREATE FUNCTION 命令定义到服务器。这样的命令通常看起来像,比如说,
CREATE FUNCTION somefunc(integer, text) RETURNS integer AS 'function body text' LANGUAGE plpgsql;
就 CREATE FUNCTION 而言,函数体只是一个字符串文字。使用美元引号(参见第 4.1.2.4 节)来编写函数体通常很有帮助,而不是普通的单引号语法。如果没有美元引号,函数体中的任何单引号或反斜杠都必须通过加倍来转义。本章中几乎所有的例子都使用美元引用的文字作为它们的函数体。PL/pgSQL 是一种块结构语言。函数体的完整文本必须是块。块定义为:
[ <<label>> ] [ DECLARE declarations ] BEGIN statements END [ label ];
在 SQL 命令列表中:
CREATE [ OR REPLACE ] FUNCTION
name ( [ [ argmode ] [ argname ] argtype [ { DEFAULT |
= } default_expr ] [, ...] ] )
[ RETURNS rettype
| RETURNS TABLE ( column_name column_type [, ...] ) ]
{ LANGUAGE lang_name
| TRANSFORM { FOR TYPE type_name } [, ... ]
| WINDOW
| IMMUTABLE | STABLE | VOLATILE | [ NOT ] LEAKPROOF
| CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT
| [ EXTERNAL ] SECURITY INVOKER | [ EXTERNAL ] SECURITY DEFINER
| PARALLEL { UNSAFE | RESTRICTED | SAFE }
| COST execution_cost
| ROWS result_rows
| SET configuration_parameter { TO value | = value | FROM
CURRENT }
| AS 'definition'
| AS 'obj_file', 'link_symbol'
} ...
[ WITH ( attribute [, ...] ) ]
例如,我们可以指定一种语言
通过
LANGUAGE ...
在 PL/pgSQL 命令的末尾和通过
LANGUAGE lang_name
在 SQL 命令中。
它们真的是两个不同的命令吗?或者他们是同一个命令?
谢谢。
解决方案
CREATE FUNCTION的引用定义适用于所有语言:
语言名
实现函数的语言名称。它可以是 sql、c、internal 或用户定义的过程语言的名称,例如 plpgsql。
推荐阅读
- html - 删除列之间的空白水平空间(Reactstrap、Bootrap、React)
- javascript - puppeteer userdatadir 浏览器崩溃
- javascript - 循环并检查对象 TS/JS 的类型
- kodi - 如何在根上为 Kodi 挂载磁盘
- elasticsearch - logstash 文件插件无响应
- android - 我的导航栏没有在 Android Studio Kotlin 中的片段之间切换
- mysql - 插入后触发更新表
- python - 更高效、更简洁的赋值方式
- python - 如何在元组中使用 colorama?
- python - Django-admin 属性错误: