PL/pgSQL syntax error: 42601

PL/pgSQL syntax error: 42601

我是 pl/pgsql 的新手,我有一个问题:我正在尝试创建一个函数来根据 pensja in:

计算税金
create table pracownicy (
  id_pracownika int unique
, imie varchar(20)
, nazwisko varchar(20)
, miasto varchar(20)
, pensja real);

insert into pracownicy values
  (1, 'John', 'Smith', 'New York', 150)
, (2, 'Ben', 'Johnson', 'New York', 250)
, (3, 'Louis', 'Armstrong', 'New Orleans', 75)
, (4, 'John', 'Lennon', 'London', 300)
, (5, 'Peter', 'Gabriel', 'London', 100);

我创建了函数:

CREATE OR REPLACE FUNCTION pit(pensja real)
  RETURNS real AS
$BODY$
DECLARE
    dochod REAL;
    podatek REAL;
BEGIN
    dochod = 12*pensja;
      IF dochod <= 85528 THEN
         podatek = dochod*0,18-556,02;
         RETURN podatek;
ELSE
      podatek = 14839 + 0,32*(dochod - 85528);
      RETURN podatek;
END IF;
END;
$BODY$
  LANGUAGE plpgsql;

我正在尝试运行它:

select nazwisko, pensja, pit(pensja) from pracownicy;

接收:

ERROR: query "SELECT * dochod 0,18-556,02" returned 3 columns
SQL state: 42601
Context: function PL / pgSQL pit (real), line 8 in the assignment

我不太确定错误在哪里?

您必须使用点作为小数点分隔符:

  podatek = dochod*0.18-556.02;

除了@Jens 指出的小数分隔符的主要问题之外,您还可以在很大程度上简化您的函数。与其他流行语言相比,plpgsql 中的赋值成本相对更高。

CREATE OR REPLACE FUNCTION pit(pensja real)
  RETURNS real AS
$func$
DECLARE
   dochod real := 12 * pensja;
BEGIN
   IF dochod <= 85528 THEN
      RETURN dochod * 0.18 - 556.02;
   ELSE
      RETURN (dochod - 85528) * 0.32 + 14839;
   END IF;
END
$func$  LANGUAGE plpgsql;