CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
IBM Rational 系统开发最佳实践工具包 WebSphere MQ 最佳实践 TOP 15
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Java >  Web 开发

java中如何调用sqlserver数据库中的自定义的存储过程???????

楼主windtree(风树)2006-03-06 15:24:23 在 Java / Web 开发 提问

我用java调用存储过程,语句好像没问题(在一个简单的存储过程中试过),但是一放到我做的存储过程就报错(存储过程在sqlserver的查询分析器中运行没问题),但是放到页面里提示是“java.sql.SQLException:     [Microsoft][ODBC     SQL     Server     Driver][SQL     Server]形式参数     ′@waretype′     定义为     OUTPUT,但实际参数却未声明为     OUTPUT。”但是我把◎waretype     setstring以后,又提示我下一个要这样。不知是什么原因,请各位帮帮我。谢谢!!!          
                                CallableStatement     cs=con1.prepareCall("{call     pro_Query(?,?,?,?,?,?,?,?,?,?)}");      
                                cs.registerOutParameter(1,java.sql.Types.CHAR);      
                                cs.setString(4,"PNP9000199");                                  
                                cs.executequery();      
                                String     s1=cs.getString(1);      
  这是我在网页中调用存储过程的语句,请问是否正确?  
  总是提示我实参未声明output  
  问题点数:100、回复次数:35Top

1 楼yuchenjushi(雨辰)回复于 2006-03-06 15:47:22 得分 0

请大家帮帮我吧,他提示我要我给每个参数声明output,请问到底是怎么回事呀Top

2 楼wilowind(杂而不精)回复于 2006-03-06 15:48:23 得分 0

顶下,学习中...Top

3 楼jfy3d(剑事 http://www.migti.com)回复于 2006-03-06 16:13:12 得分 0

你的存储过程里没有设置   OUTPUTTop

4 楼yuchenjushi(雨辰)回复于 2006-03-06 16:27:41 得分 0

哦,我得存储过程里没有设置output,请问是不是要设成output呀Top

5 楼zhh1981(**的猪头)回复于 2006-03-06 16:43:57 得分 0

PROCEDURE   proc_get_sysmenu(pUserid           INT,   --   用户ID  
                                                            pLayerLevel   INT,   --   菜单级别  
                                                            pParent           varchar2,   --   上级编码  
                                                            isAllotAuth   varchar2,   --   是否用于权限分配 '1'-是  
                                                            pOutRecSQL     OUT   varchar2);  
  pOutRecSQL     OUT   varchar2------这个就是标记为output的Top

6 楼yuchenjushi(雨辰)回复于 2006-03-06 16:48:07 得分 0

请问你的意思是要在存储过程中,必须定义为output才行么Top

7 楼jfy3d(剑事 http://www.migti.com)回复于 2006-03-06 17:04:30 得分 5

没有output就把   cs.registerOutParameter(1,java.sql.Types.CHAR);     去掉Top

8 楼zhh1981(**的猪头)回复于 2006-03-06 17:21:32 得分 10

cs.registerOutParameter(1,java.sql.Types.CHAR);    
  既然这样设定了就要在过程中在相应的参数设为OUT的Top

9 楼yuchenjushi(雨辰)回复于 2006-03-06 23:38:15 得分 0

感谢jfy3d(剑事)还有zhh1981(**的猪头),谢谢你们的回帖,可是如果去掉了   cs.registerOutParameter(1,java.sql.Types.CHAR);   这句话,那我移植性一执行  
  cs.executeUpdate();或是cs.execute();就报错了,错误是  
  java.sql.SQLException:   [Microsoft][ODBC   SQL   Server   Driver]COUNT   字段不正确或语法错误  
  请问怎么办呀???Top

10 楼doway(john)回复于 2006-03-07 00:11:46 得分 0

PROCEDURE   proc_get_sysmenu(  
      pUserid           INT,   --   用户ID  
      pLayerLevel   INT,   --   菜单级别  
      pParent           varchar2,   --   上级编码  
      isAllotAuth   varchar2,   --   是否用于权限分配 '1'-是  
      pOutRecSQL     OUT   varchar2);  
  pOutRecSQL     OUT   varchar2------这个就是标记为output的  
   
  CallableStatement   cs=con1.prepareCall("{call   pro_Query(?,?,?,?,?)}");     //   数要数对,几个参数就几个问号。  
  cs.registerOutParameter(5,   java.sql.Types.VARCHAR);     //   这个数也数错了,第五个参数才是输出参数。  
  cs.setString(4,"PNP9000199");        
  ...     //   这里其他的参数也需要设置。  
  cs.executequery();     //   这个方法大小写也不对。  
  String     s1=cs.getString(5);     //   这个数也不可以数错,应该差不多了。   :)  
  Top

11 楼nirendao(雷老虎)回复于 2006-03-07 00:30:54 得分 0

关注Top

12 楼TONYBLARED(奔放的犀牛)回复于 2006-03-07 03:18:30 得分 0

楼主可适当参考如下解决方案:  
  /**  
  create   procedure   Battery_Order4  
  @shipName   nvarchar(40)   =   NULL  
  as    
  if   @shipName   is   null  
      return(1)  
  else  
      return(2)  
  **/  
  public   static   void   procedureReturn()   {  
  try   {  
  Connection   conn   =   JDBC_ODBC.getConnection();  
  System.out.println("conn   is:"   +   conn);  
  String   call   =   "{?   =   call   Battery_Order4(?)}";  
  CallableStatement   cs   =   conn.prepareCall(call);  
  cs.registerOutParameter(1,   java.sql.Types.INTEGER); cs.setString(2,   "Hanari   Carnes");  
  cs.execute();  
  System.out.println(cs.getInt(1));  
  }   catch   (Exception   ex)   {  
  ex.printStackTrace();  
  }  
  }  
   
  /**  
  create   procedure   ShipVia_Sum  
  @via   int,  
  @sum   money   output  
  as  
  select   @sum   =   sum(freight)   from   orders  
  where   shipVia   =   @via  
  **/  
  public   static   void   procedureOutput()   {  
  try   {  
  Connection   conn   =   JDBC_ODBC.getConnection();  
  System.out.println("conn   is:"   +   conn);  
  String   call   =   "{call   ShipVia_Sum(?,?)}";  
  CallableStatement   cs   =   conn.prepareCall(call);  
  cs.setInt(1,   1);  
  cs.registerOutParameter(2,   java.sql.Types.DOUBLE);  
  cs.execute();  
  System.out.println(cs.getDouble(2));  
  }   catch   (Exception   ex)   {  
  ex.printStackTrace();  
  }  
  }Top

13 楼TONYBLARED(奔放的犀牛)回复于 2006-03-07 03:20:17 得分 0

以上是针对sqlserver数据库建立的存储过程,oracle中的应该类似吧,各数据库厂商提供的内部接口不一样,但是java访问方式几乎相同.个人看法.Top

14 楼wmzsl(王明哲)回复于 2006-03-07 09:05:14 得分 0

来晚了哈:)   顶一下Top

15 楼fjm_520(蓝)回复于 2006-03-07 09:50:35 得分 0

学习中Top

16 楼jordan1(班君)回复于 2006-03-07 10:54:05 得分 0

up   一下!Top

17 楼ssy8110(半只拖鞋)回复于 2006-03-07 15:24:51 得分 0

TONYBLARED(奔放的犀牛)   最全,顶Top

18 楼yuchenjushi(雨辰)回复于 2006-03-07 15:27:40 得分 0

首先感谢大家对我的帮助!可还是有一点不对,我是这样的,我在数据库中定义了一个存储过程。而且也都加上了out:  
  CREATE   proc   pro_Query  
  @do_jigou   varchar(4)   out,  
  @guest_jigou   varchar(4)   out,  
  @warename   varchar(50)   out,  
  @warenum   varchar(50)   out,  
  @waretype   varchar(50)   out,  
  @warebulk   varchar(100)   out,  
  @waremaketime   varchar(100)   out,  
  @warestate   varchar(100)   out,  
  @stocode   varchar(20)   out,  
  @GroupType   varchar(100)     out  
   
  这十个参数是可以作为条件选择查询的,下面是我的代码:  
  CallableStatement   cs=con1.prepareCall("{call   pro_Query(?,?,?,?,?,?,?,?,?,?)}");  
                  cs.registerOutParameter(1,java.sql.Types.VARCHAR);  
                  cs.registerOutParameter(2,java.sql.Types.VARCHAR);  
                  cs.registerOutParameter(3,java.sql.Types.VARCHAR);  
                  cs.registerOutParameter(4,java.sql.Types.VARCHAR);  
                  cs.registerOutParameter(5,java.sql.Types.VARCHAR);  
                  cs.registerOutParameter(6,java.sql.Types.VARCHAR);  
                  cs.registerOutParameter(7,java.sql.Types.VARCHAR);  
                  cs.registerOutParameter(8,java.sql.Types.VARCHAR);  
                  cs.registerOutParameter(9,java.sql.Types.VARCHAR);  
                  cs.registerOutParameter(10,java.sql.Types.VARCHAR);  
              cs.setString(4,"PNP9000199");  
                  cs.execute();  
            System.out.println(cs.getString(2));//他却返回null  
   
  可是我在查询分析器中运行:exec   pro_query'','','','PNP9000199','','','','','',''会得到这样一个结果集  
  名称         型号                     规格   描述         批次   期初   以下架   货物状态   计量单位   存储位置  
  巧可力     PNP9000199       24G×80   食品     2006     10       6               出库           箱                 c3  
   
  请大家帮忙看看哪里不对呀,先谢谢了Top

19 楼bohlee(我心澎湃)回复于 2006-03-07 15:51:35 得分 0

markTop

20 楼doway(john)回复于 2006-03-07 19:51:24 得分 0

胡搞。  
   
  楼主怕是不明白“输出”的含义。  
  Top

21 楼qingzhuang(半片云)回复于 2006-03-07 20:45:28 得分 0

去看本书Top

22 楼yuchenjushi(雨辰)回复于 2006-03-08 00:20:51 得分 0

您好,doway(john):  
  还请您多指教,我第一次用java调用存储过程,只看了一些大概,对他不是很明了,由于库存查询的代码完成只有俩天时间,存储过程和数据库又不是我写的,所以在这里出丑了,还望您多指教。  
        在此也多谢doway(john)以及回帖的各位!!!Top

23 楼doway(john)回复于 2006-03-08 01:11:35 得分 0

SQL   Server   的存储过程可以返回结果集。因此,对于下表:  
   
  名称         型号                     规格   描述         批次   期初   以下架   货物状态   计量单位   存储位置  
  巧可力     PNP9000199       24G×80   食品     2006     10       6               出库           箱                 c3  
   
  如果楼主是想根据型号“PNP9000199”返回一行的数据,根本就不需要输出参数。就是在   Oracle   中也不能那样写,而应使用返回行的函数。  
  Top

24 楼yuchenjushi(雨辰)回复于 2006-03-08 08:12:55 得分 0

请问您说的返回行的函数是什么意思,是不是就是指可以提取行记录呢,方法我不太懂,你能否给我一段代码我读读,谢谢!!!Top

25 楼yuchenjushi(雨辰)回复于 2006-03-08 10:15:21 得分 0

请大家帮我看看,多多指教,谢谢了!!!Top

26 楼yuchenjushi(雨辰)回复于 2006-03-08 11:47:51 得分 0

请问大家谁能给我一段代码,我自己研究也可以。先谢谢了!!!Top

27 楼dewdrop(白露)回复于 2006-03-08 12:12:54 得分 0

@warenum   varchar(50)   out,//这句不要out  
   
  cs.registerOutParameter(4,java.sql.Types.VARCHAR);//这句删掉  
   
  这样试试呢?Top

28 楼yuchenjushi(雨辰)回复于 2006-03-08 15:50:04 得分 0

我试了,把@warenum   varchar(50)   out,//这句不要out  
   
  cs.registerOutParameter(4,java.sql.Types.VARCHAR);//这句删掉  
   
  也不行,请问谁知道是怎么回事亚,还望各位大侠多多帮助!!!  
  Top

29 楼xiongbing528(多情剑客无情剑)回复于 2006-03-08 16:31:05 得分 0

楼主好象没理解存储过程的作用Top

30 楼yuchenjushi(雨辰)回复于 2006-03-08 16:46:58 得分 0

请问是怎么回事呀,我现在是有点晕了。是这样的,我在数据库中定义了一个存储过程。他可以接受十个参数中的任意一个作为查询条件,然后返回一个结果集,里面包含了这个货物的名称,型号等10个货物信息,我现在只是想得到这个结果集,把他提取出来。请问应该如何作呢Top

31 楼doway(john)回复于 2006-03-08 17:24:51 得分 20

这就不需要输出参数。  
   
  楼主   GOOGLE:jdbc   存储过程   sql   server  
   
  保证有大把的内容。  
  Top

32 楼TONYBLARED(奔放的犀牛)回复于 2006-03-08 20:19:58 得分 65

我来跟yuchenjushi同学讨论吧.  
  你这个问题我斟酌了一下,觉得有两个地方是关键.  
  首先,存储过程是怎么写的,怎么用的你要明白.为了解决这个问题,我在本机操作了一下.  
  环境sqlserver2000.  
  1.建表  
  create   table   tonyProducts(  
  mingcheng   varchar(20),  
  xinghao   varchar(10),  
  guige   varchar(10),  
  miaoshu   varchar(20),  
  pici   varchar(4),  
  qichu   varchar(2),  
  yixiajia   varchar(2),  
  zhuangtai   varchar(10),  
  danwei   varchar(4),  
  weizhi   varchar(3)  
  )  
  2.插数据  
  insert   into   tonyProducts   values('chocolate','PNP9000199','24G×10','f1','2006','10','16','in','pack','c1')  
  insert   into   tonyProducts   values('icecream','PNP9000198','24G×20','f2','2005','20','26','out','box','c2')  
  insert   into   tonyProducts   values('melon','PNP9000197','24G×30','f3','2004','30','36','way','bund','c3')  
  insert   into   tonyProducts   values('sugar','PNP9000196','24G×40','f4','2003','40','46','crupt','bott','c4')  
  insert   into   tonyProducts   values('icecream','PNP9000195','24G×50','f5','2002','50','56','out','cup','c5')  
  insert   into   tonyProducts   values('pie','PNP9000194','24G×60','f6','2001','60','66','way','cup','c6')  
  insert   into   tonyProducts   values('chocolate','PNP9000193','24G×70','f7','2000','70','76','in','box','c7')  
  insert   into   tonyProducts   values('pie','PNP9000192','24G×80','f8','1999','80','86','out','pile','c8')  
   
  3.建立存储过程  
  CREATE   proc   pro_Query  
  @mingcheng   varchar(20)   =   null,  
  @xinghao   varchar(10)   =   null,  
  @guige   varchar(10)   =   null,  
  @miaoshu   varchar(20)   =   null,  
  @pici   varchar(4)   =   null,  
  @qichu   varchar(2)   =   null,  
  @yixiajia   varchar(2)   =   null,  
  @zhuangtai   varchar(10)   =   null,  
  @danwei   varchar(4)   =   null,  
  @weizhi   varchar(3)   =   null  
  as  
  select   *   from   tonyProducts  
  where    
  mingcheng   like   isnull(@mingcheng,'%')  
  and   xinghao   like   isnull(@xinghao,'%')  
  and   guige   like   isnull(@guige,'%')  
  and   miaoshu   like   isnull(@miaoshu,'%')  
  and   pici   like   isnull(@pici,'%')  
  and   qichu   like   isnull(@qichu,'%')  
  and   yixiajia   like   isnull(@yixiajia,'%')  
  and   zhuangtai   like   isnull(@zhuangtai,'%')  
  and   danwei   like   isnull(@danwei,'%')  
  and   weizhi   like   isnull(@weizhi,'%')  
   
  建立存储过程要特别说明一下,我这写的存储过程跟你的不一样.但是原理上是达到了你所言的"他可以接受十个参数中的任意一个作为查询条件,然后返回一个结果集".  
   
  4.在查询分析器中使用pro_Query  
      例子1:exec   pro_Query,此操作返回所有.  
      例子2:exec   pro_Query   'chocolate',此操作返回mingcheng是"chocolate"的所有结果.  
      例子3:exec   pro_Query   null,'PNP9000199',此操作返回xinghao是"PNP9000199"的所有结果.  
      例子4:exec   pro_Query   null,null,null,null,null,null,null,null,null,'c8',此操作返回weizhi是"c8"的所有结果.  
      声明:在查询分析器里使用存储过程有两种方式,一是按位置传递参数,如上者.二是按参数传递参数.以此来证明存储过程的正确性.  
   
  存储过程创建完毕,接着在程序里面引用.为了一一对应,我写了四个函数.  
  /*  
    *   对应例子1  
    */  
  public   static   void   procedureResultSet4()   {  
  try   {  
  System.out.println("in   procedureResultSet4()");  
  Connection   conn   =   JDBC_ODBC.getConnection();  
  String   call   =   "{call   pro_Query}";  
  CallableStatement   cs   =   conn.prepareCall(call);  
  ResultSet   rs   =   cs.executeQuery();  
  while   (rs.next())   {  
  int   index   =   1;  
  while(index   <=   9){  
  //格式化输出.  
  System.out.print(rs.getString(index++)+",");  
  }  
  System.out.println(rs.getString(index));  
  }  
  }   catch   (Exception   ex)   {  
  ex.printStackTrace();  
  }  
  }  
   
  /*  
    *   对应例子2  
    */  
  public   static   void   procedureResultSet5()   {  
  try   {  
  System.out.println("in   procedureResultSet5()");  
  Connection   conn   =   JDBC_ODBC.getConnection();  
  String   call   =   "{call   pro_Query(?)}";  
  CallableStatement   cs   =   conn.prepareCall(call);  
  cs.setString(1,"chocolate");  
  ResultSet   rs   =   cs.executeQuery();  
  while   (rs.next())   {  
  int   index   =   1;  
  while(index   <=   9){  
  //格式化输出.  
  System.out.print(rs.getString(index++)+",");  
  }  
  System.out.println(rs.getString(index));  
  }  
  }   catch   (Exception   ex)   {  
  ex.printStackTrace();  
  }  
  }  
   
  /*  
    *   对应例子3  
    */  
  public   static   void   procedureResultSet6()   {  
  try   {  
  System.out.println("in   procedureResultSet6()");  
  Connection   conn   =   JDBC_ODBC.getConnection();  
  String   call   =   "{call   pro_Query(?,?)}";  
  CallableStatement   cs   =   conn.prepareCall(call);  
  cs.setString(1,null);  
  cs.setString(2,"PNP9000199");  
  ResultSet   rs   =   cs.executeQuery();  
  while   (rs.next())   {  
  int   index   =   1;  
  while(index   <=   9){  
  //格式化输出.  
  System.out.print(rs.getString(index++)+",");  
  }  
  System.out.println(rs.getString(index));  
  }  
  }   catch   (Exception   ex)   {  
  ex.printStackTrace();  
  }  
  }  
   
   
  /*  
    *   对应例子4  
    */  
  public   static   void   procedureResultSet7()   {  
  try   {  
  System.out.println("in   procedureResultSet7()");  
  Connection   conn   =   JDBC_ODBC.getConnection();  
  String   call   =   "{call   pro_Query(?,?,?,?,?,?,?,?,?,?)}";  
  CallableStatement   cs   =   conn.prepareCall(call);  
  cs.setString(1,null);  
  cs.setString(2,null);  
  cs.setString(3,null);  
  cs.setString(4,null);  
  cs.setString(5,null);  
  cs.setString(6,null);  
  cs.setString(7,null);  
  cs.setString(8,null);  
  cs.setString(9,"box");  
  cs.setString(10,null);  
  ResultSet   rs   =   cs.executeQuery();  
  while   (rs.next())   {  
  int   index   =   1;  
  while(index   <=   9){  
  //格式化输出.  
  System.out.print(rs.getString(index++)+",");  
  }  
  System.out.println(rs.getString(index));  
  }  
  }   catch   (Exception   ex)   {  
  ex.printStackTrace();  
  }  
  }  
   
  到此,程序书写完毕.如果你能够在控制台上得到的结果集与你在查询分析器中的结果一样时,恭喜你,你成功了.如果没有,请检查程序,检查存储过程.Top

33 楼windtree(风树)回复于 2006-03-09 17:01:46 得分 0

大家好,感谢大家对我的帮助,终于做通了,谢谢大家,在此特别感谢TONYBLARED(奔放的犀牛)   ,doway(john),zhh1981(**的猪头)等等好心人。。。。。  
   
   
  散分喽!!!!!!!Top

34 楼xingbozy(3951263)回复于 2006-03-10 09:11:39 得分 0

markTop

35 楼ruanruoshi(软若石)回复于 2006-04-12 15:58:59 得分 0

enTop

相关问题

  • oracle存储过程中如何调用自定义的函数?
  • 怎样在存储过程中调用自定义函数?
  • command调用sqlserver存储过程问题
  • 高手请进 特请邹大侠关注!关于存储过程中解析xml和存储过程调用自定义dll的问题!
  • 怎么会是这样?(PB中调用SQL SERVER自定义存储过程的问题)
  • 如何在Vb中调用sql的那些系统的和自定义的存储过程?
  • 请问,自定义的函数。写在那里?? 再就是在什么地方运行? 可以在存储过程中调用自定义的函数吗?
  • 我看了好多为了高效率分页都调用存储过程自定义分页。可我不想调用存储过程,有没有用代码(c#)的啊。非存储过程
  • 存储过程调用存储过程
  • 调用存储过程的一个怪问题(sqlserver)

关键词

  • 存储过程
  • 数据库
  • 代码
  • sqlserver
  • 查询
  • registeroutparameter
  • varchar
  • cs
  • 参数
  • 调用

得分解答快速导航

  • 帖主:windtree
  • jfy3d
  • zhh1981
  • doway
  • TONYBLARED

相关链接

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

广告也精彩

反馈

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