如果在存储过程中使用游标做为一个out类型,存储多个属性,在java程序中可以用:
CallableStatement proc=null;
proc=O.conn.prepareCall("{call scott.testa(?,?)}")//testa是一个存储过程,第二个变量是游标类型的out参数
proc.setString(1,sql1);
proc.registerOutParameter(2,oracle.jdbc.OracleTypes.CURSOR);
proc.execute();
ResultSet rs = (ResultSet)proc.getObject(2);
//这样就可以获得多行数据=============================================
不用游标,下面程序为何出错?CallableStatement proc=null;
proc=O.conn.prepareCall("{call scott.testa(?,?)}")//testa是一个存储过程,第二个变量是游标类型的out参数
proc.setString(1,sql1);
proc.registerOutParameter(2,oracle.jdbc.OracleTypes.NUMBER);
proc.registerOutParameter(3,oracle.jdbc.OracleTypes.VARCHAR);
proc.registerOutParameter(4,oracle.jdbc.OracleTypes.VARCHAR);
proc.execute();
String s1=proc.getString(2);
String s2=proc.getString(3);
String s3=proc.getString(4);out.println(s1+s2+s3);========================================================================
如果不用游标,而将多个属性用多个out类型参数提取得到,有没有可能?如何实现多条数据(多行)输出?

解决方案 »

  1.   

    proc=O.conn.prepareCall("{call scott.testa(?,?)}")//testa是一个存储过程,第二个变量是游标类型的out参数
    proc.setString(1,sql1);
    proc.registerOutParameter(2,oracle.jdbc.OracleTypes.NUMBER);
    proc.registerOutParameter(3,oracle.jdbc.OracleTypes.VARCHAR);
    proc.registerOutParameter(4,oracle.jdbc.OracleTypes.VARCHAR);
    proc.execute();
    String s1=proc.getString(2);
    String s2=proc.getString(3);
    String s3=proc.getString(4);里面只有两个?,你这里出来多少个参数???
    相应的改存储过程,改输出参数,而且,按你这种参数方式(number,varchar2)只能输出一条记录。
    你得用数组作为输出参数。
      

  2.   

    存储过程贴出来给哥哥瞧瞧,haha
      

  3.   

    CREATE OR REPLACE PROCEDURE TESTA(loca in scott.dept.loc%type,deptno out scott.dept.deptno%type
    ,dname out scott.dept.dname%type,loc out scott.dept.loc%type)  AS
    BEGIN       select scott.dept.deptno into deptno from scott.dept where loc=loca;
          select scott.dept.dname into dname from scott.dept where loc=loca;
          select scott.dept.loc into loc from scott.dept where loc=loca;
    END TESTA;
      

  4.   

    select scott.dept.deptno into deptno from scott.dept where loc=loca;oracle 存储过程中,select ×× into ××要成功,必须保证:第一个××即select的那个××中有且仅有一条记录,否则:多于一条,报 too many rows,没有记录报 no data found。所以如果你属于这种情况,里面还是得用游标,然后把多条记录组织成数组输出。。大哥,你还是用游标吧。如果一定要用数组,晚上我有空给你写个。明天来看结果。
      

  5.   

    对了把你的dept表得create语句放在下面,顺便提供几条测试语句(insert into dept values***)。
      

  6.   

    谢谢大哥,游标的我之前已经写好了,用的是ref 游标,不知道显示游标可不可以?
    现在只是想试试多个参数能否多个用多个out参数,看来还是用游标吧。
      

  7.   


    游标可以,存储过程中直接 outparam out sys_refcursor定义在参数里面,取就用你上面得那个OracleTypes.CURSOR
    然后getObject转为ResultSet,就可以取出来。