0
私の要件は、where句を実行時に、ユーザーが提供するパラメータに応じて作成する必要があるプロシージャまたはSQL問合せを作成することです。oracleで動的where句を作成する方法
例ユーザーが3つの列のデータを提供する場合、where句では、データベーステーブルからデータを選択するためにのみフィルタ条件を設定する必要があります。
私の要件は、where句を実行時に、ユーザーが提供するパラメータに応じて作成する必要があるプロシージャまたはSQL問合せを作成することです。oracleで動的where句を作成する方法
例ユーザーが3つの列のデータを提供する場合、where句では、データベーステーブルからデータを選択するためにのみフィルタ条件を設定する必要があります。
私はあなたの質問に対して非常に具体的な解決策は見当たりませんが、ORをwhere節に入れて別のユーザー入力を使って行うことができます。以下を参照してください。
作成された手順:ここでは、私の従業員表にはemp_id、名前、給与列があります。今やユーザがemp_id
とemp_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
あなたはまだ何をしようとしたことがありますか? –
try http://docs.oracle.com/cd/E11882_01/appdev.112/e25519/dynamic.htm#LNPLS011 – Joe
「ユーザーが3列のデータを提供している場合」。あいまいです。ユーザーは3列分のデータを提供します。 – XING