预言机:使用游标的 IN 子句进行动态查询



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

我一直在尝试很多,但没有成功。

谢谢。。

每个人都有Clasic的情况。您可以根据数组或某些内容动态地形成查询字符串。并用作打开光标。.

  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;
/

相关内容

  • 没有找到相关文章

最新更新