我用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

解决方案 »

  1.   

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

  2.   

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

  3.   

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

  4.   

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

  5.   

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

  6.   

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

  7.   

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

  8.   

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

  9.   

    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);  // 这个数也不可以数错,应该差不多了。 :)
      

  10.   

    楼主可适当参考如下解决方案:
    /**
    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();
    }
    }
      

  11.   

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

  12.   

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

  13.   

    首先感谢大家对我的帮助!可还是有一点不对,我是这样的,我在数据库中定义了一个存储过程。而且也都加上了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请大家帮忙看看哪里不对呀,先谢谢了
      

  14.   

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

  15.   

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

  16.   

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

  17.   

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

  18.   

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

  19.   

    我来跟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();
    }
    }到此,程序书写完毕.如果你能够在控制台上得到的结果集与你在查询分析器中的结果一样时,恭喜你,你成功了.如果没有,请检查程序,检查存储过程.
      

  20.   

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