原表是:mdsys.emp (记录举例)
DEPTID DEPTNAME EMPID EMPNAME SALARY
------ ---------- ------ ---------- -----------
1 销售部 1 陈一 1200
1 销售部 2 陈二 4500
1 销售部 3 陈三 4900
2 市场部 4 陈三 2000 SQL> declare
2 type name_array_type is varray(10) of varchar2(10);
3 name_array name_array_type;
4 cursor emp_cursor is select empname from mdsys.emp;
5
6 begin
7 open emp_cursor;
8 fetch emp_cursor bulk collect into name_array limit 10;
9 for i in 1..10 loop
10 dbms_output.put(name_array(i));
11 end loop;
12 close emp_cursor;
13 end ;
14 /
PL/SQL procedure successfully completed (这里没有记录输出来啊。)
奇怪的事情是我执行了另外一个程序,结果却在那个程序结果里面出来了。
SQL> declare
2 type name_array_type is varray(5) of varchar2(10);
3 name_array name_array_type;
4 cursor emp_cursor is select empname from mdsys.emp;
5 rows int :=5;
6 v_count int :=0;
7 begin
8 open emp_cursor;
9 loop
10 fetch emp_cursor bulk collect into name_array limit rows;
11 dbms_output.put('雇员名:');
12 for i in 1..(emp_cursor%rowcount-v_count) loop
13 dbms_output.put(name_array(i)||' ');
14 end loop;
15 dbms_output.new_line;
16 v_count:=emp_cursor%rowcount;
17 exit when emp_cursor%notfound;
18 end loop;
19 close emp_cursor;
20 end;
21 /王丽刘娜袁野李欣刘明雇员名:袁野 王丽 刘娜 李欣 刘明
雇员名:张亚东 刘明凯 季岚 梁栋 汤佳
雇员名:田康 陈巍伟 孙鹏 巍伟 陈淑华
雇员名:王朋 单红 王祥 请大侠帮我看看是什么问题先谢过~
解决方案 »
- 不知如何编写这样复杂ORACLE的SQL语句?(稍难)
- 面试求组!
- oracle中怎么进入管理员用户模式?
- 请教:hibernate3.1+oracle8乱码问题!!!
- 【请大家来讨论一下Oracle的锁表机制】--- EXCLUSIVE&SHARE(共享和独占方式)在实际使用时都有些什么区别
- oracle插入最大值的问题
- 怎么逐行 测试存储过程的执行
- 触发器编译报错:PLS-00103: 出现符号 "END"
- 请问哪里可以下载oracle816nt.zip?
- 安装问题:9i Release2那位安装成功了,请帮个忙找个小文件
- 试试
- Oracle ERP克隆后,在 solaris 上 tnsping 不通
TYPE name_array_type IS VARRAY(20) OF VARCHAR2(20);
name_array name_array_type;
CURSOR emp_cursor is select EmpName from T146;BEGIN
OPEN emp_cursor;
FETCH emp_cursor BULK COLLECT INTO name_array ;
FOR i IN 1..4 LOOP
dbms_output.put(name_array(i));
END LOOP;
dbms_output.put_line(''); --加一行代码
CLOSE emp_cursor;
END;
2 type name_array_type is varray(10) of varchar2(10);
3 name_array name_array_type;
4 cursor emp_cursor is select empname from mdsys.emp;
5
6 begin
7 open emp_cursor;
8 loop
9 fetch emp_cursor bulk collect into name_array limit 10;
10 exit when name_array.count=0;
11 end loop;
12 for i in 1..10 loop
13 dbms_output.put(name_array(i));
14 end loop;
15 close emp_cursor;
16 end ;
因为你用的是游标,并且这游标查询出来的记录数量你是不能确定的,但你又限制的批量赋值的数量,所以可能存在一次赋值没有将游标记录处理完的情况,因此需要加循环操作。循环的退出条件就是ame_array.count=0来确定游标记录被处理完了。
dbms_output.put('雇员名:');
for i in 1..10 loop
dbms_output.put(name_array(i)||' ');
end loop;
请问一下,不是fetch了10条记录之后再loop循环的吗?怎么会存在您说的那种情况呢,您能说说清楚吗
你不加limit 10,他就一次性批量的将数据存入array数组,你加了就每次存10条记录。如果你游标有20条记录你就需要执行两次fetch bulk collect into。
其实跟简单显示游标的原理一样,只不过fetch into 操作的是记录,而fetch bulk collect into操作的是集合open cursor
loop
fetch
exit when xxxx
end loop