Ошибка с функцией состояния postgres SQL: 42601

      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

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$;
Другие вопросы по тегам