2017-08-08 18 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値を必要とする意味します:= ';)。 –

+3

関数は倍精度を返すように宣言されています。実際のタイプは 'text'です。エラーは驚くべきことでも、誤解を招くものでもありません。 –

答えて

1

outout :='LOW_LOAD'で、倍精度を返すと予想されるときに変数outがテキスト型であるため、エラーが発生します。

DOUBLE PRECISION`をRETURNS `、

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; 
$$;