溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Oracle系列:(33)JDBC訪問Oracle的存儲過程和存儲函數

發布時間:2020-07-03 08:27:32 來源:網絡 閱讀:480 作者:lsieun 欄目:關系型數據庫


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



向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女