Oracle系列:(33)JDBC访问Oracle的存储过程和存储函数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle系列:(33)JDBC访问Oracle的存储过程和存储函数相关的知识,希望对你有一定的参考价值。
1、存储过程
1.1、准备SQL
-- 定义存储过程 create or replace procedure get_rax(salary in number,rax out number) as --需要交税的钱 bal number; begin bal := salary - 3500; if bal<=1500 then rax := bal * 0.03 - 0; elsif bal<=4500 then rax := bal * 0.1 - 105; elsif bal<=9000 then rax := bal * 0.2 - 555; elsif bal<=35000 then rax := bal * 0.25 - 1005; elsif bal<=55000 then rax := bal * 0.3 - 2755; elsif bal<=80000 then rax := bal * 0.35 - 5505; else rax := bal * 0.45 - 13505; end if; end; / set serveroutput on; -- 调用存储过程 declare sal number := &salary; rax number; begin get_rax(sal,rax); dbms_output.put_line(sal || ‘元工资应该交税‘ || rax || ‘元‘); end; /
1.2、准备JAR包
oracle | ojdbc5.jar |
c3p0 | c3p0-0.9.1.2.jar c3p0-config.xml |
c3p0-config.xml
<c3p0-config> <default-config> <property name="jdbcUrl">jdbc:oracle:thin:@127.0.0.1:1521:orcl</property> <property name="driverClass">oracle.jdbc.driver.OracleDriver</property> <property name="user">scott</property> <property name="password">tiger</property> <property name="initialPoolSize">3</property> <property name="maxPoolSize">6</property> <property name="maxIdleTime">1000</property> </default-config> </c3p0-config>
1.3、编写工具类
JDBCUtils.java
package com.rk.utils; import java.sql.Connection; import com.mchange.v2.c3p0.ComboPooledDataSource; public class JDBCUtils { private static ComboPooledDataSource dataSource = new ComboPooledDataSource(); public static Connection getConnection() throws Exception{ return dataSource.getConnection(); } public static void closeQuietly(AutoCloseable ac){ if(ac != null){ try { ac.close(); } catch (Exception e) { e.printStackTrace(); } } } }
1.4、JDBC程序调用存储过程
CallProc.java
package com.rk.test; import java.sql.CallableStatement; import java.sql.Connection; import java.sql.Types; import com.rk.utils.JDBCUtils; /** * 演示java-jdbc调用oracle过程 */ public class CallProc { public static void main(String[] args) throws Exception{ String sql = "{call get_rax(?,?)}"; Connection conn = JDBCUtils.getConnection(); CallableStatement cstmt = conn.prepareCall(sql); //为第一个?号设置值,从1开始 cstmt.setInt(1, 7000); //为第二个?注册输出类型 cstmt.registerOutParameter(2, Types.INTEGER); //执行调用过程 cstmt.execute(); //接收过程的返回值,即第二个?号 int rax = cstmt.getInt(2); //显示 System.out.println("7000元工资应该交税"+rax+"元"); JDBCUtils.closeQuietly(cstmt); JDBCUtils.closeQuietly(conn); } }
2、存储函数
2.1、准备SQL
--定义函数 create or replace function findEmpNameAndJobAndSal(pempno in number,pjob out varchar2,psal out number) return varchar2 as pename emp.ename%type; begin select ename,job,sal into pename,pjob,psal from emp where empno = pempno; return pename; end; / --调用函数 declare pename emp.ename%type; pjob emp.job%type; psal emp.sal%type; begin pename := findEmpNameAndJobAndSal(7788,pjob,psal); dbms_output.put_line(‘7788‘||‘--‘||pename||‘--‘||pjob||‘--‘||psal); end; /
2.2、JDBC程序调用存储函数
package com.rk.test; import java.sql.CallableStatement; import java.sql.Connection; import java.sql.Types; import com.rk.utils.JDBCUtils; /** * 演示java-jdbc调用oracle函数 */ public class CallFunc { public static void main(String[] args) throws Exception { String sql = "{? = call findEmpNameAndJobAndSal(?,?,?)}"; Connection conn = JDBCUtils.getConnection(); CallableStatement cstmt = conn.prepareCall(sql); //为第一个?注册输出类型 cstmt.registerOutParameter(1, Types.VARCHAR); //为第二个?注入值 cstmt.setInt(2, 7788); //为第三个?注册输出类型 cstmt.registerOutParameter(3, Types.VARCHAR); //为第四个?注册输出类型 cstmt.registerOutParameter(4, Types.INTEGER); //执行函数调用 cstmt.execute(); //分别获取1,3,4占位符的值 String ename = cstmt.getString(1); String job = cstmt.getString(3); int sal = cstmt.getInt(4); //显示 System.out.println("7788--"+ename+"--"+job+"--"+sal); JDBCUtils.closeQuietly(cstmt); JDBCUtils.closeQuietly(conn); } }
以上是关于Oracle系列:(33)JDBC访问Oracle的存储过程和存储函数的主要内容,如果未能解决你的问题,请参考以下文章
如何解决JMeter通过JDBC 访问Oracle 和MySQL的问题
使用 java Spark DataFrame 通过 jdbc 访问 Oracle
java.lang.ClassNotFoundException:oracle.jdbc.driver.OracleDriver [重复]