oracle--在java中調(diào)用存儲過程和存儲函數(shù)

在java中調(diào)用存儲過程和存儲函數(shù)

存儲過程:

查詢某個員工的姓名 月薪 職位:

create or replace procedure queryempinfo(eno in number,
                                            pename out varchar2,
                                            psal   out number,
                                            pjob   out varchar2)
as
begin
  select ename,sal,empjob into pename,psal,pjob from emp where empno=eno;
end;

存儲函數(shù):

--查詢某個員工的年收入
create or replace function queryempincome(eno in number)
return number
as
   --定義變量保存月薪和獎金
   psal emp.sal%type;
   pcomm emp.comm%type;
begin
   select sal,comm into psal,pcomm from emp where empno=eno;

   --返回年收入
   return psal*12+nvl(pcomm,0);
end;

JDBCUtils:

package demo;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

public class JDBCUtils {
    private static String driver = "oracle.jdbc.OracleDriver";
    private static String url = "jdbc:oracle:thin:@192.168.56.101:1521:orcl";
    private static String user = "scott";
    private static String password = "tiger";
    
    static{
        try {
            Class.forName(driver);
        } catch (ClassNotFoundException e) {
            throw new ExceptionInInitializerError(e);
        }
        //DriverManager.registerDriver(driver)
    }

    public static Connection getConnection(){
        try {
            return DriverManager.getConnection(url, user, password);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return null;
    }

    /*
     * 運行Java程序
     * java -Xms100M -Xmx200M HelloWorld
     * 
     * 技術(shù)方向:
     * 1. 性能調(diào)優(yōu)  ---> tomcat
     * 2. 故障診斷  ---> 死鎖
     */
    public static void release(Connection conn,Statement st,ResultSet rs){
        if(rs != null){
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }finally{
                rs = null;// ----> java GC
            }
        }
        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;
            }
        }
    }
}

TestOracle:

package demo;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.ResultSet;

import oracle.jdbc.OracleCallableStatement;
import oracle.jdbc.OracleTypes;

import org.junit.Test;

public class TestOracle {
/*
 * create or replace procedure queryempinfo(eno in number,
                                            pename out varchar2,
                                            psal   out number,
                                            pjob   out varchar2)
 */
    @Test
    public void testProcedure(){
        //{call <procedure-name>[(<arg1>,<arg2>, ...)]}
        String sql = "{call queryempinfo(?,?,?,?)}";
            
        Connection conn = null;
        CallableStatement call = null;
        try {
            conn = JDBCUtils.getConnection();
            call = conn.prepareCall(sql);
            
            //對于in參數(shù)哥牍,賦值
            call.setInt(1, 7839);
            
            //對于out參數(shù)本慕,申明
            call.registerOutParameter(2, OracleTypes.VARCHAR);
            call.registerOutParameter(3, OracleTypes.NUMBER);
            call.registerOutParameter(4, OracleTypes.VARCHAR);
            
            //執(zhí)行
            call.execute();
            
            //取出結(jié)果
            String name = call.getString(2);
            double sal = call.getDouble(3);
            String job = call.getString(4);
            System.out.println(name+"\t"+sal+"\t"+job);
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            JDBCUtils.release(conn, call, null);
        }
    }

/*
 * create or replace function queryempincome(eno in number)
return number
 */
    @Test
    public void testFunction(){
        //{?= call <procedure-name>[(<arg1>,<arg2>, ...)]}
        String sql = "{?=call queryempincome(?)}";
        
        Connection conn = null;
        CallableStatement call = null;
        try {
            conn = JDBCUtils.getConnection();
            call = conn.prepareCall(sql);
            
            //第一個是out參數(shù)
            call.registerOutParameter(1, OracleTypes.NUMBER);
            //第二個是in參數(shù)
            call.setInt(2, 7839);
            
            call.execute();
            
            //取出年收入
            double income = call.getDouble(1);
            System.out.println(income);
        } catch (Exception e) {
            e.printStackTrace();
        }finally{
            JDBCUtils.release(conn, call, null);
        }       
    }

}

在out參數(shù)中使用光標

查詢某個部門中的所有員工信息 ---> 返回集合

包頭
CREATE OR REPLACE PACKAGE MYPAKCAGE AS 

  type empcursor is ref cursor;
  procedure queryEmpList(dno in number, empList out empcursor);

END MYPAKCAGE;


包體
CREATE OR REPLACE PACKAGE BODY MYPAKCAGE AS

  procedure queryEmpList(dno in number, empList out empcursor) AS
  BEGIN

    open empList for select * from emp where deptno=dno;

  END queryEmpList;

END MYPAKCAGE;

java代碼:

@Test
public void testCursor(){
    String sql = "{call MYPAKCAGE.queryEmpList(?,?)}";
    
    Connection conn = null;
    CallableStatement call = null;
    ResultSet rs = null;
    try {
        conn = JDBCUtils.getConnection();
        call = conn.prepareCall(sql);
        
        //對于in參數(shù)蛇捌,賦值
        call.setInt(1, 20);
        //對于out參數(shù)  申明
        call.registerOutParameter(2, OracleTypes.CURSOR);
        
        call.execute();
        
        //取出結(jié)果
        rs = ((OracleCallableStatement)call).getCursor(2);
        while(rs.next()){
            //取出一個員工
            String name = rs.getString("ename");
            double sal = rs.getDouble("sal");
            System.out.println(name+"\t"+sal);
        }
    } catch (Exception e) {
        e.printStackTrace();
    }finally{
        JDBCUtils.release(conn, call, rs);
    }
}

光標在JDBCUtils.release(conn, call, rs);語句中被關(guān)閉棉钧。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末筋栋,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子街州,更是在濱河造成了極大的恐慌刑顺,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件粹污,死亡現(xiàn)場離奇詭異段多,居然都是意外死亡,警方通過查閱死者的電腦和手機壮吩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進店門进苍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人鸭叙,你說我怎么就攤上這事觉啊。” “怎么了沈贝?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵杠人,是天一觀的道長。 經(jīng)常有香客問我,道長嗡善,這世上最難降的妖魔是什么辑莫? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮罩引,結(jié)果婚禮上各吨,老公的妹妹穿的比我還像新娘。我一直安慰自己袁铐,他們只是感情好揭蜒,可當我...
    茶點故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著剔桨,像睡著了一般屉更。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上洒缀,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天瑰谜,我揣著相機與錄音,去河邊找鬼帝洪。 笑死似舵,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的葱峡。 我是一名探鬼主播,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼龙助,長吁一口氣:“原來是場噩夢啊……” “哼砰奕!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起提鸟,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤军援,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后称勋,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體胸哥,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年赡鲜,在試婚紗的時候發(fā)現(xiàn)自己被綠了空厌。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡银酬,死狀恐怖嘲更,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情揩瞪,我是刑警寧澤赋朦,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響宠哄,放射性物質(zhì)發(fā)生泄漏壹将。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一毛嫉、第九天 我趴在偏房一處隱蔽的房頂上張望瞭恰。 院中可真熱鬧,春花似錦狱庇、人聲如沸惊畏。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽颜启。三九已至,卻和暖如春浪讳,著一層夾襖步出監(jiān)牢的瞬間缰盏,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工淹遵, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留口猜,地道東北人。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓透揣,卻偏偏與公主長得像济炎,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子辐真,可洞房花燭夜當晚...
    茶點故事閱讀 44,619評論 2 354

推薦閱讀更多精彩內(nèi)容