Oracle存储过程和自定义函数(3)

简单的写下获取数据库连接的工具类

import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; public class DBUtils { // 设定数据库驱动,数据库连接地址端口名称,用户名,密码 private static final String driver = "oracle.jdbc.driver.OracleDriver"; private static final String url = "jdbc:oracle:thin:@ip:xxxx"; private static final String username = "xxxx"; private static final String password = "xxxx"; /** * 注册数据库驱动 */ static { try { Class.forName(driver); } catch (ClassNotFoundException e) { throw new ExceptionInInitializerError(e.getMessage()); } } /** * 获取数据库连接 */ public static Connection getConnection() { try { Connection connection = DriverManager.getConnection(url, username, password); // 成功,返回connection return connection; } catch (SQLException e) { e.printStackTrace(); } // 获取失败,返回null return null; } /** * 释放连接 */ public static void cleanup(Connection conn, Statement st, ResultSet rs) { if (rs != null) { try { rs.close(); } catch (SQLException e) { e.printStackTrace(); } finally { rs = null; } } if (st != null) { try { st.close(); } catch (SQLException e) { e.printStackTrace(); } finally { st = null; } } if (conn != null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } finally { conn = null; } } } } 在应用程序中访问存储过程

根据官方提供的API,我们可以看到:

这里写图片描述

import java.sql.CallableStatement; import java.sql.Connection; import java.sql.SQLException; import org.junit.Test; import com.turing.oracle.dbutil.DBUtils; import oracle.jdbc.OracleTypes; public class TestProcedure { @Test public void callProcedure(){ // {call <procedure-name>[(<arg1>,<arg2>, ...)]} Connection conn = null ; CallableStatement callableStatement = null ; /** * 根据员工姓名,查询员工的全部信息 create or replace procedure QueryStaffInfo(staffName in xgj_test.username%type, pSal out number, pComm out xgj_test.comm%type, pJob out xgj_test.job%type) is begin --查询该员工的薪资,奖金和职位 select t.sal,t.comm,t.job into pSal,pComm,pJob from xgj_test t where t.username=staffName; end QueryStaffInfo; */ // 我们可以看到该存过 4个参数 1个入参 3个出参 String sql = "{call QueryStaffInfo(?,?,?,?)}"; try { // 获取连接 conn = DBUtils.getConnection(); // 通过连接获取到CallableStatement callableStatement = conn.prepareCall(sql); // 对于in 参数,需要赋值 callableStatement.setString(1, "xiao"); // 对于out 参数,需要声明 callableStatement.registerOutParameter(2, OracleTypes.NUMBER); // 第二个 ? callableStatement.registerOutParameter(3, OracleTypes.NUMBER);// 第三个 ? callableStatement.registerOutParameter(4, OracleTypes.VARCHAR);// 第四个 ? // 执行调用 callableStatement.execute(); // 取出结果 int salary = callableStatement.getInt(2); int comm = callableStatement.getInt(3); String job = callableStatement.getString(3); System.out.println(salary + "\t" + comm + "\t" + job); } catch (SQLException e) { e.printStackTrace(); }finally { DBUtils.cleanup(conn, callableStatement, null); } } } 在应用程序中访问存储函数 import java.sql.CallableStatement; import java.sql.Connection; import org.junit.Test; import com.turing.oracle.dbutil.DBUtils; import oracle.jdbc.OracleTypes; public class TestFuction { @Test public void callFuction(){ //{?= call <procedure-name>[(<arg1>,<arg2>, ...)]} Connection conn = null; CallableStatement call = null; /** * create or replace function querySalaryInCome(staffName in varchar2) return number as --定义变量保存员工的工资和奖金 pSalary xgj_test.sal%type; pComm xgj_test.comm%type; begin --查询员工的工资和奖金 select t.sal, t.comm into pSalary, pComm from xgj_test t where t.username = staffName; --直接返回年薪 return pSalary * 12 + nvl(pComm,0); end querySalaryInCome; */ String sql = "{?=call querySalaryInCome(?)}"; try { // 获取连接 conn = DBUtils.getConnection(); // 通过conn获取CallableStatement call = conn.prepareCall(sql); // out 参数,需要声明 call.registerOutParameter(1, OracleTypes.NUMBER); // in 参数,需要赋值 call.setString(2, "gong"); // 执行 call.execute(); // 取出返回值 第一个?的值 double income = call.getDouble(1); System.out.println("该员工的年收入:" + income); } catch (Exception e) { e.printStackTrace(); }finally { DBUtils.cleanup(conn, call, null); } } } 在out参数中访问光标 在out参数中使用光标

我们之前抛出的两个思考问题:

查询员工的所有信息–> out参数太多怎么办?

查询某个部门中所有员工的信息–> out中返回集合?

我们可以通过返回Cursor的方式来实现。

在out参数中使用光标 的步骤:

申明包结构

包头

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/efb321526297e9e1db6054f73eebaa52.html