Oracle 使用plsql在游标中绑定数组

Oracle 使用plsql在游标中绑定数组,oracle,parameters,plsql,oracle11g,cursor,Oracle,Parameters,Plsql,Oracle11g,Cursor,上述声明对我来说很好。我无法找到任何有希望的东西,那就是改变in声明后的值,即91,80年的a.pr 我在这里手动列出了这些值,但我想将其作为.pr列的数字数组传递给光标。简言之,当idlist是数组时,我想做a.pr=idlist。请告诉我我的想法是否可行。我不知道全局表的确切结构,但您可以像这样使用游标中的集合 declare cursor lc is select * from (select a.lin, a.pr, b

上述声明对我来说很好。我无法找到任何有希望的东西,那就是改变in声明后的值,即91,80年的a.pr
我在这里手动列出了这些值,但我想将其作为.pr列的数字数组传递给光标。简言之,当idlist是数组时,我想做a.pr=idlist。请告诉我我的想法是否可行。

我不知道全局表的确切结构,但您可以像这样使用游标中的集合

declare
  cursor lc is 
    select * 
      from (select a.lin, a.pr, 
                   b.name, sum(a.up) as u,
                   sum (a.d)         as d
              from li_dy_4 a,
                   p_list  b 
             where a.pr=b.id 
               and b.parent_id != 0 
               and a.partitionid <= 308 
               and a.partitionid >= 302 
               and a.pr in (91,80)
             GROUP BY a.pr, b.name, a.lin  
             order by d desc) ;
  rec lc%ROWTYPE;

BEGIN 
  open lc;
  loop 
    FETCH lc into rec;
    dbms_output.put_line(rec.pr);
    exit when lc%NOTFOUND;
  end loop;
  close lc;
END;

只是想提醒您,IN子句仅支持1000项。这可能是主要原因,对于SELECT查询没有所谓的批量绑定。我们有FORALL INSERT/UPDATE,它类似于批量绑定。不幸的是,select没有

但是,您仍然可以以不同的方式实现您的需求

您可以尝试全局临时表GTT,其中包含插入数据范围的临时表仅用于该会话

您可以FORALL将IN子句中的所有数据插入该表,并将该表连接到查询中

否则,如果是Oracle10g,则可以使用嵌套表;如果是Oracle11g,则可以使用简单的pl/sql类型本身,将所有类内项目作为记录,并将其连接到查询中


示例:使用嵌套表,对数量较少的可能重复项有效。请告诉我您使用的是什么数据库,Oracle 10g还是11g?我使用的是oracle11gR2。我已经尝试了您提供的解决方案,而且我的记录比您提到的要少。但是,我得到的是。PL/SQL:ORA-00904:MY_LIST.PR:无效标识符PLS-00341:游标“LC”的声明不完整或格式不正确…如果创建了类型,我该怎么做?prList和pr,我在PL/SQL块之前提到过?它应该可以工作,我试过同样的方法,它也可以工作。你能马上更新一下你所拥有的吗。。在你的问题本身中?myPrList prList:=prList。。您添加了?我使用上述示例代码的目的是创建一个过程,并向该过程传递变量和数组。通过传递参数从php执行该过程。
declare
 cursor c1 is
  select last_name ls  from empc;
 type x is table of employees.last_name%type;
 x1 x := x();
 cnt integer :=0;
begin
 for z in c1 loop
  cnt := cnt +1;
  x1.extend;
  x1(cnt) := z.ls;
  if x1(cnt) is NULL then-----------
   DBMS_OUTPUT.PUT_LINE('ASHISH');
  end if;
  dbms_output.put_line(cnt || ' '|| x1(cnt));
 end loop;
end;
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.lin, a.pr, 
                   b.name, sum(a.up) as u,
                   sum (a.d)         as d
              from li_dy_4 a,
                   p_list  b,
                   TABLE(CAST(myPrList as prList)) my_list
             where a.pr=b.id 
               and b.parent_id != 0 
               and a.partitionid <= 308 
               and a.partitionid >= 302 
               and a.pr = my_list.pr
             GROUP BY a.pr, b.name, a.lin  
             order by d 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;
/