如何在oracle中创建动态where子句

时间:2016-09-14 16:29:37

标签: oracle11g

我的要求是创建一个过程或SQL查询,其中where子句应该在运行时创建,具体取决于用户提供的参数。

示例如果用户提供三列的数据,那么where子句应该具有这三列的过滤条件,只选择数据库表中的数据,如果用户提供4列的数据,那么caluse应该有4列。

2 个答案:

答案 0 :(得分:0)

我没有看到你问题的任何非常具体的解决方案,但可以使用带有不同用户输入集的where子句中的OR来完成。见下文:

创建过程:这里我的员工表有emp_id,name和salary列。现在我假设用户有时会单独通过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

答案 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也会发生同样的事情。