我的要求是创建一个过程或SQL查询,其中where子句应该在运行时创建,具体取决于用户提供的参数。
示例如果用户提供三列的数据,那么where子句应该具有这三列的过滤条件,只选择数据库表中的数据,如果用户提供4列的数据,那么caluse应该有4列。
答案 0 :(得分:0)
我没有看到你问题的任何非常具体的解决方案,但可以使用带有不同用户输入集的where子句中的OR来完成。见下文:
创建过程:这里我的员工表有emp_id,name和salary列。现在我假设用户有时会单独通过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
答案 1 :(得分:0)
select * from test_table
where
(1 = nvl2(:l_date, 0, 1) or created_at > :l_date)
and (1 = nvl2(:l_no, 0,1) or no = :l_no);
使用Oracle nvl2
函数:
当参数l_date
为空时,则1 = nvl2(l_date, 0, 1)
的计算结果为true,并且不会进行created_at
的筛选。
当参数l_date
不为null时,则1 = nvl2(l_date, 0, 1)
的计算结果为false,并且将进行created_at
的筛选。
参数l_no
也会发生同样的事情。