在同一个事务中,现在一个表里插入了几条数据,接着用游标将新插入的数据读出来,然后进行处理。我记得以前在同一个事务中游标是可以读出刚插入的数据的,即在插入数据未提交之前。但是现在我用java类来调用这个存储过程,游标却查不出数据,有哪位高人知道,请指点一下,现在弄的我很郁闷。

解决方案 »

  1.   

    对于“在同一个事务中游标是可以读出刚插入的数据的,即在插入数据未提交之前。”这样理解是不对的,使用游标基础规范:
    1.在定义一个记录变量使用TYPE命令和%ROWTYPE后,当游标选择很多列的时候,那么使用记录比为每列声明一个变量要方便得多。当在表上使用%ROWTYPE并将从游标中取出的值放入记录中时,如果要选择表中所有列,那么在SELECT子句中使用*比将所有列名列出来要安全得多。
    2、带参数的游标
      与存储过程和函数相似,可以将参数传递给游标并在查询中使用。这对于处理在某种条件下打开游标的情况非常有用。
        与存储过程不同的是,游标只能接受传递的值,而不能返回值。参数只定义数据类型,没有大小。
      另外可以给参数设定一个缺省值,当没有参数值传递给游标时,就使用缺省值。游标中定义的参数只是一个占位符,在别处引用该参数不一定可靠。
      

  2.   

    同一个会话中是可以实现的。LZ的问题在于你的insert与你的java类调用过程是否在同一个会话中?
    OPER@jf> create table test(aaa number);Table created.OPER@jf> 
      1  create or replace procedure test_p
      2  as
      3  cursor aaa is select * from test;
      4  begin
      5  for rec in aaa loop
      6  dbms_output.put_line(rec.aaa);
      7  end loop;
      8* end;
    OPER@jf> /Procedure created.OPER@jf> exec test_pPL/SQL procedure successfully completed.OPER@jf> insert into test values(1);1 row created.OPER@jf> exec test_p
    1PL/SQL procedure successfully completed.OPER@jf> insert into test values(2);1 row created.OPER@jf> exec test_p
    1
    2PL/SQL procedure successfully completed.OPER@jf> rollback;Rollback complete.OPER@jf> exec test_pPL/SQL procedure successfully completed.OPER@jf> 
      

  3.   

    多半是没有COMMIT吧?
    Java中用JDBC时, 要么自己手动COMMIT, 要么设置AutoCommit属性