CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Java >  J2SE / 基础类

调用Oracle存储过程的问题???

楼主zengtang(隋唐英雄)2006-03-21 14:07:51 在 Java / J2SE / 基础类 提问

//代码如下  
  //存储过程参数依次为:date,varchar2,table  
  Connection   con=getOracleConnection();  
  ResultSet   rs=null;  
  CallableStatement   cstm   =con.prepareCall("{call   proc_monitor(?,?,?)}");  
  cstm.setDate(1,new   Date(2005,1,1));  
  cstm.setString(2,"12");  
  cstm.registerOutParameter(3,OracleTypes.PLSQL_INDEX_TABLE);  
  cstm.execute();//执行到此就报错  
   
  rs   =   (ResultSet)cstm.getObject(3);  
   
  错误提示为:  
  java.sql.SQLException:   ORA-00932:   inconsistent   datatypes  
   
  at   oracle.jdbc.dbaccess.DBError.throwSqlException(DBError.java:168)  
  at   oracle.jdbc.oci8.OCIDBAccess.check_error(OCIDBAccess.java:1597)  
  at   oracle.jdbc.oci8.OCIDBAccess.executeFetch(OCIDBAccess.java:1093)  
  at   oracle.jdbc.oci8.OCIDBAccess.parseExecuteFetch(OCIDBAccess.java:1321)  
  at   oracle.jdbc.driver.OracleStatement.executeNonQuery(OracleStatement.java:1446)  
  at   oracle.jdbc.driver.OracleStatement.doExecuteOther(OracleStatement.java:1371)  
  at   oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1900)  
  at   oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:363)  
  at   oracle.jdbc.driver.OraclePreparedStatement.execute(OraclePreparedStatement.java:407)  
  at   myStudy.db.OracleJdbc.main(OracleJdbc.java:27)  
  Exception   in   thread   "main"  
  问题点数:50、回复次数:11Top

1 楼lcllcl987(毛爷爷)回复于 2006-03-21 14:28:41 得分 10

cstm.setDate(1,new   Date(2005,1,1));  
  这个date有问题吧?  
  换成oracle的日期型试一下Top

2 楼zengtang(隋唐英雄)回复于 2006-03-21 14:36:35 得分 0

我定义的Date   是java.sql.dateTop

3 楼zengtang(隋唐英雄)回复于 2006-03-21 15:58:41 得分 0

应该是cstm.registerOutParameter(3,OracleTypes.PLSQL_INDEX_TABLE);  
  的问题,应该设置什么类型才行呢。Top

4 楼yuzl32(有酒醉)回复于 2006-03-22 10:19:58 得分 0

把proc_monitor   方法的各个参数声明发出来看看Top

5 楼zengtang(隋唐英雄)回复于 2006-03-22 11:45:19 得分 0

create   or   replace   procedure   proc_monitor(  
              d_statement   in             date,  
  s_citycode   in varchar2,  
  table_ret   out         Prepayment_pkg.monitor_tab  
  )  
  create   or   replace   package   Prepayment_pkg   as  
    type   monitor_record   is   record   (  
          s_citycode   varchar2(40),  
      i_process_id   number,  
      i_amount_undo   number,  
      i_amount_done   number,  
      i_max_times   number,  
      i_min_times   number);  
    type   monitor_tab   is   table   of   monitor_record  
    INDEX   BY   BINARY_INTEGER;  
  end; Top

6 楼yuzl32(有酒醉)回复于 2006-03-22 12:01:07 得分 25

CallableStatement   替换为   OracleCallableStatement    
  Oracle定义的类型,CallableStatement   不一定试用Top

7 楼zengtang(隋唐英雄)回复于 2006-03-22 14:14:18 得分 0

换了OracleCallableStatement也不行啊Top

8 楼yuzl32(有酒醉)回复于 2006-03-22 19:57:42 得分 0

现在报什么错误?  
  (同样应该有对应的OracleConnection)Top

9 楼TONYBLARED(奔放的犀牛)回复于 2006-03-22 23:50:48 得分 15

楼主,给你个link,说的是sql   server的,说的很清楚,你可以适当参考一下。  
  http://community.csdn.net/Expert/topic/4595/4595735.xml?temp=.0476343Top

10 楼zengtang(隋唐英雄)回复于 2006-03-31 11:11:06 得分 0

结贴  
  如下方法解决:  
  Connection   con=getOracleConnection();  
  ResultSet   rs=null;  
  OracleCallableStatement   cstm   =(OracleCallableStatement)con.prepareCall("{call   Prepayment_process_monitor(?,?,?)}");  
  cstm.setDate(1,new   Date(2005-1900,1-1,1));  
  cstm.setString(2,"12");  
  cstm.registerOutParameter(3,OracleTypes.ARRAY,"MONITOR_TAB");  
  cstm.execute();  
  ARRAY   array   =   (ARRAY)   cstm.getArray(3);  
  while(rs.next()){  
  System.out.println("success");  
  STRUCT   obj=   (STRUCT)rs.getObject(2);  
  Object[]   attrs=obj.getAttributes();  
  String   citycode=attrs[0].toString();  
  Integer   process_id=new   Integer(Integer.parseInt(attrs[1].toString()));  
  Integer   amount_undo=new   Integer(Integer.parseInt(attrs[2].toString()));  
  Integer   amount_done=new   Integer(Integer.parseInt(attrs[3].toString()));  
  Integer   max_times=new   Integer(Integer.parseInt(attrs[4].toString()));  
  Integer   min_times=new   Integer(Integer.parseInt(attrs[5].toString()));  
  System.out.println("citycode:"+citycode+"   process_id:"+process_id+  
  "   amount_undo:"+amount_undo+"   amount_done:"+amount_done  
  +"   max_times:"+max_times+"   min_times:"+min_times);  
   
   
  }  
   
  rs   =(ResultSet)   array.getResultSet();  
  rs.close();  
  cstm.close();  
  con.close();  
   
  数据方面类型定义如下:  
  create   or   replace   type   monitor_record   is   object   (  
          s_citycode   varchar2(40),  
      i_process_id   number,  
      i_amount_undo   number,  
      i_amount_done   number,  
      i_max_times   number,  
      i_min_times   number);  
    create   or   replace   type   monitor_tab   is   table   of   monitor_record;Top

11 楼zengtang(隋唐英雄)回复于 2006-03-31 11:13:58 得分 0

不好意思,  
  rs   =(ResultSet)   array.getResultSet();  
  位置贴错了。大家注意一下。Top

相关问题

  • 在Oracle的存储过程中动态调用存储过程
  • Oracle调用Oracle存储过程?
  • jsp调用Oracle存储过程
  • pb如何调用oracle存储过程
  • vb调用oracle存储过程
  • 如何调用存储过程?请给BCB代码及ORACLE存储过程.
  • 存储过程调用存储过程
  • 关于在PB中动态调用ORACLE的存储过程
  • delphi中如何调用oracle中的存储过程和DBMS包?
  • BCB调用ORACLE 8的存储过程的问题!!!!

关键词

  • oracle
  • jdbc
  • date
  • cstm
  • ocidbaccess
  • oraclestatement
  • oraclecallablestatement
  • prepayment
  • monitor
  • attrs

得分解答快速导航

  • 帖主:zengtang
  • lcllcl987
  • yuzl32
  • TONYBLARED

相关链接

  • CSDN Java频道
  • Java类图书
  • Java类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo