oracle存储过程顶级高手进

来源:百度知道 编辑:UC知道 时间:2024/05/28 10:56:27
FETCH a_cursor BULK COLLECT INTO a_list LIMIT 1000;
FOR i IN 1 .. a_list.COUNT LOOP
OPEN b_cursor(a_list(i).aa, a_list(i).bb);
FETCH b_cursor INTO b_result;
close b_cursor;
end loop

怎么改写上面的写法 给我说下思路 谢谢
上面的写法 循环开关b_cursor多次 导致性能十分底下
a b游标分别找几百万数据的表,a_list(i).aa, a_list(i).bb对应b_cur查询上有联合索引 我如何一次把对应1000个a_list(i).aa, a_list(i).bb查询出来放到一个list里呢.取a的cursor不可避免 所以b游标不好用2表关联查询 否则又多一次进行了 a表的遍例

个人思路 定义 b游标时候 where 条件 实现 (b.aa ,b.bb) in ((a_list(1).aa,a_list(1).bb),((a_list(2).aa,a_list(2).bb).........((a_list(1000).aa,a_list(1000).bb)) 我该如何实现

解决后 200分奉上

写了个大概,不知道能不能起到作用,总体想法就是实现你的思路,用的是游标变量。

type pcursor is REF CURSOR;
p_cur pcursor;

str_where := 'where (b.aa ,b.bb) in('
FOR i IN 1 .. a_list.COUNT LOOP
str_where:=str_where||'('||a_list(i).aa||','||a_list(i).bb||'),';
end loop
str_where:=rtrim(str_where,',')||')';
str_sql:=str_1||str_where;
open p_cur for str_sql;
loop
fetch p_cur into b_result;
exit when p_cur%notfound;
end loop;

(自认为不是高手,用的不对的话请见谅)。

FETCH a_cursor BULK COLLECT INTO a_list LIMIT 1000;

oracle中原来有这种用法,学习了。