2017-12-11 29 views
0

where句のパラメータを動的に追加する必要があります。"where immediate USING"句を使用した動的where節

execute immediate GETRESULTSET bulk collect into V_PARTY_TBL USING <<>> ? 

今すぐ実行時に、私は知らない節が形成され、そのexecute immeditate文のUSING句でそれを処理する方法をここで

GETRESULTSET:='SELECT PARENT_PARTYID,PARTY_ID,PRODUCT_ID,PRODUCT_STATUS,BILLING_TYPE,CRMTIMESTAMP,UPDATEDTIMESTAMP,UPDATEDBY FROM  ENT_MAP_CUST_PRODUCT WHERE PARENT_PARTYID=:PARENT_PARTYID'; 

    IF(PRODUCT_ID IS NOT NULL) THEN 
    GETRESULTSET := GETRESULTSET || ' AND PRODUCT_ID=:PRODUCT_ID '; 
    END IF; 

    IF(PRODUCT_STATUS IS NOT NULL) THEN 
    GETRESULTSET := GETRESULTSET || ' AND PRODUCT_STATUS=:PRODUCT_STATUS '; 
    END IF; 

    IF(BILLING_TYPE IS NOT NULL) THEN 
    GETRESULTSET := GETRESULTSET || ' AND BILLING_TYPE=:BILLING_TYPE '; 
    END IF; 

は、今私は、コレクション型に収集バルクにする必要があります。

答えて

2

すべての3つのパラメータを受け取り、単一のwhere句の追加:

and (PRODUCT_ID IS NULL or PRODUCT_ID=:PRODUCT_ID) 
and (PRODUCT_STATUS IS NULL or PRODUCT_STATUS=:PRODUCT_STATUS) 
and (BILLING_TYPE IS NULL or BILLING_TYPE=:BILLING_TYPE) 

その後

execute immediate your_query 
    into your_result 
    using p_product_id, 
     p_product_status, 
     p_billing_type; 
+0

これは目的を解決する可能性がありますが、これを行うには最良の方法ですか? –

+0

あなたが提供したコードのほんの一部で、伝えるのは難しいです。 – Rene

0

パラメータのヘタリ追加する場合は最も単純な方法:

if product_id is not null 
    then sql := sql || ' and product_id = :product_id'; 
    else sql := sql || ' and :product_id is null'; 
end if; 

しかし、一般的にあなたの仕事はあなたが間違った方法を好むことを示しています。あなたは「オール・オン・プロシージャー」アプローチをしようとしており、その1つが厄介な欠点に直面しています。

+0

欠点は何ですか? –