CallableStatement cstmt = conn.prepareCall("{?=call client_no(?,?)}");
     cstmt.registerOutParameter(1,Types.VARCHAR,n);
     cstmt.setString(2,"1203");
     cstmt.execute();
////////////////////////////////////////////////
2、cstmt.registerOutParameter(1,Types.VARCHAR,n);
   和
   cstmt.setString(2,"1203");
   到底有什么区别?你的第一个参数是调用存储过程返回的结果,cstmt.registerOutParameter(1,Types.VARCHAR,n);是声明其对象类型是返回varchar字符串类型
cstmt.setString(2,"1203");是设置存储过程调用参数(第一个),和普通的查询没有什么不同我认为你的程序报错,是因为没有设定调用存储过程的第二个参数所至
添加cstmt.setString(3,"22");//后面的字符串随你的需要,赋""也行

解决方案 »

  1.   

    cstmt.setString(2,"1203");  “2”表示是传给存储过程的第二个参数吗?
    你的("{?=call client_no(?,?)}");这个调用有3个?
    所以我想上面应该是传递给存储过程的第一个参数,第二个参数没有传入,故报类型错误
      

  2.   

    谢谢绿色咖啡
    ("{?=call client_no(?,?)}");我刚才查到一片资料
    说?=表示有返回值的参数,我这样写,是表示有3个参数吗?是这样吗?
      

  3.   

    我的存储过程一共有两个参数,其中一个是 in
    另一个是 in out
    我的("{?=call client_no(?,?)}");这样写对吗?
    "?"到底怎么和我的存储过程重参数对应?
      

  4.   

    我没有用过("{?=call client_no(?,?)}");这种方式调用过存储过程,常用的方法应该没有前面的?=,所以我也不知道你这种调用是否合理 :-)
    给你些语句参考:
    //准备SQL语句 
    strSQL = "{call sp_jsptest(?,?)}"; 
    //准备可调用语句对象 
    sqlStmt = sqlCon.prepareCall(strSQL); 
    //设置输入参数 
    sqlStmt.setString(1,strName); 
    //登记输出参数 
    sqlStmt.registerOutParameter(2,java.sql.Types.Array); 
    //执行该存储过程并返回结果集
    sqlRst = sqlStmt.executeQuery(); 
    //获取来自结果集中的数据 
    sqlRst.next(); 
    strWelcome = sqlRst.getString(1); 
    //获取输出参数的值 
    java.sql.Array strMyName = sqlStmt.getString(2);
      

  5.   

    尝试改成如下试试看:
    CallableStatement cstmt = conn.prepareCall("{call client_no(?,?)}");
    cstmt.setString(1,"1203");
    cstmt.registerOutParameter(2,Types.VARCHAR);
    cstmt.execute();
    String str = sqlStmt.getString(2);
    看看str是否能正常接收到存储过程的输出参数(就是第二个)
      

  6.   

    谢谢!我从网上找了资料,
    确实有这样的("{?=call client_no(?,?)}");形式
    大致意思是存储过程有返回值时要用这样的形式,不过这些资料好像
    说得概念也不太清楚,我再试试!
    非常感谢
      

  7.   

    我想你这个应该是调用函数即fuction的……
    你此处需要调用的是存储过程procedure……
      

  8.   

    我只是随便说说拉
    毕竟我没有尝试过("{?=call client_no(?,?)}");这样调用的说
    如果网上有实例,那么应该是可以的说
    参考看看:
    http://class.gzrail.net/read.php?classid=140
      

  9.   

    谢谢 alphazhao(绿色咖啡) 
       我试了CallableStatement cstmt = conn.prepareCall("{call client_no(?,?)}"); , 其实也可以返回值,多谢你的帮助!
       下面是我看到的资料,但是我没能是成功,多半是我还没有理解("{?=call client_no(?,?)}");的使用方法.
       再一次感谢!
       http://www.fanqiang.com/a4/b5/20010530/180801279.html
                   ATCG
      

  10.   

    cstmt = conn.prepareCall("{?=call client_no (?,?)}");                    
    cstmt .registerOutParameter(1,java.sql.Types.Types.VARCHAR);
                        cstmt .setString(2,"sdfa");
                        cstmt .setInt(3,2);
                        cstmt .executeUpdate();
                        result = cstmt .getString(1);是这么用的,我的运行正常.
      

  11.   

    to  fastmask(我心烦) 
       谢谢!能解释一下每句的含义吗?你的程序里有三个“?"
    ?= 是不是对应 1,若我的存储过程有两个参数,其中一个是IN,另一个
    是INOUT的,那么你的程序的 ? 应该怎么和我的存储过程的参数来对应呢?
    谢谢!
      

  12.   

    ?是作为参数,从1开始编号.是输出的就用registerOutParameter,是输入的就用setXXX了.我给你的是从返回值中获取数据(即是?=的那个?号),你的两个作为参数的话.应该是这样的.
    cstmt = conn.prepareCall("{call client_no (?,?)}");                    
    cstmt .registerOutParameter(1,java.sql.Types.Types.VARCHAR);
                        cstmt .setString(2,"sdfa");
                        cstmt .executeUpdate();
                        result = cstmt .getString(1);
      

  13.   

    谢谢! fastmask(我心烦) 那你这样写是不是表示有三个参数
    cstmt = conn.prepareCall("{?=call client_no (?,?)}");
                               1                 2 3是这样吗?按照下面的写法不也是可以取得返回值吗?
    cstmt = conn.prepareCall("{call client_no (?,?)}");         
    cstmt .registerOutParameter(1,java.sql.Types.Types.VARCHAR);
                        cstmt .setString(2,"sdfa");
                        cstmt .executeUpdate();
                        result = cstmt .getString(1);这两者有什么区别?
      

  14.   

    Oracle中后台的存储过程就有fucntion(函数)和procedure(过程)之分。
    其中function是通过第一种方式获取返回值:
    ?=call client_no (?,?)。
    因为function的是通过return语句返回结果的。
    而procedure是没有return语句的。因此只有通过out类型的参数来返回结果,但通过这种方式可以返回多个结果(多定义几个out参数就可以),这是function不能实现的。
    因此procedure的调用就是通过call client_no (?,?)。所以再调用存储过程前先要了解它的具体类型。