java调用存储过程的3种方式

来源:互联网 发布:淘宝just hype是正品吗 编辑:程序博客网 时间:2024/05/17 02:54

 这段时间开始学习写存储过程,主要原因还是因为工作需要吧,本来以为很简单的,但几经挫折,豪气消磨殆尽,但总算搞通了,为了避免后来者少走弯路,特记述与此,同时亦对自己进行鼓励。
一:无返回值的存储过程
存储过程为:

  1. CREATE OR REPLACE PROCEDURE TESTA(PARA1 IN VARCHAR2,PARA2 IN VARCHAR2)  AS
  2. BEGIN 
  3.    INSERT INTO HYQ.B_ID (I_ID,I_NAME) VALUES (PARA1, PARA2);
  4. END TESTA;

然后呢,在java里调用时就用下面的代码:


 

  1. package com.hyq.src;
  2. import java.sql.*;
  3. import java.sql.ResultSet;
  4. public class TestProcedureOne {
  5.   public TestProcedureOne() {
  6.   }
  7.   public static void main(String[] args ){
  8.     String driver = "oracle.jdbc.driver.OracleDriver";
  9.     String strUrl = "jdbc:oracle:thin:@127.0.0.1:1521: hyq ";
  10.     Statement stmt = null;
  11.     ResultSet rs = null;
  12.     Connection conn = null;
  13.     CallableStatement cstmt = null;
  14.     try {
  15.       Class.forName(driver);
  16.       conn =  DriverManager.getConnection(strUrl, " hyq "" hyq ");
  17.       CallableStatement proc = null;
  18.       proc = conn.prepareCall("{ call HYQ.TESTA(?,?) }");
  19.       proc.setString(1"100");
  20.       proc.setString(2"TestOne");
  21.       proc.execute();
  22.     }
  23.     catch (SQLException ex2) {
  24.       ex2.printStackTrace();
  25.     }
  26.     catch (Exception ex2) {
  27.       ex2.printStackTrace();
  28.     }
  29.     finally{
  30.       try {
  31.         if(rs != null){
  32.           rs.close();
  33.           if(stmt!=null){
  34.             stmt.close();
  35.           }
  36.           if(conn!=null){
  37.             conn.close();
  38.           }
  39.         }
  40.       }
  41.       catch (SQLException ex1) {
  42.       }
  43.     }
  44.   }
  45. }

当然了,这就先要求要建张表TESTTB,里面两个字段(I_ID,I_NAME)。

二:有返回值的存储过程(非列表)

存储过程为:

  1. CREATE OR REPLACE PROCEDURE TESTB(PARA1 IN VARCHAR2,PARA2 OUT VARCHAR2)  AS
  2. BEGIN 
  3.    SELECT INTO PARA2 FROM TESTTB WHERE I_ID= PARA1; 
  4. END TESTB;

在java里调用时就用下面的代码:

  1. package com.hyq.src;
  2. public class TestProcedureTWO {
  3.   public TestProcedureTWO() {
  4.   }
  5.   public static void main(String[] args ){
  6.     String driver = "oracle.jdbc.driver.OracleDriver";
  7.     String strUrl = "jdbc:oracle:thin:@127.0.0.1:1521:hyq";
  8.     Statement stmt = null;
  9.     ResultSet rs = null;
  10.     Connection conn = null;
  11.     try {
  12.       Class.forName(driver);
  13.       conn =  DriverManager.getConnection(strUrl, " hyq "" hyq ");
  14.       CallableStatement proc = null;
  15.       proc = conn.prepareCall("{ call HYQ.TESTB(?,?) }");
  16.       proc.setString(1"100");
  17.       proc.registerOutParameter(2, Types.VARCHAR);
  18.       proc.execute();
  19.       String testPrint = proc.getString(2);
  20.       System.out.println("=testPrint=is="+testPrint);
  21.     }
  22.     catch (SQLException ex2) {
  23.       ex2.printStackTrace();
  24.     }
  25.     catch (Exception ex2) {
  26.       ex2.printStackTrace();
  27.     }
  28.     finally{
  29.       try {
  30.         if(rs != null){
  31.           rs.close();
  32.           if(stmt!=null){
  33.             stmt.close();
  34.           }
  35.           if(conn!=null){
  36.             conn.close();
  37.           }
  38.         }
  39.       }
  40.       catch (SQLException ex1) {
  41.       }
  42.     }
  43.    }
  44.   }
  45. }

注意,这里的proc.getString(2)中的数值2并非任意的,而是和存储过程中的out列对应的,如果out是在第一个位置,那就是proc.getString(1),如果是第三个位置,就是proc.getString(3),当然也可以同时有多个返回值,那就是再多加几个out参数了。

三:返回列表
由于oracle存储过程没有返回值,它的所有返回值都是通过out参数来替代的,列表同样也不例外,但由于是集合,所以不能用一般的参数,必须要用pagkage了.所以要分两部分,
1,  建一个程序包。如下:

  1. CREATE OR REPLACE PACKAGE TESTPACKAGE  AS
  2.  TYPE Test_CURSOR IS REF CURSOR;
  3. end TESTPACKAGE;

2,建立存储过程,存储过程为:

  1. CREATE OR REPLACE PROCEDURE TESTC(p_CURSOR out TESTPACKAGE.Test_CURSOR) IS 
  2. BEGIN
  3.     OPEN p_CURSOR FOR SELECT * FROM HYQ.TESTTB;
  4. END TESTC;

可以看到,它是把游标(可以理解为一个指针),作为一个out 参数来返回值的。
在java里调用时就用下面的代码:


 

  1. package com.hyq.src;
  2. import java.sql.*;
  3. import java.io.OutputStream;
  4. import java.io.Writer;
  5. import java.sql.PreparedStatement;
  6. import java.sql.ResultSet;
  7. import oracle.jdbc.driver.*;
  8. public class TestProcedureTHREE {
  9.   public TestProcedureTHREE() {
  10.   }
  11.   public static void main(String[] args ){
  12.     String driver = "oracle.jdbc.driver.OracleDriver";
  13.     String strUrl = "jdbc:oracle:thin:@127.0.0.1:1521:hyq";
  14.     Statement stmt = null;
  15.     ResultSet rs = null;
  16.     Connection conn = null;
  17.     try {
  18.       Class.forName(driver);
  19.       conn =  DriverManager.getConnection(strUrl, "hyq""hyq");
  20.       CallableStatement proc = null;
  21.       proc = conn.prepareCall("{ call hyq.testc(?) }");
  22.       proc.registerOutParameter(1,oracle.jdbc.OracleTypes.CURSOR);
  23.       proc.execute();
  24.       rs = (ResultSet)proc.getObject(1);
  25.       while(rs.next())
  26.       {
  27.           System.out.println("<tr><td>" + rs.getString(1) + "</td><td>"+rs.getString(2)+"</td></tr>");
  28.       }
  29.     }
  30.     catch (SQLException ex2) {
  31.       ex2.printStackTrace();
  32.     }
  33.     catch (Exception ex2) {
  34.       ex2.printStackTrace();
  35.     }
  36.     finally{
  37.       try {
  38.         if(rs != null){
  39.           rs.close();
  40.           if(stmt!=null){
  41.             stmt.close();
  42.           }
  43.           if(conn!=null){
  44.             conn.close();
  45.           }
  46.         }
  47.       }
  48.       catch (SQLException ex1) {
  49.       }
  50.     }
  51.   }
  52. }

在这里要注意,在执行前一定要先把oracle的驱动包放到class路径里,否则会报错的。