
关于ORA-01002 读取违反顺序,end loop 进行了循环取值,但是在JDBC调用存储过程时,只需要返回一个结果集(cursor)就行,此时就
今天,运行自己写的JDBC调用存储过程时遇到了如下错误: 
ORA-01002 读取违反顺序 
在网上百般寻找,大多数给出的建议是设置sql自动提交为false:cn.setAutoCommit(false); 
但是这不是我的错误所在,我最后解决的时候也没有进行设置。 
我的存储过程如下: 
create or replace procedure tag(outs out sys_refcursor) is 
allout sys_refcursor; 
id varchar2(16); 
mid varchar2(16); 
tty varchar2(16); 
cty varchar2(16); 
tid varchar2(16); 
tna varchar2(16); 
tva varchar2(16); 
tsi varchar2(16); 
tti varchar2(16); 
pid varchar2(16); 
nex varchar2(16); 
gra char(4); 
begin 
open allout for select id,module_id,tag_type,control_type,tag_id,tag_name,tag_value,tag_size,tag_title,parent_id,next,grade 
 into id,mid,tty,cty,tid,tna,tva,tsi,tti,pid,nex,gra from t_tag ; 
--loop 
--fetch allout into id,mid,tty,cty,tid,tna,tva,tsi,tti,pid,nex,gra; 
--exit when allout%notfound; 
--dbms_output.put_line(allout%rowcount||' '||id||' '||mid||' '||tty||' '||cty||' '||tid||' '||tna||' '||tva||' '||tsi||' '||tti||' '||pid||' '||nex||' '||gra); 
--end loop; 
outs:=allout; 
end tag; 
JDBC如下: 
cn = DBFactory.getconn(); 
//cn.setAutoCommit(false); 
 //System.out.println("创建声明"); 
cst = cn.prepareCall("{call tag(?)} "); 
System.out.println("执行sql"); 
cst.registerOutParameter(1, Oracle.jdbc.OracleTypes.CURSOR); 
cst.execute(); 
System.out.println("execute成功"); 
rs = (ResultSet) cst.getObject(1); 
System.out.println(rs); 
while(rs.next()){ 
 } 
我的错误在于所写存储过程中,由于想在pl-sql中运行出结果,所以采用了 
loop 
fetch into 
end loop 进行了循环取值,但是在JDBC调用存储过程时,只需要返回一个结果集(cursor)就行,,此时就报“ 读取违反顺序”的错,解决办法:去掉loop....end loop 相应代码。 
更多Oracle相关信息见Oracle 专题页面 ?tid=12
 
