2017-11-13 26 views
1

以下の機能で何が間違っていますか?私は上記の機能を実行するとPostgresql create function error

CREATE OR REPLACE FUNCTION extended_sales(area_type varchar, area_code varchar, dpci varchar) RETURNS TABLE(task_id bigint, location_id int)as 

$BODY$ 

BEGIN 
    IF area_type = 1 THEN 
     RETURN QUERY select T.task_id, T.location_id from store_price.task T where T.task_payload->>'str_area_type_i'='3'; 
    ELSE IF area_type = 2 THEN 
     RETURN QUERY select T.task_id, T.location_id from store_price.task T where T.due_date < '2017-10-06'; 
    ELSE 
     RETURN QUERY select T.task_id, T.location_id from store_price.task T where task_payload->>'str_area_type_i'='1' and task_payload->>'str_area_c'='7' and due_date < '2016-11-07'; 
    END IF; 


END 

$BODY$ language plpgsql; 

それは次のようなエラー

ERROR: syntax error at end of input 
LINE 17: $BODY$ language plpgsql; 

がすべてのヘルプは高く評価されています。ありがとう。

+3

私はそれをコンパイルしようとしませんでしたが、あなたは 'END'後にセミコロンを必要としませんか? – Hambone

+0

終了前に 'return;'が必要ですか? –

+0

@Hambone:いいえ、そうではありません。最後はオプションです。 –

答えて

5

2つのIF文と1つのEND IFがあります。あなたが持っているしたい場合はELSIFを使用して、単一のIF statement.

IF area_type = 1 THEN 
     RETURN QUERY select T.task_id, T.location_id from store_price.task T where T.task_payload->>'str_area_type_i'='3'; 
    ELSIF area_type = 2 THEN 
     RETURN QUERY select T.task_id, T.location_id from store_price.task T where T.due_date < '2017-10-06'; 
    ELSE 
     RETURN QUERY select T.task_id, T.location_id from store_price.task T where task_payload->>'str_area_type_i'='1' and task_payload->>'str_area_c'='7' and due_date < '2016-11-07'; 
    END IF; 
関連する問題