Java調(diào)用存儲(chǔ)過程

Java調(diào)用存儲(chǔ)過程

 * 調(diào)用存儲(chǔ)過程和存儲(chǔ)函數(shù)前過程和函數(shù)都需要先編譯成功
 * 調(diào)用存儲(chǔ)過程和存儲(chǔ)函數(shù)都是用CallableStatement
 * 調(diào)用存儲(chǔ)過程的sql語法格式:{call <procedure-name>[(<arg1>,<arg2>,...)]}
 * 調(diào)用存儲(chǔ)函數(shù)的sql語法格式:{?=call <procedure-name>[(<arg1>,<arg2>,...)]}
 *                          ?:表示是返回值,且只有一個(gè),存儲(chǔ)函數(shù)只能有一個(gè)返回值
  • 調(diào)用存儲(chǔ)過程
     測(cè)試調(diào)用存儲(chǔ)過程
           -- 存儲(chǔ)過程返回多個(gè)值
       -- 查詢某個(gè)員工的姓名,職位和月薪
       create or replace procedure queryEmpInfo(eno    in  number,
                                                pename out varchar2,
                                                pjob   out varchar2,
                                                psal   out number)
       as
       begin
         select ename,empjob,sal into pename,pjob,psal from emp where empno = eno;
       end;
       如上存儲(chǔ)過程在Java調(diào)用時(shí)只需看創(chuàng)建語句就可以了,存儲(chǔ)函數(shù)也是一樣
       @Test
   public void testProcedures() {
       // {call <procedure-name>[<arg1>,<arg2>,...]}
       String sql = "{call queryEmpInfo(?,?,?,?)}";
       Connection conn = null;
       CallableStatement call = null;
       try {
           conn = JDBCUtils.getConnection();
           call = conn.prepareCall(sql);
           // 對(duì)于in參數(shù),賦值
           call.setInt(1, 7839);// 1:表示第一個(gè)?號(hào)
           // 對(duì)于out參數(shù),聲明
           call.registerOutParameter(2, OracleTypes.VARCHAR);
           call.registerOutParameter(3, OracleTypes.VARCHAR);
           call.registerOutParameter(4, OracleTypes.NUMBER);
           // 執(zhí)行調(diào)用
           call.execute();
           // 調(diào)用完就有返回值了,取出返回值
           String name = call.getString(2);
           String job = call.getString(3);
           double sal = call.getDouble(4);
           System.out.println(name + "\t" + job + "\t" + sal);
       } catch (SQLException e) {
           e.printStackTrace();
       } finally {
           JDBCUtils.release(conn, call, null);
       }
   }
  • 調(diào)用存儲(chǔ)函數(shù)
/**
     * 測(cè)試調(diào)用存儲(chǔ)函數(shù)
     *  -- 存儲(chǔ)函數(shù)
        -- 查詢某個(gè)元的年收入
        create or replace function queryEmpTotalSal(eno in number)
        return number -- 定義返回類型
        as
          -- 月薪和獎(jiǎng)金
          psal emp.sal%type;
          pcomm emp.comm%type;
        begin
          -- 得到月薪和獎(jiǎng)金
          select sal,comm into psal,pcomm from emp where empno = eno;
          -- 返回年收入
          return psal * 12 + nvl(pcomm,0);-- 獎(jiǎng)金可能為null
        end;
     */
    @Test
    public void testFunction() {
        // {?=call <procedure-name>[(<arg1>,<arg2>,...)]}
        String sql = "{?=call queryEempTotalSal(?)}";
        // 這里第一個(gè) ? 就相當(dāng)于 out 參數(shù),第二個(gè) ? 就相當(dāng)于 in 參數(shù)
        Connection conn = null;
        CallableStatement call = null;
        try {
            conn = JDBCUtils.getConnection();
            call = conn.prepareCall(sql);
            // 對(duì)于out參數(shù),聲明
            call.registerOutParameter(1, OracleTypes.NUMBER);
            // 對(duì)于in參數(shù),賦值
            call.setInt(2, 7839);
            // 執(zhí)行調(diào)用
            call.execute();
            // 取出返回結(jié)果
            double totalSal = call.getDouble(1);
            System.out.println("7839號(hào)員工的年收入為:" + totalSal);
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.release(conn, call, null);
        }
  • cursor作為out參數(shù)返回

     /**
      測(cè)試返回一個(gè)list集合,使用cursor作為out參數(shù)
      例:查詢某個(gè)部門所有員工的所有信息
     */
    @Test
    public void testCursor() {
        // 此查詢其實(shí)就是調(diào)用存儲(chǔ)過程,因此語法是一樣。{call <procedure-name> [(<arg1>,<arg2>,...]}
        // 但是要加上調(diào)用方法所在的包名,如下
        String sql = "{call testOutByCursor.queryEmpList(?,?)}";
        Connection conn = null;
        CallableStatement call = null;
        ResultSet resultSet = null;
        try {
            conn = JDBCUtils.getConnection();
            call = conn.prepareCall(sql);
            // 賦值,輸入查詢的部門
            call.setInt(1, 10);// 查10號(hào)部門
            // 申明out參數(shù)
            call.registerOutParameter(2, OracleTypes.CURSOR);
            // 執(zhí)行
            call.execute();
            // 得到結(jié)果,此時(shí)要將call轉(zhuǎn)成Oracle的CallableStatement
            resultSet = ((OracleCallableStatement) call).getCursor(2);
            while (resultSet.next()) {
                int empNo = resultSet.getInt("empno");
                String name = resultSet.getString("ename");
                String job = resultSet.getString("empjob");
                int mgr = resultSet.getInt("mgr");
                Date hireDate = resultSet.getDate("hiredate");
                double sal = resultSet.getDouble("sal");
                double comm = resultSet.getDouble("comm");
                int deptno = resultSet.getInt("deptno");
                System.err.println(empNo + "  " + name + "  " + job + "  " + mgr
                        + "  " + hireDate.toString() + "  " + sal + "  " + comm
                        + "  " + deptno + "  ");
            }
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            JDBCUtils.release(conn, call, resultSet);
        }
    }
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,697評(píng)論 18 399
  • 步驟1:在存儲(chǔ)過程里返回錯(cuò)誤代碼 return error codeRAISERROR(" message ", ...
    專職跑龍?zhí)?/span>閱讀 1,141評(píng)論 0 0
  • 前言 人生苦多,快來 Kotlin ,快速學(xué)習(xí)Kotlin! 什么是Kotlin? Kotlin 是種靜態(tài)類型編程...
    任半生囂狂閱讀 26,692評(píng)論 9 118
  • 公仔最近不開心,因?yàn)樗哿恕?他的身份太多:有抱負(fù)的男人,貼心的未婚夫,成功的兒子,想討老丈人丈母娘喜歡的女婿,...
    小竹子寶寶閱讀 296評(píng)論 0 0
  • 關(guān)關(guān)雎鳩,在河之洲。 窈窕淑女,君子好逑。 參差荇菜,左右流之。 窈窕淑女,寤寐求之。 求之不得,寤寐思服。 悠哉...
    w影子w閱讀 203評(píng)論 0 5

友情鏈接更多精彩內(nèi)容