2017-10-26 5 views
0

私の問題は、私がそれらに渡す変数の数に依存するSELECTステートメントを構築しようとしていることです。動的SQLステートメント - 変数の数に応じて

Oracleデータベースを使用することを知っておくべき重要なことです。

このような記述を作成する有効な方法はありますか? 。

は、たとえば のために、私はデータベースに渡すことができますし、それは私に1つのユニークな結果を与える必要があります(「AND」キーワードで接続されている) OPT1 3 varaiblesを持っている - (WHERE = Y = XとVAR2をVAR1とVAR3 = Z)

しかし、また、オプションは、私は2つだけvaraiblesに合格し、取得することがあり結果 オプト2 - 。= xとVAR2 = Y) 1変数またはnoneをVAR1し、データベースからすべてのレコードを取得する

私は数多くの異なる選択ステートメントを作成したくありません。このエレガントなやり方が必要です。

PS。これはwebmethodsのJDBCアダプタに関連する問題です。多分誰もがこの環境でこれを解決する方法を知っていますか?

+0

あなたはそれを介してアレイとサイクルを渡す必要があります。 Oracleのowa_util.ident_arrデータ構造を見てください。配列の1..lengthからループし、sqlをビルドしてから実行します。配列ストア 'col1 = x'、 'col2 = y'など –

+0

これを行う簡単な方法はありますか?私は、私のwebmethods環境で変数を配列形式で渡すことができれば幸いです。 おそらくオプションがあります:変数がnullであることをチェックし、適切なロジックを実装していますか? – czarnyMati

+0

webmethodsのドキュメントをチェックしてください。通常、何らかの配列パラメータをサポートしていると思います。 –

答えて

1

関連する配列を使用して要素を格納および取得することができます。ここでは、クエリを作成することを示しました。 cursorまたは他のオプションを使用して実行することができます。プロシージャとしてこれを拡張して、変数の配列を引数として渡すことができます。 このような実装では、Passing an associative array as a parameter between packagesを参照してください。

SET SERVEROUTPUT ON; 
DECLARE 
TYPE where_elems 
IS 
    TABLE OF VARCHAR2 (100) INDEX BY VARCHAR2 (30); 
    wh where_elems; 
    v_query VARCHAR2 (4000) := 'SELECT col , col2 FROM yourtable where 1=1 '; 
    v_idx VARCHAR2 (30); 
BEGIN 
    wh ('col3') := 'value3'; --you can initialize and call a procedure with array as argument. 
    wh ('col4') := 'value4'; 
    v_idx  := wh.FIRST; 

    WHILE (v_idx IS NOT NULL) 
    LOOP 
    v_query := v_query || ' AND ' || v_idx || ' = ' || wh (v_idx); 
    v_idx := wh.NEXT (v_idx); 
    END LOOP; 
    DBMS_OUTPUT.PUT_LINE (v_query); 
END; 
/

出力

SELECT col , col2 FROM yourtable where 1=1 AND col3 = value3 AND col4 = value4 
関連する問題