日期:2014-05-20  浏览次数:20810 次

请问这里面的proc=con.prepareCall("{call updateage(?,?,?)}");是什么意思呀?为什么还要在双引号里面呢?
Java code
import java.util.*;
import java.sql.*;
public class CallProcedure {
    public static void main(String args[]) {   
       String url = "jdbc:odbc:stu";
        Connection con;
        String sql;
        Statement stmt;
        int num;
       String name,sex;
       int age;
        
       try {
          Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
       } catch(java.lang.ClassNotFoundException e) {
           System.err.print("ClassNotFoundException: ");
           System.err.println(e.getMessage());
       }
        try {        
            con = DriverManager.getConnection(url, "system", "system");
            stmt = con.createStatement();            
            //向student表中插入一行录记录            
            Scanner in=new Scanner(System.in);
            System.out.println("\n输入学生的自然信息");
            System.out.println("-----------------------------");
            System.out.print("学号:");
            num=in.nextInt();              
             System.out.print("年龄:");
             age=in.nextInt(); 
             
            CallableStatement proc;
            proc=con.prepareCall("{call updateage(?,?,?)}");
            proc.setInt(1,num);           
            proc.setInt(2,age);            
             
            proc.registerOutParameter(3, Types.VARCHAR);

      proc.execute();
      String varNumber= proc.getString(3);

      System.out.println("返回参数是: "+varNumber);
      if (varNumber.compareTo("0")==0)
         System.out.println("对学号"+num+"更新成功!");
      if (varNumber.compareTo("1")==0)
         System.out.println("年龄偏大,非神童也,嘿嘿~,更新无效呀!");
      if (varNumber.compareTo("2")==0)
          System.out.println("学号"+num+"不存在,更新失败!");
  
          con.commit();
         //关闭连接。
            stmt.close();
            con.close();
         } catch(SQLException ex) {
            System.err.println("SQLException: " + ex.getMessage());
        }          
    }
}




请问这里面的proc=con.prepareCall("{call updateage(?,?,?)}");是什么意思呀?为什么还要在双引号里面呢?
call updateage是什么语法啊?
proc.registerOutParameter(3, Types.VARCHAR);里面按顺序位置 parameterIndex 将 OUT 参数注册为 JDBC 类型 sqlType。不懂是什么意思啊,那个Types.VARCHAR又是什么呀?

------解决方案--------------------
使用语句调用过程,先预编译语句,后给参数,最后那个是JDBC定义的数据类型,对应数据库的相应类型~
------解决方案--------------------
形式是语法要求的,?是存储过程的参数占位符
Types.VARCHAR是数据库的字符串类型,相当于Java的String
------解决方案--------------------
查阅java调用oracle存储过程例子,你就应该明白了
------解决方案--------------------
proc=con.prepareCall("{call updateage(?,?,?)}");
proc.setInt(1,num);
proc.setInt(2,age);
proc.registerOutParameter(3, Types.VARCHAR);
第一句话调用数据库的存储过程。第二和第三句。把两个变量num和age分别替换第一句的第一个和第二个问号。第四句将第三个问号。设置成存储过程的返回参数类型。
proc=con.prepareCall("{call updateage(num,age,Types.VARCHAR)}");

------解决方案--------------------
调用数据库存储过程。

执行结果是返回值表示。

探讨

可是我还是有点小疑问,它设置返回参数类型干什么呀?

------解决方案--------------------
Java code
proc.registerOutParameter(3, Types.VARCHAR);