【问题标题】:Postgres error with SQL state function: 42601SQL 状态函数的 Postgres 错误:42601
【发布时间】:2021-11-18 19:16:01
【问题描述】:
create or replace function fibonacci(int) returns int 
as $$
declare
    a int;
    res int := 0;
begin
    a := $1;
    if(a = 1 or a = 2) then
        res :=1;
    else
        res := fibonacci(a - 2) + fibonacci(a - 1);
    end if;
    return res;
end;
language plpgsql;

显示的错误消息但我没有看到错误,因为我以多种方式进行了探测,同样继续显示的是斐波那契数列

ERROR:  una cadena separada por $ está inconclusa en o cerca de «$$
declare
    a int;
    res int := 0;
begin
    a := $1;
    if(a = 1 or a = 2) then
        res :=1;
    else
        res := fibonacci(a - 2) + fibonacci(a - 1);
    end if;
    return res;
end;
language plpgsql;»
LINE 3: as $$
           ^
SQL state: 42601
Character: 106

【问题讨论】:

  • 请显示英文错误信息。作为超级用户:SET lc_messages = 'C';

标签: postgresql plpgsql postgresql-14 dollar-quoting


【解决方案1】:

听起来像是意大利语版的:

错误:"$$

处或附近未终止的美元引号字符串

那是因为没有结束美元报价:

create or replace function fibonacci(int) returns int 
as $$
declare
    a int;
    res int := 0;
begin
    a := $1;
    if(a = 1 or a = 2) then
        res :=1;
    else
        res := fibonacci(a - 2) + fibonacci(a - 1);
    end if;
    return res;
end;
$$                 -- !!!
language plpgsql;

见:

但是您可以在很大程度上简化 PL/pgSQL 函数:

CREATE OR REPLACE FUNCTION fibonacci(int)
  RETURNS int
  LANGUAGE plpgsql IMMUTABLE PARALLEL SAFE AS
$func$
BEGIN
   IF $1 IN (1,2) THEN
     RETURN 1;
   ELSE
     RETURN fibonacci($1 - 2) + fibonacci($1 - 1);
   END IF;
END
$func$;

或者使用更简单的 SQL 函数:

CREATE OR REPLACE FUNCTION fibonacci(int)
  RETURNS int
  LANGUAGE sql IMMUTABLE PARALLEL SAFE AS
$func$
SELECT CASE WHEN $1 IN (1,2)
            THEN 1
            ELSE fibonacci($1 - 2) + fibonacci($1 - 1) END;
$func$;

【讨论】:

    猜你喜欢
    • 2013-04-23
    • 1970-01-01
    • 2021-02-28
    • 1970-01-01
    • 2016-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-02
    相关资源
    最近更新 更多