我在Oracle里面这样定义了一个存储过程:
  CREATE OR REPLACE Procedure insstandard(     p_stdno IN ordersub.standno%type,
     v_intTotale OUT int,
     v_intViewNumber OUT int,
     v_intPrintNumber OUT int,
     v_intDownNumber OUT int,
     p_ret OUT varchar(20))Begin
     select sum(mount) into v_intTotale from ordersub o where o.standno ='p_stdno'  AND status='1';
     select sum(mount) into v_intViewNumber from ordersub o where o.standno ='p_stdno'  AND mediumtype='0' AND status='1';
     select sum(mount) into v_intPrintNumber from ordersub o where o.standno ='p_stdno'  AND mediumtype='1' AND status='1';
     select sum(mount) into v_intDownNumber from ordersub o where o.standno ='p_stdno'  AND mediumtype='2' AND status='1';
     COMMIT;
     p_ret:= ‘Sucess!’;Exception
     when others then
          ROLLBACK;
          p_ret := ‘fail’;
End;在JAVA中我这样去调用它:
   public int[] getPreRs(String standNo) throws Exception {
int[] arrInt = new int[4];
CallableStatement cstmt = conn.prepareCall("{call insstandard(?,?,?,?,?)}");
cstmt.setString(1,standNo);
cstmt.registerOutParameter(2,Types.INTEGER);
cstmt.registerOutParameter(3,Types.INTEGER);
cstmt.registerOutParameter(4,Types.INTEGER);
cstmt.registerOutParameter(5,Types.INTEGER);
        cstmt.execute();
arrInt[0] = cstmt.getInt(2);
arrInt[1] = cstmt.getInt(3);
arrInt[2] = cstmt.getInt(4);
arrInt[3] = cstmt.getInt(5);
        
return arrInt;
}出现错误:对象 GB_STD.INSSTANDARD 无效  
有谁知道该怎么改啊

解决方案 »

  1.   

    存储过程是invalid状态,存储过程有语法错误。p_ret OUT varchar2,不需要定义长度。
      

  2.   

    改了啊,现在存储过程没有错了但运行到下面的时候报错:
       CallableStatement cstmt = conn.prepareCall("{call std.insstandard(?,?,?,?,?)}");PLS-00302: 必须说明 'INSSTANDARD' 组件
      

  3.   

    call std.insstandard?过程insstandard的owner是std吗?
      

  4.   

    嗯,知道了,现在有个更麻烦的问题,就是我是在循环里面调用存储过程的,也就是我先用模糊查询把表中的东西查出来,再根据其中一个字段做为输入值调用过程,我是这么写的:
      ResultSet rs = db.getRs(sql);
          while (rs.next()) {
            String a100 = rs.getString("a100");
            int num[] = db.getPreRs(a100);
         }
    方法为:
        public int[] getPreRs(String standNo) throws Exception {
    int[] arrInt = new int[4];
    CallableStatement cstmt = conn.prepareCall("{call insstandard (?,?,?,?,?,?)}");
    cstmt.setString(1,standNo);
    cstmt.registerOutParameter(2,Types.INTEGER);
    cstmt.registerOutParameter(3,Types.INTEGER);
    cstmt.registerOutParameter(4,Types.INTEGER);
    cstmt.registerOutParameter(5,Types.INTEGER);
    cstmt.registerOutParameter(6,Types.VARCHAR);
            cstmt.execute();
    arrInt[0] = cstmt.getInt(2);
    arrInt[1] = cstmt.getInt(3);
    arrInt[2] = cstmt.getInt(4);
    arrInt[3] = cstmt.getInt(5);
            
    return arrInt;
    }
    这样速度很慢,我想要把模糊查询的SQL也写进存储过程,这个该怎么写啊,它返回的是一个集合啊