2016-09-14 16 views
0

私の要件は、where句を実行時に、ユーザーが提供するパラメータに応じて作成する必要があるプロシージャまたはSQL問合せを作成することです。oracleで動的where句を作成する方法

例ユーザーが3つの列のデータを提供する場合、where句では、データベーステーブルからデータを選択するためにのみフィルタ条件を設定する必要があります。

+0

あなたはまだ何をしようとしたことがありますか? –

+0

try http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/dynamic.htm#LNPLS011 – Joe

+0

「ユーザーが3列のデータを提供している場合」。あいまいです。ユーザーは3列分のデータを提供します。 – XING

答えて

0

私はあなたの質問に対して非常に具体的な解決策は見当たりませんが、ORをwhere節に入れて別のユーザー入力を使って行うことができます。以下を参照してください。

作成された手順:ここでは、私の従業員表にはemp_id、名前、給与列があります。今やユーザがemp_idemp_nameだけを渡すと仮定しています。

CREATE OR REPLACE PROCEDURE dynmc_selec (id     NUMBER DEFAULT 0, 
             name    VARCHAR2 DEFAULT 'A', 
             salary    NUMBER DEFAULT 0, 
             emp_output IN OUT SYS_REFCURSOR) 
AS 
    var VARCHAR2 (100); 
BEGIN 
    --You need to make several combinations in where clause like (emp_id , emp_name , salary) OR (emp_id , emp_name) OR (emp_name , salary) and use it in where clause with 'OR'. 
    --Also its needed that all the columns of the table is in where clause. If user doesnot pass anything then defualt value will be passed. 
    var := 
     'select emp_id from employee where (emp_id =' 
     || id 
     || ' and emp_name = ''' 
     || name 
     || ''') OR emp_sal = ' 
     || salary; 

    DBMS_OUTPUT.put_line (var); 

    EXECUTE IMMEDIATE var; 

    OPEN emp_output FOR var; 
EXCEPTION 
    WHEN OTHERS 
    THEN 
     NULL; 
END; 

それを呼び出す:

declare 
a SYS_REFCURSOR; 

v_emp_id employee.emp_id%type; 

begin 
--passing emp_id and name only 
dynmc_selec(id=>1,name=>'KING',emp_output=>a); 

    loop 
    FETCH a INTO v_emp_id; 
     EXIT WHEN a%NOTFOUND; 
     DBMS_OUTPUT.PUT_LINE(v_emp_id); 

    end loop; 

end; 

出力:

select emp_id from employee where (emp_id =1 and emp_name = 'KING') OR emp_sal = 0 
1