IN查询oracle的参数

时间:2014-02-24 06:58:58

标签: oracle

SELECT * FROM EMPLOYEE
WHERE EMP_NAME IN (:EMP_NAME);

这是我的查询,现在我想将EMP_NAME参数作为字符串列表发送 当我在SQL开发人员中运行此查询时,会要求将EMP_NAME作为参数发送,现在我想发送'Kiran','Joshi'(基本上,我想要获取员工姓名Kiran或Joshi的员工详细信息。如何在执行查询期间传递该值?

当我单独使用值Kiran时,它可以工作,但是当我与任何其他字符串连接时,它将无效。这有什么指针吗?

我尝试了下面的那个 “基兰”,“乔希”
上面的方法不起作用,因为这是一个单一的参数,它尝试员工的名字为'Kiran',Joshi'不会来。可以理解,但为了实现这个目标,我该如何继续前进?

任何帮助都会非常感激。

2 个答案:

答案 0 :(得分:2)

感谢帮助我解决这个问题的人。

我可以使用建议的方式获得解决方案,下面是方法

SELECT * FROM EMPLOYEE WHERE EMP_NAME IN (&EMP_NAME)

我试过这种方式,以下是我测试过的场景,它们工作正常。

情景1:

要仅获取"Kiran"的详细信息,在这种情况下,当SQL开发人员提示时EMP_NAME的值为Kiran。它奏效了。

情景2:

要获取"Kiran""Joshi"的详细信息,EMP_NAME的值将作为

发送
Kiran','Joshi

它也适用于这种情况。

感谢Kedarnath帮助我实现解决方案:)

答案 1 :(得分:1)

IN子句将被隐式转换为多个OR条件..并且限制为1000 ..同时使用绑定变量查询意味着,执行计划将被重用。支持IN子句的绑定变量将因此影响绑定变量的基本用法,因此oracle将其限制在语法级别本身。

唯一方法就像name in (:1,:2)并绑定其他值..

为此,您可以动态SQL在循环中构造in子句绑定变量。

其他方式是,调用过程或函数(pl / sql)

DECLARE
    v_mystring VARCHAR(50);
    v_my_ref_cursor sys_refcursor;
    in_string varchar2='''Kiran'',''Joshi''';
    id2 varchar2(10):='123'; --- if some other value you have to compare
        myrecord tablename%rowtype;
  BEGIN

    v_mystring := 'SELECT a.*... from tablename a where name= :id2 and 
                    id in('||in_string||')';

    OPEN v_my_ref_cursor FOR v_mystring USING id2;

    LOOP
      FETCH v_my_ref_cursor INTO myrecord;
      EXIT WHEN v_my_ref_cursor%NOTFOUND;
        ..
      -- your processing
    END LOOP;
    CLOSE v_my_ref_cursor;

  END;

IN子句支持最多 1000 项。您总是可以使用表来加入。该表可能是Global Temporary Table(GTT),其数据对于特定会话是可见的。

你仍然可以使用嵌套表(如PL / SQL表)

TABLE()会将PL/Sql表转换为SQL可理解的表对象(实际上是对象)

以下简单示例。

CREATE TYPE pr AS OBJECT
           (pr  NUMBER);
/
CREATE TYPE prList AS TABLE OF pr;
/

declare
  myPrList prList := prList ();
  cursor lc is 
    select * 
      from (select a.*
              from yourtable a
                   TABLE(CAST(myPrList as prList)) my_list
             where 
                   a.pr = my_list.pr
             order by a.pr desc) ;
  rec lc%ROWTYPE;

BEGIN 
  /*Populate the Nested Table, with whatever collection you have */
  myPrList := prList ( pr(91),
                       pr(80));
  /*
     Sample code: for populating from your TABLE OF NUMBER type 

     FOR I IN 1..your_input_array.COUNT
     LOOP
          myPrList.EXTEND;
          myPrList(I) := pr(your_input_array(I));
     END LOOP;
  */
  open lc;
  loop 
    FETCH lc into rec;
    exit when lc%NOTFOUND; -- Your Exit WHEN condition should be checked afte FETCH iyself!
    dbms_output.put_line(rec.pr);
  end loop;
  close lc;
END;
/