2
create or replace
PROCEDURE get_txn_by_account_id(
p_ACCOUNT_ID IN txn.ACCOUNT_ID%TYPE DEFAULT NULL
) 

IS

BEGIN
FOR x IN (SELECT * FROM txn where account_id=p_ACCOUNT_ID)
LOOP
    dbms_output.put_line(x.txn_ID || ', ' || x.txn_VER_NB);

END LOOP;
END get_txn_by_account_id;

私のストアド プロシージャは、検索条件として 1 つの入力に基づいて選択を発行し、検索結果を出力します。私の入力は ACCOUNT_ID です。4 つの追加の入力パラメーター (param_a、param_b、param_c、param_d) を追加したいと思います - 少なくとも 2 つがオプションになります。

だから私はおそらくストアドプロシージャ宣言を次のように変更します

PROCEDURE get_txn_by_account_id(
p_ACCOUNT_ID IN txn.ACCOUNT_ID%TYPE DEFAULT NULL,
p_PARAM_A IN txn.PARAM_A%TYPE DEFAULT NULL,
p_PARAM_B IN txn.PARAM_B%TYPE DEFAULT NULL,
p_PARAM_C IN txn.PARAM_C%TYPE DEFAULT NULL,
p_PARAM_D IN txn.PARAM_D%TYPE DEFAULT NULL
) 

したがって、私の SELECT には、ストアド プロシージャに渡されるオプションのパラメーターに基づいて、さまざまな数のクエリ パラメーターが含まれる場合があります。

例えば、

FOR x IN (SELECT * FROM txn where account_id=p_ACCOUNT_ID, param_a=p_PARAM_A, param_b=p_PARAM_B, param_c=p_PARAM_C, param_d=p_PARAM_D)
FOR x IN (SELECT * FROM txn where account_id=p_ACCOUNT_ID, param_a=p_PARAM_A, param_c=p_PARAM_C, param_d=p_PARAM_D)
FOR x IN (SELECT * FROM txn where account_id=p_ACCOUNT_ID, param_a=p_PARAM_A, param_b=p_PARAM_B, param_d=p_PARAM_D)

また

FOR x IN (SELECT * FROM txn where account_id=p_ACCOUNT_ID, param_a=p_PARAM_A, param_b=p_PARAM_B)

私は問題を抱えています-ストアドプロシージャに渡されるオプションのパラメーターに基づいてSELECTステートメントが変更されるようにストアドプロシージャをコーディングする方法-おそらく、プロシージャに渡されたオプションのパラメーターに基づいてクエリステートメントを構築する文字列ビルダー、結果の文字列をクエリで使用しますか? これが可能かどうかはわかりません。確かにこれはよくある問題です - 誰か提案はありますか? ありがとう!

4

2 に答える 2

3
FOR x IN ( SELECT * 
           FROM txn 
           WHERE account_id=p_ACCOUNT_ID
             AND (p_PARAM_A is null or param_a=p_PARAM_A)
             AND (p_PARAM_B is null or param_b=p_PARAM_B)
             AND (p_PARAM_C is null or param_c=p_PARAM_C)
             AND (p_PARAM_D is null or param_d=p_PARAM_D) )
于 2012-12-14T17:56:53.303 に答える
1

以下のトリックを使用できます。

select * from FOO
where
  COLUMN_1 = nvl(pParam1, COLUMN_1)
  and COLUMN_2 = nvl(pParam2, COLUMN_2)
  and ...

これにより、がの場合pParam1null条件は常にに評価されtrueます。等々。

于 2012-12-14T17:56:05.850 に答える