2017-08-21 17 views
0

私はOracleをPostgresに移行しようとしています。オラクルでは、我々はバルクコレクト機能を持ってどこ は、私は普通のSQL関数を作成しました: Postgres:with節付きの条件文

CREATE OR REPLACE FUNCTION get_pub_access_tax(a_person_id mobile_user.id%TYPE) 
RETURNS TABLE (tax_id integer) AS 
$$ 
    WITH v_pub_tax AS (SELECT tax_id FROM mobile_pub_tax) 
    select tax_id from v_pub_tax ; 

$$ LANGUAGE sql; 

ようしかし、データが条件に基づきフェッチされOracleでシナリオがある(例:下記参照)

FUNCTION get_st_tax(
    a_st_type IN VARCHAR2) 
    RETURN mmt_array 
    IS 
    v_tax_list mmt_array := mmt_array(); 
    BEGIN 
    IF a_st_type = 'top-stories' THEN 
     SELECT t.tax_id BULK COLLECT INTO v_tax_list 
     FROM mobile_st_tax t; 
     RETURN v_tax_list; 
    ELSE 
     SELECT t.tax_id BULK COLLECT INTO v_tax_list 
     FROM mobile_st_tax t WHERE t.stream_type=a_stream_type; 
     RETURN v_tax_list; 
    END IF; 
    END; 

上記のOracleコードをPostgresに変換するにはどうすればよいですか?

条件を使用していましたが、構文エラー(以下のコード)が表示されました。 以下のコード私はPostgresで実行しようとしましたが、構文エラーです。

CREATE OR REPLACE FUNCTION get_st_tax (a_st_type IN VARCHAR) 
RETURNS TABLE (tax_id integer) AS 
$$ 
    IF a_stream_type = 'top-stories' THEN 
     WITH v_tax_list AS (
     SELECT t.tax_id FROM mobile_st_tax t) 
     SELECT tax_id FROM v_tax_list; 
    ELSE 
     WITH v_tax_list AS (
     SELECT t.tax_id FROM mobile_st_tax t WHERE t.stream_type=a_stream_type) 
     SELECT tax_id FROM v_tax_list; 
    END IF; 

$$ LANGUAGE SQL; 

助けてください。

+0

あなたは第二の機能のあなたのPostgreSQLのバージョンを投稿することができ、それが与えるもの、エラー?私が見ることのできるところから、これには何の問題もないはずです.pgの 'bulk collect'に相当するものはありません。 –

+0

以下のコード私はPostgresで実行しようとしましたが、構文エラーです。 mobile_st_tax FROM( \t \t SELECT t.tax_id AS v_tax_list WITH THEN a_stream_type = 'トップ話' IF $$ \t \t \t AS CREATE OR REPLACE FUNCTIONのget_st_tax(VARCHAR、IN a_st_type) RETURNS表(tax_id整数) t) \t \t SELECT tax_id FROM v_tax_list; v_tax_list WITH ELSE \t \t \t v_tax_list FROM SELECT tax_id \t \t( \t \t mobile_st_tax T WHERE t.stream_type = a_stream_type FROM SELECT t.tax_id)AS。 END IF; \t $$ LANGUAGE SQL; – Pooja

答えて

1

第二の機能は普通のSQLで行うことができます

create function get_st_tax(a_st_type text) 
returns int[] as $$ 
    select array_agg(t.tax_id) 
    from mobile_st_tax t 
    where 
     t.stream_type = a_stream_type and a_st_type <> 'top_stories' 
     or 
     a_st_type = 'top-stories' 
    ; 
$$ language sql;