`
120153216
  • 浏览: 62007 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

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

    博客分类:
  • java
阅读更多
创建需要的测试表: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调用存储过程的三种方法

    本文将详细介绍使用Java调用存储过程的三种方法:通过Hibernate框架、使用JDBC原生方式以及结合Hibernate的SQLQuery接口。 #### 一、通过Hibernate框架调用存储过程 Hibernate是一个非常流行的Java持久化框架,它...

    hibernate query调用oracle存储过程

    而Hibernate作为一种流行的Java持久化框架,它允许开发者通过ORM(对象关系映射)方式与数据库进行交互。本篇文章将深入探讨如何使用Hibernate的Query接口来调用Oracle的存储过程和函数,以及提供相关的示例代码和...

    Java调用oracle存储过程通过游标返回临时表

    总的来说,Java调用Oracle存储过程并通过游标返回临时表是一种常见的数据处理方式,它结合了数据库的强大功能和Java的灵活性,为复杂业务场景提供了高效解决方案。在处理大量数据时,正确地管理和使用游标至关重要,...

    hibernate框架调用存储过程

    本篇文章将深入探讨如何在Hibernate框架中调用存储过程,并与JDBC调用存储过程的方式进行比较。 首先,我们要了解存储过程是什么。存储过程是预编译的SQL语句集合,存储在数据库服务器中,可被多次调用,减少了网络...

    hibernate调用存储过程

    然而,有时我们需要执行更复杂的SQL任务,如存储过程,这时就需要了解如何通过Hibernate来调用存储过程。下面将详细解释Hibernate调用存储过程的相关知识点。 1. **存储过程的概念** 存储过程是预编译的SQL语句...

    hibernate调用存储过程具体方法

    hibernate本对数据库的操作有些不完美,有必要的时候可以调用存储过程来补足。

    hibernate调用存储过程的方法调用

    本文将深入探讨如何使用Hibernate调用存储过程,并结合提供的资源文件——`proc.sql`、`hibernateProc.sql`和`hibernateProc.java`,来阐述具体的操作步骤和注意事项。 首先,我们理解存储过程的意义。存储过程可以...

    java-hibernate调用mysql过程和函数的方式知识.pdf

    调用 MySQL 过程和函数是 Java-Hibernate 框架中的一种重要技术,通过使用 CallableStatement 对象和 registerOutParameter() 方法,我们可以轻松地调用 MySQL 中的过程和函数,从而实现复杂的业务逻辑。

    使用hibernate调用oracle的存储过程

    在hibernate中调用oracle中的存储过程的详细代码。可以借鉴使用,帮助学习。

    Hibernate 调用存储过程

    ### Hibernate调用存储过程详解 #### 一、建立存储过程 在进行Hibernate调用存储过程之前,首先需要在数据库中创建存储过程。本例中创建了一个名为`getUserInfo`的简单存储过程,其功能是从`user`表中选择所有记录...

    hibernate存储过程

    综上所述,Hibernate调用存储过程是一种常见的做法,它允许开发者充分利用数据库的功能,同时保持应用的灵活性。理解如何在Hibernate中操作存储过程对于Java开发人员来说是必备技能之一。通过实践和学习,你可以更...

    hibernate环境搭建已经对应存储过程调用

    例如,你可以使用以下代码片段来调用存储过程: ```java Session session = sessionFactory.openSession(); session.doWork(new Work() { @Override public void execute(Connection connection) throws ...

    JAVA调用存储过程

    综上所述,Java调用存储过程涉及到JDBC API的使用,包括建立连接、创建CallableStatement、设置和获取参数、执行存储过程以及关闭资源。熟练掌握这些步骤对于进行数据库交互的Java开发至关重要。

    Hibernate3调用存储过程用法

    它允许我们编写原生的SQL语句,包括调用存储过程,然后映射结果到Java对象。 三、具体步骤 1. **创建SQL查询** 使用Session的createSQLQuery方法,传入存储过程的调用语句。例如: ```java Session session = ...

    Hibernate存储过程的调用

    #### 三、Hibernate调用存储过程的方法 在Hibernate中调用存储过程通常有两种方式:通过`Query`接口或使用`StoredProcedureQuery`。这里我们主要介绍使用`StoredProcedureQuery`的方式,因为这种方式更适合处理复杂...

    存储过程- 06.在应用程序中调用存储过程

    - **ORM框架**:Object-Relational Mapping(ORM)框架如Hibernate和Entity Framework也支持调用存储过程,开发者可以在ORM的映射配置中指定存储过程,然后在代码中像调用普通方法一样调用它。 3. **参数传递** -...

    java-hibernate调用mysql过程和函数的方式[归类].pdf

    下面将详细介绍如何在Java中利用Hibernate调用MySQL的存储过程和函数。 首先,我们需要理解CallableStatement接口,它是PreparedStatement的子接口,用于执行SQL存储过程。在Java中,我们通常使用CallableStatement...

    spring hibernate执行存储过程的例子

    结合Spring和Hibernate,你可以在Spring的Service层使用Hibernate的Session来调用存储过程,或者在Repository层通过JdbcTemplate或NamedParameterJdbcTemplate进行调用。具体选择哪种方式取决于你的项目结构和需求。...

Global site tag (gtag.js) - Google Analytics