【问题标题】:Oracle: Dynamic query with IN clause using cursorOracle:使用游标的带有 IN 子句的动态查询
【发布时间】:2014-03-08 20:20:30
【问题描述】:

有人可以帮助我创建一个示例,以实现使用 IN 子句并将结果填充到游标的动态查询。 输入参数可以是数组或字符串连接。

我尝试了很多,但没有成功。

谢谢..

【问题讨论】:

标签: oracle dynamic database-cursor in-clause


【解决方案1】:

每个人都有的经典情况。您可以根据您的数组或其他东西动态地形成一个查询字符串。并用作 OPEN CURSOR。 .

  DECLARE
    v_mystring VARCHAR(50);
    v_my_ref_cursor sys_refcursor;
    in_string varchar2='''abc'',''bcd''';
    id2 varchar2(10):='123';
        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),其数据对特定会话可见。

您仍然可以使用nested table(如 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;
/

【讨论】:

  • 我想要一个动态 sql,我可以将它分配给一个变量并且应该包含子句。游标查询也应该是 OPEN p_Cursor FOR v_Query USING p_Id, p_StartDt p_Id contains multiple comma values
  • 希望,第一种方法会让您感兴趣!做一些循环来处理你的数组并形成一个查询字符串。在我上面的方法中,你也可以使用 USING,但是你不能绑定 IN 子句......因为它不受支持..
  • 首先看起来不错,很简单,但不适合我的实现。我需要传递多个参数,其中一个参数有多个 id
  • 多个参数是可以实现的。你的意思是多个id,你有一个id数组?
  • 是的,我可以从 .net 作为数组传递我正在传递表类型,但在传递数组或类型值参数时出现错误
猜你喜欢
  • 2013-07-26
  • 2021-02-21
  • 2021-02-19
  • 2018-11-21
  • 2021-01-14
  • 2018-03-08
  • 2014-05-02
  • 1970-01-01
  • 2011-07-21
相关资源
最近更新 更多