Oracle 使用plsql在游标中绑定数组
上述声明对我来说很好。我无法找到任何有希望的东西,那就是改变in声明后的值,即91,80年的a.prOracle 使用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
我在这里手动列出了这些值,但我想将其作为.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;
/