2017-08-08 105 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; 
$$;