【问题标题】:Invalid input syntax for type double precision双精度类型的输入语法无效
【发布时间】:2021-05-20 18:40:25
【问题描述】:

我已经创建了函数,其中之一是:

CREATE OR REPLACE FUNCTION core.cal_status(
  er_v                 DOUBLE PRECISION,
  cell_v               DOUBLE PRECISION
) RETURNS DOUBLE PRECISION
  LANGUAGE plpgsql
AS $$
DECLARE out DOUBLE PRECISION;
  BEGIN
    IF er_v < 15                                THEN out := 'LOW_LOAD';
    ELSEIF cell_v < 60                          THEN out := 'LOW_LOAD';
    ELSEIF er_v > 40                            THEN out := 'CONGESTED';
    ELSEIF cell_v > 80                          THEN out := 'CONGESTED';
    ELSEIF cell_v >60 and cell_v < 80           THEN out := 'HIGH_LOAD';
  END IF;
  RETURN out;
  END;
$$;

当我用这个调用函数时:

LEFT JOIN LATERAL core.cal_status(
            er_v,
            cell_v) status ON true

我得到下一个错误:

ERROR: invalid input syntax for type double precision: "LOW_LOAD" Where: PL/pgSQL function core.cal_status(double precision,double precision) line 4 at assignment

这是怎么回事,我猜是输出类型的东西,但不确定。

【问题讨论】:

  • 恕我直言,RETURNS DOUBLE PRECISION 表示您需要在 out := 之后使用双精度值;)。
  • 您的函数被声明为返回双精度。实际类型为text。该错误并不令人惊讶或具有误导性。

标签: sql postgresql casting


【解决方案1】:

发生错误是因为当您执行 out :='LOW_LOAD' 时变量 out 是文本类型,并且该函数期望返回 DOUBLE PRECISION。

试试

CREATE OR REPLACE FUNCTION core.cal_status(
  er_v                 DOUBLE PRECISION,
  cell_v               DOUBLE PRECISION
) RETURNS TEXT
  LANGUAGE plpgsql
AS $$
DECLARE out TEXT;
  BEGIN
    IF er_v < 15                                THEN out := 'LOW_LOAD';
    ELSEIF cell_v < 60                          THEN out := 'LOW_LOAD';
    ELSEIF er_v > 40                            THEN out := 'CONGESTED';
    ELSEIF cell_v > 80                          THEN out := 'CONGESTED';
    ELSEIF cell_v >60 and cell_v < 80           THEN out := 'HIGH_LOAD';
  END IF;
  RETURN out;
  END;
$$;

【讨论】:

    【解决方案2】:

    在 Django 中,当您在 makemigrations 之后不迁移时会发生这种情况

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多