PL / pgSQL语法错误:42601

时间:2015-04-12 17:27:01

标签: postgresql plpgsql

我是pl / pgsql的新手,我有一个问题:我正在尝试创建一个基于pensja计算税收的函数:

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

我不确定错误在哪里?

2 个答案:

答案 0 :(得分:2)

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

  podatek = dochod*0.18-556.02;

答案 1 :(得分:0)

除了@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;