Java调用Oracle存储过程详解

需积分: 12 15 下载量 58 浏览量 更新于2024-11-18 收藏 5KB TXT 举报
"Java 调用ORCAL(应该是Oracle)存储过程的示例代码" 在Java编程中,调用Oracle数据库的存储过程是常见的任务,这有助于利用数据库的高级功能,如事务处理、复杂的逻辑操作等。Oracle存储过程是由一系列SQL语句和PL/SQL块组成的函数,可以在数据库服务器端执行。下面我们将详细讲解如何在Java中调用Oracle存储过程。 首先,我们来看一个无返回值的Oracle存储过程示例: ```sql 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; ``` 这个存储过程`TESTA`接收两个输入参数`PARA1`和`PARA2`,并将它们插入到`HYQ.B_ID`表中。 接下来,我们展示如何在Java中调用这个存储过程: ```java package com.hyq.src; import java.sql.*; 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 = conn.prepareCall("{call HYQ.TESTA(?,?)}"); proc.setString(1, "100"); // 设置参数1 proc.setString(2, "TestOne"); // 设置参数2 // 执行存储过程 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) { } } } } ``` 这段Java代码中,我们首先加载了Oracle JDBC驱动,然后建立与数据库的连接。接着,我们创建了一个`CallableStatement`对象,用于调用存储过程,并设置了参数。最后,通过`execute()`方法执行存储过程。 如果存储过程有返回值,例如输出参数或返回类型,那么我们需要对`CallableStatement`进行不同的设置。例如,对于一个名为`TESTB`的存储过程,它可能有一个输入参数`PARA1`和一个输出参数`PARA2`,代码会有所不同: ```sql CREATE OR REPLACE PROCEDURE TESTB (PARA1 IN VARCHAR2, PARA2 OUT VARCHAR2) AS BEGIN SELECT I_NAME INTO PARA2 FROM HYQ.TESTTB WHERE I_ID = PARA1; END TESTB; ``` 在Java中调用这个带输出参数的存储过程: ```java CallableStatement cstmt = conn.prepareCall("{call HYQ.TESTB(?,?)}"); cstmt.setString(1, "100"); // 设置输入参数 cstmt.registerOutParameter(2, Types.VARCHAR); // 注册输出参数 cstmt.execute(); String outputValue = cstmt.getString(2); // 获取输出参数值 ``` 在这个例子中,我们使用`registerOutParameter()`方法注册输出参数,指定其数据类型。执行存储过程后,通过`getString()`方法获取输出参数的值。 总结来说,Java通过JDBC的`CallableStatement`接口可以方便地调用Oracle数据库中的存储过程,无论是无返回值还是有返回值的情况。正确设置参数并处理结果,可以充分利用存储过程的功能,提高应用程序的效率和性能。
2010-06-23 上传
注意,以下使用数据库为sql2000,驱动jtds1.2.2 一、调用存储过程(无结果集返回) Connection connection = ConnectionHelper.getConnection(); CallableStatement callableStatement = connection.prepareCall("{ call procedureName(?,?) }"); callableStatement.setString(1, "xxxxxxxx"); callableStatement.setString(2, "xxxxxxxx"); callableStatement.execute(); //获得sql的消息并输出,这个估计很多人都需要 SQLWarning sqlWarning = callableStatement.getWarnings(); while (sqlWarning != null) { System.out.println("sqlWarning.getErrorCode() = " + sqlWarning.getErrorCode()); System.out.println("sqlWarning.getSQLState() = " + sqlWarning.getSQLState()); System.out.println("sqlWarning.getMessage() = " + sqlWarning.getMessage()); sqlWarning = sqlWarning.getNextWarning(); } //close ConnectionHelper.closeConnection(callableStatement, connection); 二、调用存储过程,返回sql类型数据(非记录集) Connection connection = ConnectionHelper.getConnection(); CallableStatement callableStatement = connection.prepareCall("{ call procedureName(?,?,?) }"); callableStatement.setString(1, "xxxxxxxx"); callableStatement.setString(2, "xxxxxxxx"); //重点是这句1 callableStatement.registerOutParameter(3, Types.INTEGER); callableStatement.execute(); //取返回结果,重点是这句2 //int rsCount = callableStatement.getInt(3); //close ConnectionHelper.closeConnection(callableStatement, connection); 三、重点来了,返回记录集,多记录集 注意,不需要注册返回结果参数,只需要在sql中select出结果即可 例如:select * from tableName 即可得到返回结果 Connection connection = ConnectionHelper.getConnection(); CallableStatement callableStatement = connection.prepareCall("{ call procedureName(?) }"); //此处参数与结果集返回没有关系 callableStatement.setString(1, "xxxxxxxx"); callableStatement.execute(); ResultSet resultSet = callableStatement.getResultSet(); //以上两个语句,可以使用ResultSet resultSet = callableStatement.executeQuery();替代 //多结果返回 ResultSet resultSet2; if (callableStatement.getMoreResults()) { resultSet2 = callableStatement.getResultSet(); while (resultSet2.next()) { } } //close ConnectionHelper.closeConnection(callableStatement, connection); 提示:多结果返回可以使用如下代码(以上主要让大家明白,单一结果和多结果的区别): Boolean hasMoreResult = true; while (hasMoreResult) { ResultSet resultSet = callableStatement.getResultSet(); while (resultSet.next()) { } hasMoreResult = callableStatement.getMoreResults(); }