2017-08-31 11 views
0

私はpgsqlのOracleからの移行をやっていると私は以下のようなOracleのSQLました:のOracle SQL()関数の問題

select code,product_no,qty qty from t_ma_tb_inventory 
        where code is not null and status=2 
        and update_type in (select * from table(splitstr(:types,','))) 
        and tb_shop_id=:shopId 
        order by update_time 

、以下のようなsplitstr機能:

を?
CREATE OR REPLACE FUNCTION splitstr (p_string text, p_delimiter text) RETURNS SETOF STR_SPLIT AS $body$ 
    DECLARE 

     v_length bigint := LENGTH(p_string); 
     v_start bigint := 1; 
     v_index bigint; 

    BEGIN 
     WHILE(v_start <= v_length) 
     LOOP 
      v_index := INSTR(p_string, p_delimiter, v_start); 

      IF v_index = 0 
      THEN 
       RETURN NEXT SUBSTR(p_string, v_start); 
       v_start := v_length + 1; 
      ELSE 
       RETURN NEXT SUBSTR(p_string, v_start, v_index - v_start); 
       v_start := v_index + 1; 
      END IF; 
     END LOOP; 

     RETURN; 
    END 
    $body$ 
    LANGUAGE PLPGSQL 
    SECURITY DEFINER 
    ; 

-- REVOKE ALL ON FUNCTION splitstr (p_string text, p_delimiter text) FROM PUBLIC; 

誰かがpgSQLでは同等のコードを書くために私を助けることができる

答えて

0

は、あなたがあなた自身の機能を記述する必要はありませんありがとうございました - Postgresはすでにそのための組み込み関数があります:string_to_array

select code, product_no, qty qty 
from t_ma_tb_inventory 
where code is not null and status=2 
    and update_type = any (string_to_array(:types,',')) 
    and tb_shop_id = :shopId 
order by update_time; 

テキストを渡しているが、あなたは整数にそれを比較する必要がある場合は、結果の配列にキャストする必要があります。

select code, product_no, qty qty 
from t_ma_tb_inventory 
where code is not null and status=2 
    and update_type = any (string_to_array(:types,',')::int[]) 
    and tb_shop_id = :shopId 
order by update_time; 

をしかし:それはかなり醜い回避策ですこれは、Oracleで必要なのは、SQLの実際の配列をサポートしていないためです(PL/SQLのみ)。

Postgresでは、整数の配列を直接渡すと、となるでしょう(例えば、:typesint[]にする)。その後の解析や鋳造何が必要ではないだろう:

select code, product_no, qty qty 
from t_ma_tb_inventory 
where code is not null and status=2 
    and update_type = any (:types) 
    and tb_shop_id = :shopId 
order by update_time; 
+0

感謝、そして何について:タイプ引数はintで、私が何をしなければなら申し訳ありませんが、私は –

+0

をpgSQLのために新しいですあなたは、そのステートメントを実行する方法を示していません? 。しかし、あなたが使用するパラメータ ':types'は' text'値であると仮定しました(あなたの関数も 'text'を期待しているからです)。どのようにこれらのパラメータを置き換えるのですか? Oracleの ':types'のデータ型は何ですか? –

+0

oracleのupdate_typeのデータ型はint –