当前位置:首页 > 开发 > 编程语言 > Hibernate > 正文

Java调用存储过程的三种方式(包含通过hibernate调用)

发表于: 2010-06-23   作者:120153216   来源:转载   浏览:
摘要: 创建需要的测试表:create table Test(tid varchar2(10),tname varchar2(10)); 一:无返回值的存储过程 存储过程为: CREATE OR REPLACE PROCEDURE TESTA(PARA1 IN VARCHAR2,PARA2 IN VARCHAR2) AS BEGIN INSERT INTO H
创建需要的测试表:create table Test(tid varchar2(10),tname varchar2(10));

一:无返回值的存储过程 

存储过程为: 

CREATE OR REPLACE PROCEDURE TESTA(PARA1 IN VARCHAR2,PARA2 IN VARCHAR2)  AS 

BEGIN 

   INSERT INTO HYQ.B_ID (I_ID,I_NAME) VALUES (PARA1, PARA2); 

END TESTA; 

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

package com.hyq.src; 

  

import java.sql.*; 

import java.sql.ResultSet; 

  

public class TestProcedureOne { 

  public TestProcedureOne() { 

  } 

  public static void main(String[] args ){ 

    String driver = "oracle.jdbc.driver.OracleDriver"; 

    String strUrl = "jdbc:oracle:thin:@127.0.0.1:1521: hyq "; 

    Statement stmt = null; 

    ResultSet rs = null; 

    Connection conn = null; 

    CallableStatement cstmt = null; 

  

    try { 

      Class.forName(driver); 

      conn =  DriverManager.getConnection(strUrl, " hyq ", " hyq "); 

      CallableStatement proc = null; 

      proc = conn.prepareCall("{ call HYQ.TESTA(?,?) }"); 

      proc.setString(1, "100"); 

      proc.setString(2, "TestOne"); 

      proc.execute(); 

    } 

    catch (SQLException ex2) { 

      ex2.printStackTrace(); 

    } 

    catch (Exception ex2) { 

      ex2.printStackTrace(); 

    } 

    finally{ 

      try { 

        if(rs != null){ 

          rs.close(); 

          if(stmt!=null){ 

            stmt.close(); 

          } 

          if(conn!=null){ 

            conn.close(); 

          } 

        } 

      } 

      catch (SQLException ex1) { 

      } 

    } 

  } 

} 

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

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

存储过程为: 

CREATE OR REPLACE PROCEDURE TESTB(PARA1 IN VARCHAR2,PARA2 OUT VARCHAR2)  AS 

BEGIN 

   SELECT INTO PARA2 FROM TESTTB WHERE I_ID= PARA1; 

END TESTB; 

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

package com.hyq.src; 

  

public class TestProcedureTWO { 

  public TestProcedureTWO() { 

  } 

  public static void main(String[] args ){ 

    String driver = "oracle.jdbc.driver.OracleDriver"; 

    String strUrl = "jdbc:oracle:thin:@127.0.0.1:1521:hyq"; 

    Statement stmt = null; 

    ResultSet rs = null; 

    Connection conn = null; 

    try { 

      Class.forName(driver); 

      conn =  DriverManager.getConnection(strUrl, " hyq ", " hyq "); 

      CallableStatement proc = null; 

      proc = conn.prepareCall("{ call HYQ.TESTB(?,?) }"); 

      proc.setString(1, "100"); 

      proc.registerOutParameter(2, Types.VARCHAR); 

      proc.execute(); 

      String testPrint = proc.getString(2); 

      System.out.println("=testPrint=is="+testPrint); 

    } 

    catch (SQLException ex2) { 

      ex2.printStackTrace(); 

    } 

    catch (Exception ex2) { 

      ex2.printStackTrace(); 

    } 

    finally{ 

      try { 

        if(rs != null){ 

          rs.close(); 

          if(stmt!=null){ 

            stmt.close(); 

          } 

          if(conn!=null){ 

            conn.close(); 

          } 

        } 

      } 

      catch (SQLException ex1) { 

      } 

    } 

  } 

} 

  

} 

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

三:返回列表 

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

1,  建一个程序包。如下: 

CREATE OR REPLACE PACKAGE TESTPACKAGE   AS 

  TYPE Test_CURSOR IS REF CURSOR; 

end TESTPACKAGE; 

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

CREATE OR REPLACE PROCEDURE TESTC (p_CURSOR out TESTPACKAGE.Test_CURSOR) IS 

BEGIN 

    OPEN p_CURSOR FOR SELECT * FROM HYQ.TESTTB; 

END TESTC; 

可以看到,它是把游标(可以理解为一个指针),作为一个 out 参数来返回值的。 

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

package com.hyq.src; 

import java.sql.*; 

import java.io.OutputStream; 

import java.io.Writer; 

import java.sql.PreparedStatement; 

import java.sql.ResultSet; 

import oracle.jdbc.driver.*; 

  

  

public class TestProcedureTHREE { 

  public TestProcedureTHREE() { 

  } 

  public static void main(String[] args ){ 

    String driver = "oracle.jdbc.driver.OracleDriver"; 

    String strUrl = "jdbc:oracle:thin:@127.0.0.1:1521:hyq"; 

    Statement stmt = null; 

    ResultSet rs = null; 

    Connection conn = null; 

  

    try { 

      Class.forName(driver); 

      conn =  DriverManager.getConnection(strUrl, "hyq", "hyq"); 

  

      CallableStatement proc = null; 

      proc = conn.prepareCall("{ call hyq.testc(?) }"); 

      proc.registerOutParameter(1,oracle.jdbc.OracleTypes.CURSOR); 

      proc.execute(); 

      rs = (ResultSet)proc.getObject(1); 

  

      while(rs.next()) 

      { 

          System.out.println("<tr><td>" + rs.getString(1) + "</td><td>"+rs.getString(2)+"</td></tr>"); 

      } 

    } 

    catch (SQLException ex2) { 

      ex2.printStackTrace(); 

    } 

    catch (Exception ex2) { 

      ex2.printStackTrace(); 

    } 

    finally{ 

      try { 

        if(rs != null){ 

          rs.close(); 

          if(stmt!=null){ 

            stmt.close(); 

          } 

          if(conn!=null){ 

            conn.close(); 

          } 

        } 

      } 

      catch (SQLException ex1) { 

      } 

    } 

  } 

} 

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

this.pnumberManager.getHibernateTemplate().execute( 
 newHibernateCallback()...{ 
publicObjectdoInHibernate(Sessionsession) 
throwsHibernateException,SQLException...{ 
CallableStatementcs=session.connection().prepareCall("{callmodifyapppnumber_remain(?)}"); 
cs.setString(1,foundationid); 
cs.execute(); 
returnnull; 
} 
}); 

 

Java调用存储过程的三种方式(包含通过hibernate调用)

  • 0

    开心

    开心

  • 0

    板砖

    板砖

  • 0

    感动

    感动

  • 0

    有用

    有用

  • 0

    疑问

    疑问

  • 0

    难过

    难过

  • 0

    无聊

    无聊

  • 0

    震惊

    震惊

推荐文章
编辑推荐
版权所有 IT知识库 CopyRight © 2009-2015 IT知识库 IT610.com , All Rights Reserved. 京ICP备09083238号