PreparedStatement调用存储过程的问题

wabania 2008-12-29 01:49:12
存储过程如下:
PROCEDURE Query_org_increment(Errbuf OUT NOCOPY VARCHAR2,
Retcode OUT NOCOPY NUMBER,
p_Record_Set OUT Record_Set,
p_start_date VARCHAR2,
p_end_date VARCHAR2)
用PreparedStatement调用此存储过程时按顺序赋参数值时会出错:参数个数或类型不匹配
PreparedStatement stmt = new PreparedStatement();
for (int i=0;i<params.length;i++)
stmt.setObject(i + 1, params[i]);
但当我把存储过程入口参数放在前面时,就不会报错了
PROCEDURE Query_org_increment(
p_start_date VARCHAR2,
p_end_date VARCHAR2
Errbuf OUT NOCOPY VARCHAR2,
Retcode OUT NOCOPY NUMBER,
p_Record_Set OUT Record_Set,
)
我估计PreparedStatement给参数赋值的方法是把所有存储过程的参数都当作是入口参数,不会区分是否是IN还是OUT类型。如果存储过程的入口参数的顺序是错乱的,我怎么去赋值呢
...全文
784 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
李敏910 2008-12-29
  • 打赏
  • 举报
回复
连库的接口(应该叫接口吧)有三个,ps是预编译连库的,调用存储过程可以用另外一个接口,好像是c开头的,我忘记了
树成 2008-12-29
  • 打赏
  • 举报
回复
9i版本的oracle用9i版本的驱动包,版本要对应,一般什么版本的oracle,oracle安装目录下就有相应版本的驱动包,不要用异版本的驱动包,不然会出问题的,即使版本号只差0.001,因为我出国这种问题让客户郁闷了好一阵子,让我经理急了好一阵子。
wabania 2008-12-29
  • 打赏
  • 举报
回复
你用的是哪个版本的
树成 2008-12-29
  • 打赏
  • 举报
回复
当然是oracle啦,9i版本的。
我估计是你的驱动包版本不对或是其它原因。
wabania 2008-12-29
  • 打赏
  • 举报
回复
你用的是oracle驱动吗,哪个版本的
SylvanLiu 2008-12-29
  • 打赏
  • 举报
回复
关注下
wabania 2008-12-29
  • 打赏
  • 举报
回复
你是怎么做的呢,我一调用就出那个错,网上也有好多说那个错的
树成 2008-12-29
  • 打赏
  • 举报
回复
当然试过,没什么问题噢,因为我正在用这个东西,目前,现在。
ParameterMetaData pmd=this.prepared.getParameterMetaData();
wabania 2008-12-29
  • 打赏
  • 举报
回复
你这样试过没,我用oracle驱动,出错:
ParameterMetaData parameter = stmt.getParameterMetaData();


Exception in thread "main" java.lang.AbstractMethodError: oracle.jdbc.driver.T4CCallableStatement.getParameterMetaData()Ljava/sql/ParameterMetaData;
树成 2008-12-29
  • 打赏
  • 举报
回复
你在调用存储过程的时候就应该已经知道存储过程的名称和其参数的各个属性了,如果你想做一个功能强大点的接口调用,那么你用parameterMetaData来进行判断也是可以的。
因为存储过程参数的属性在java里面设置是没有任何意义的,因为参数属性是数据库里面的属性,不属于java,所以java只能获取属性不能设置。
不过一般来说存储过程的参数都是in类型属性的,需要返回值的时候一般都用函数。
wabania 2008-12-29
  • 打赏
  • 举报
回复
我只能根据parameterMetaData来判断哪些是IN,哪些是OUT了,然后再赋值
树成 2008-12-29
  • 打赏
  • 举报
回复
调用存储过程不是用这个接口的对象,是用CallableStatement对象来调用存储过程的 PreparedStatement 对象是动态绑定参数查询语句。
对于Out类型参数的使用 CallableStatement有getXxx方法来获取Out参数返回值。
wabania 2008-12-29
  • 打赏
  • 举报
回复
不是这个问题,PreparedStatement stmt = new PreparedStatement();是我提问时乱写的
yangyong29 2008-12-29
  • 打赏
  • 举报
回复
PreparedStatement stmt = new PreparedStatement();

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧