proceduretests.java

来自「weblogic应用全实例」· Java 代码 · 共 221 行

JAVA
221
字号
//声明本类包含在包examples.jdbc.mssqlserver4中
package examples.jdbc.mssqlserver4;
//声明本类要引入的其他包和类
import java.io.*;
import java.sql.*;
import java.util.Properties;

/** 这个实例演示怎样创建、调用和清除Microsoft SQL Server.的存储过程。
 */
public class ProcedureTests
{
  public static void main(String [] args)
  {
      // 设置用户名、密码和服务器名
      Properties props = new Properties();
      props.put("user", "sa");
      props.put("password", "secret");
      props.put("server", "myHOST:1433");
	//声明驱动变量、连接、声明和CallableStatement声明
      Driver myDriver = null;
      java.sql.Connection conn         = null;
      java.sql.Statement stmt          = null;
      java.sql.CallableStatement cstmt = null;

    try
      {
      //设置驱动程序名weblogic.jdbc.mssqlserver4.Driver
        String driverName = "weblogic.jdbc.mssqlserver4.Driver";
 
        // 设置数据库url
        String url = "jdbc:weblogic:mssqlserver4";    

        System.out.println("\n\n存储过程测试...\n");

        // 实例驱动程序,建立连接
        myDriver = (Driver) Class.forName(driverName).newInstance();
        conn = myDriver.connect(url, props);   

        System.out.println("用建立连接 " + url + " 为 " + conn + "\n");

        /*
          用SQL文本创建存储过程:

          procedure simpleProcedure(@par1 varchar(255) output, 
          @par2 varchar(255) output, @par3 varchar(255)) as
          select @par1 = @par1 + ' plus something'
          select @par2 = @par3 + ' plus something different'
          return 5 */
        try
          {
          //SQL语句
            String sql = "创建过程 simpleProcedure"
              + "(@par1 varchar(255) output, @par2 varchar(255) output, @par3 varchar(255)) as\n"
              + "select @par1 = @par1 + ' plus something'\n"
              + "select @par2 = @par3 + ' plus something different'\n"
              + "return 5\n";
		
            System.out.println("创建simpleProcedure. SQL语句:\n\n" + sql);
	//创建SQL语句对象	
            stmt = conn.createStatement();
        //执行SQL语句
            stmt.execute(sql);
            System.out.println("存储过程已创建.\n");
         //关闭
            stmt.close();
          } catch(SQLException sqle) {
          //异常处理
              System.out.println("过程没有创建,因为 " + sqle);
          }

        try
          {
            // 用一个结果和三个参数调用存储过程
            System.out.println("调用simpleProcedure,只有结果...\n");
		
            cstmt = conn.prepareCall("{?= call simpleProcedure(?,?,?)}"); 
		//注册输出参数
            cstmt.registerOutParameter(1,Types.INTEGER);     // 参数1
            cstmt.registerOutParameter(2,Types.VARCHAR);     // 参数2
            cstmt.setString(2,"Some text");                  // 设置参数2值
            cstmt.registerOutParameter(3,Types.VARCHAR);     // 设置参数3
            
            cstmt.setString(4,"3.14159265358979312"); // 参数4
            // 执行
            cstmt.execute();

            // 注意在我们用get方法获得输出参数之前,要知道SQL结果的更新次数,我们调用dumpResults
            // 方法,它跳过这些结果,这不是我们关心的。
            
            // 清空结果次数和结果集,我们只测试过程参数
            dumpResults(cstmt); 
            //打印结果
            System.out.println("Procedure result is: " + cstmt.getInt(1));
            System.out.println("Procedure @par1 is '" + cstmt.getString(2) + "'");
            System.out.println("Procedure @par2 is '" + cstmt.getString(3) + "'\n");
            //关闭
            cstmt.close();
          } catch(SQLException sqle) {
          //异常处理
              System.out.println("调用过程失败,因为 " + sqle);
          }

        try
          {
            // 用一个结果和三个参数调用存储过程
            System.out.println("用3个参数和一个结果调用simpleProcedure...\n");

            cstmt = conn.prepareCall("{?= call simpleProcedure(?,?,?)}"); 

            cstmt.registerOutParameter(1,Types.INTEGER);     // 参数 1
            cstmt.registerOutParameter(2,Types.VARCHAR);     // 参数 2
            cstmt.setString(2,"Some text");                  // 参数 2
            // 设置参数3
            cstmt.registerOutParameter(3,Types.VARCHAR); 
            cstmt.setString(4,"3.14159265358979312");        // 设置参数4
		//执行
            cstmt.execute();

            // 在我们用get方法获取输出参数前,要知道SQL结果的更新次数,我们调用dumpResults
            // 方法,它跳过这些结果,这不是我们关心的。
            
            // 清空结果次数和结果集,我们只测试过程参数
            dumpResults(cstmt); 
            //打印结果
            System.out.println("Procedure result is: " + cstmt.getInt(1));
            System.out.println("Procedure @par1 is '" + cstmt.getString(2) + "'");
            System.out.println("Procedure @par2 is '" + cstmt.getString(3) + "'\n");
            //关闭
            cstmt.close();
          } catch(SQLException sqle) {
          //异常处理
              System.out.println("Failed while calling the procedure because " + sqle);
          }

        try
          {
            // 用一个结果和三个参数调用存储过程. 其中一个参数来自流
            System.out.println("用3个参数没有结果创建simpleProcedure...\n");

            cstmt = conn.prepareCall("{call simpleProcedure(?,?,?)}"); 

            // 参数1是可输入和输出的
            cstmt.registerOutParameter(1,Types.VARCHAR); 
            //声明和实例字符串流
            StringBufferInputStream stream = 
              new StringBufferInputStream("Some text coming from a stream");

            // 使用字符串流
            cstmt.setAsciiStream(1,stream,stream.available()); 

            // 参数2是可输出的,它返回@par3 + some string.
            cstmt.registerOutParameter(2,Types.VARCHAR); 

            // 参数3是可输入的, (没有OUT和返回值
            cstmt.setString(3,"something"); 
		//执行
            cstmt.execute();

            // 清空结果
            dumpResults(cstmt);                                      
            //打印结果
            System.out.println("Procedure @par1 is '" + cstmt.getString(1) + "'");
            System.out.println("Procedure @par2 is '" + cstmt.getString(2) + "'\n");
            //关闭
            cstmt.close();
          } catch(SQLException sqle) {
          //异常处理
              System.out.println("调用过程失败,因为 " + sqle);
          }

        // 从数据库中删除存储过程
        try
          {
            stmt = conn.createStatement(); 
            // 如果过程没定义,这个操作失败
            stmt.execute("删除过程simpleProcedure");            
            //关闭
            stmt.close();
            System.out.println("过程从数据库中删除.\n");
          } catch(SQLException sqle) { }
         //异常处理
      } catch(Exception e) {
          System.out.println("An exception was raised " + e);
      } finally { //关闭所有的连接,声明等
          try { 
            if (conn != null)
              conn.close();
            if (stmt != null)
              stmt.close();
            if (cstmt != null)
              cstmt.close();
           } catch (SQLException sqle) {
           //异常处理
               System.out.println("SQLException was thrown: " + sqle.getMessage());
           }
      }

    System.out.println("\n\n(press Enter to exit)");

    try { System.in.read(); }
    catch (IOException e) { return; }
  }

  /** 
   * 清空
   * @param statement, 执行语句
   */
  static void dumpResults(Statement statement) throws SQLException
  {
    for(boolean hasMore = true ; hasMore ; )
      {
        ResultSet resultSet = statement.getResultSet();

        if(statement.getMoreResults() == false)
          {
            hasMore = (statement.getUpdateCount() != -1);
          }
      }
  }
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?