首页 > 解决方案 > 在 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 [, ...] ) ]

例如,我们可以指定一种语言

它们真的是两个不同的命令吗?或者他们是同一个命令?

谢谢。

标签: postgresqlplpgsql

解决方案


CREATE FUNCTION的引用定义适用于所有语言:

语言名

实现函数的语言名称。它可以是 sql、c、internal 或用户定义的过程语言的名称,例如 plpgsql。


推荐阅读