Oracle系列:(33)JDBC访问Oracle的存储过程和存储函数
admin
2023-05-01 07:05:03
0


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


    
        jdbc:oracle:thin:@127.0.0.1:1521:orcl
        oracle.jdbc.driver.OracleDriver
        scott
        tiger
        3
        6
        1000
    


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);
    }
}



相关内容

热门资讯

卖“毒蛋”的人,抓到了 作者 | 何国胜 编辑 | 向现“(人)抓到了,目前案件正在侦办中。”7月28日晚间,苏州禁毒部门有...
尺素金声丨实施零关税国家达63... 海关总署发布的数据显示,今年5月1日起,我国对53个非洲建交国全面实施零关税举措,目前,我国实施零关...
职业索赔盯上基层诊所,倒逼用药... 文 | 布丁基层诊所正在被职业索赔盯上。据新京报,去年夏天,一男子走进河南南阳一家诊所,要求购买三瓶...
“西瓜我全买了”就可以肆意妄为... 拿西瓜砸了人,把瓜都买了,就能一走了之吗?事实证明,这套逻辑在法治社会行不通。7月28日晚,据海峡都...
科学家在日本广岛发现新物质,系... 在美国对日本广岛进行原子弹轰炸近81年后,科学家们在广岛的沙滩上发现了一种奇异且从未被发现过的新物质...
AI失控,反噬开始 作者 | 贺一 编辑 | 阿树近期,中国开源模型在美国频繁引发热议。7月28日,月之暗面发布Kimi...
“总统千金天价离婚”,分到43... 2026年7月24日下午,首尔高等法院,一场持续近十年的司法拉锯战终于接近尾声。法庭裁定SK集团会长...
巴基斯坦,又拿下一个历史性协议 全世界都没想到,接连的中东大战,巴基斯坦正成为最大赢家。去年以色列追杀哈马斯,空袭卡塔尔首都,阿拉伯...
汇正财经贺峰的一对一指导服务怎...   对于考虑购买证券投资顾问服务的投资者来说,'一对一指导服务怎么样'是一个重要的考量维度。需要首先...
重庆失联00后网格员龚宝冬确认...   重庆失联00后网格员龚宝冬确认遇难  【重庆失联00后网格员龚宝冬确认遇难】2026年7月29日...