2017-08-08 85 views
-1

我创建功能,其中之一是:无效的输入语法

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 

这是怎么回事,我猜这是输出类型,但不知道。

+0

恕我直言,'返回DOUBLE PRECISION'意味着你需要一个双值之后'出来:=')。 –

+3

您的函数被声明为返回双精度。实际的类型是“文本”。这个错误并不令人意外或误导。 –

回答

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; 
$$; 
相关问题