【问题标题】:SQL (Postgres) function definition - RETURNSSQL (Postgres) 函数定义 - RETURNS
【发布时间】:2014-07-16 13:26:45
【问题描述】:

我正在尝试创建一个非常简单的 PostgreSQL 函数,尽管我不断收到一个非常奇怪的语法错误。我使用的语法与我在网上看到的任何语法都不同(尽管这是教科书使用的语法),因此我无法弄清楚它为什么会失败......

这是 SQL:

CREATE OR REPLACE FUNCTION gsum(graphID integer)
    RETURNS integer
    BEGIN
        DECLARE total integer DEFAULT 0
        SELECT sum(weight) INTO total
        FROM Edge
        WHERE gno = graphID
    RETURN total;
    END;

错误是:

ERROR:  syntax error at or near "BEGIN"
LINE 3:  BEGIN
         ^
********** Error **********

ERROR: syntax error at or near "BEGIN"
SQL state: 42601
Character: 68

【问题讨论】:

  • 您的语法看起来像 PSM - 但在 PostgreSQL 中是错误的 - 支持的语言不止一种(并且它需要有点奇怪的 CREATE FUNCTION 语法)。 PLpgSQL 基于 ADA 语言——或者更多基于 PL/SQL——什么是简化的 ADA。

标签: sql database function postgresql plpgsql


【解决方案1】:

你的基本错误:

  • DECLARE must come before BEGIN
  • 语句需要以; 结束。
  • plpgsql 函数的函数体是字符串,需要加引号。使用美元引用来避免正文中引用的复杂性。
  • 缺少关键字AS
  • 缺少语言声明LANGUAGE plpgsql
  • 类型不匹配。
  • 您不需要默认值。
  • 如果总和为 NULL,这仍会返回 NULL

CREATE OR REPLACE FUNCTION gsum(graphID integer)
  RETURNS integer AS
$func$
DECLARE
   total integer;
BEGIN
   SELECT sum(weight)::int INTO total
   FROM   edge
   WHERE  gno = graphID;

   RETURN COALESCE(total, 0);
END
$func$ LANGUAGE plpgsql;

您最好使用一个简单的 SQL 函数,例如 @Clodoaldo advised。只需添加COALESCE()

【讨论】:

    【解决方案2】:

    它可以是普通的 SQL in 而不是 plpgsql

    create or replace function gsum(graphid integer)
    returns bigint as $$
    
        select sum(weight) as total
        from edge
        where gno = graphid;
    
    $$ language sql;
    

    注意如果weight 是整数sum 将返回bigint 而不是integer

    【讨论】:

    • 用我使用的语法类型可以完成任务吗?
    • @byteSlayer 检查欧文的答案
    【解决方案3】:
    CREATE OR REPLACE FUNCTION  gsum(graphID integer)
        RETURNS integer AS
        $BODY$        
    DECLARE 
        total integer DEFAULT 0;
        BEGIN
    
            SELECT sum(weight) INTO total
            FROM Edge
            WHERE gno = graphID;
        RETURN total;
        END;
        $BODY$
      LANGUAGE plpgsql VOLATILE
      COST 100;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多