JAVA操作ORACLE數據庫的存儲過程


一、任務提出

JAVA操作oracle11g存儲過程實驗需要完成以下幾個實例:

1.調用沒有返回參數的過程(插入記錄、更新記錄)

2.有返回參數的過程

3.返回列表的過程

4.返回帶分頁的列表的過程。

 

二、建立表和相應的存儲過程

create table student (sno int ,sname varchar2(20),sage int);

--創建存儲過程testa1
create or replace procedure testa1(para1 in int,para2 in varchar2,para3 in int)
is
begin
       insert into student(sno,sname,sage) values(para1,para2,para3);
       commit;
end;
/
--創建存儲過程testa2
create or replace procedure testa2(para1 in int,para2 in int)
is
begin
     update student set sage=para2 where sno=para1;
     commit;
end;
/
--創建有返回參數的存儲過程testb
create or replace procedure testb(para1 in int ,para2 out varchar2,para3 out int)
is
  begin
  select sname,sage into para2,para3 from student where sno=para1;
 end;
--創建返回集合的存儲過程:
--在oracle中,如果要返回集合必須是返回游標,不能是一張二維表。所以,要先建立包。
create or replace package testpack
is
   type test_cursor is ref cursor;
end testpack;
/

create or replace procedure testc(p_cursor out testpack.test_cursor)
is
begin
   open p_cursor for  select * from student;
end;
/

--實現分頁的存儲過程
---ps 每頁幾個記錄,cs第幾頁
create or replace procedure testd(ps int ,cs  int ,p_cursor out testpack.test_cursor)
is
begin
    open p_cursor for
     select * from (select student.*,rownum rn from student) where rn>ps*(cs-1) and rn<=ps*cs;
end;
/

 

三、java操作調用上述存儲過程

package com.zhwy;

import java.sql.*;

public class Test {
    String driver = "oracle.jdbc.driver.OracleDriver";
    String strUrl = "jdbc:oracle:thin:@localhost:1521:orcl";
    ResultSet rs = null;
    Connection conn = null;
    CallableStatement cstmt = null;

    public static void main(String[] args) {
        new Test().testPageSet(3, 1);
    }

    /**
     * 沒有返回參數的存儲過程
     * @param inputeSno
     * @param inputSage
     */
    public void testNoOutParameterUpdate(int inputeSno, int inputSage) {
        try {
            Class.forName(driver);
            conn = DriverManager.getConnection(strUrl, "scott", "scott");
            cstmt = conn.prepareCall("{ call scott.testa2(?,?)}");
            cstmt.setInt(1, inputeSno);
            cstmt.setInt(2, inputSage);
            cstmt.execute();
            System.out.println("執行成功!");
        } catch (SQLException ex) {
            ex.printStackTrace();
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            try {
                if (cstmt != null)
                    cstmt.close();
                if (conn != null) {
                    conn.close();
                    conn = null;
                }
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
        }
    }
    
    /**
     * 沒有返回參數的存儲過程
     * @param inputeSno
     * @param inputSage
     */
    public void testNoOutParameterInsert(int a, String b, int c) {
        try {
            Class.forName(driver);
            conn = DriverManager.getConnection(strUrl, "scott", "scott");
            cstmt = conn.prepareCall("{ call scott.testa1(?,?,?)}");
            cstmt.setInt(1, a);
            cstmt.setString(2, b);
            cstmt.setInt(3, c);
            cstmt.execute();
        } catch (SQLException ex) {
            ex.printStackTrace();
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            try {
                if (cstmt != null)
                    cstmt.close();
                if (conn != null) {
                    conn.close();
                    conn = null;
                }
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
        }
    }

    /**
     * 有返回參數的存儲過程
     * @param inputeSno
     * @param inputSage
     */
    public void testOutParameter(int inputSno) {
        try {
            Class.forName(driver);
            conn = DriverManager.getConnection(strUrl, "scott", "scott");
            cstmt = conn.prepareCall("{ call scott.testb(?,?,?)}");
            cstmt.setInt(1, inputSno);
            cstmt.registerOutParameter(2, Types.VARCHAR);
            cstmt.registerOutParameter(3, Types.INTEGER);
            cstmt.execute();
            String name = cstmt.getString(2);
            int age = cstmt.getInt(3);
            System.out.print("學號是:" + inputSno + "的學生的名字是:" + name + ",年齡是:" + age);
        } catch (SQLException ex) {
            ex.printStackTrace();
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            try {
                if (cstmt != null)
                    cstmt.close();
                if (conn != null) {
                    conn.close();
                    conn = null;
                }
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
        }
    }

    /**
     * 返回列表的存儲過程
     * @param inputeSno
     * @param inputSage
     */
    public void testOutResult() {
        try {
            Class.forName(driver);
            conn = DriverManager.getConnection(strUrl, "scott", "scott");
            cstmt = conn.prepareCall("{ call scott.testc(?)}");
            cstmt.registerOutParameter(1, oracle.jdbc.OracleTypes.CURSOR);// 指定是oracle里規定的類型
            cstmt.execute();
            rs = (ResultSet) cstmt.getObject(1);
            while (rs.next()) {
                System.out.print("學號是:" + rs.getInt(1) + "的學生的名字是:" + rs.getString(2) + ",年齡是:" + rs.getInt(3) + "\r\n");
            }
        } catch (SQLException ex) {
            ex.printStackTrace();
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            try {
                if (cstmt != null)
                    cstmt.close();
                if (conn != null) {
                    conn.close();
                    conn = null;
                }
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
        }
    }

    /**
     * 分頁返回列表的存儲過程
     * @param inputeSno
     * @param inputSage
     */
    public void testPageSet(int recordPerPage, int currentPage) {
        try {
            Class.forName(driver);
            conn = DriverManager.getConnection(strUrl, "scott", "scott");
            cstmt = conn.prepareCall("{ call scott.testd(?,?,?)}");
            cstmt.registerOutParameter(3, oracle.jdbc.OracleTypes.CURSOR);// 指定是oracle里規定的類型
            cstmt.setInt(1, recordPerPage);
            cstmt.setInt(2, currentPage);
            cstmt.execute();
            rs = (ResultSet) cstmt.getObject(3);
            while (rs.next()) {
                System.out.print("學號是:" + rs.getInt(1) + "的學生的名字是:" + rs.getString(2) + ",年齡是:" + rs.getInt(3) + "\r\n");
            }
        } catch (SQLException ex) {
            ex.printStackTrace();
        } catch (Exception ex) {
            ex.printStackTrace();
        } finally {
            try {
                if (cstmt != null)
                    cstmt.close();
                if (conn != null) {
                    conn.close();
                    conn = null;
                }
            } catch (SQLException ex) {
                ex.printStackTrace();
            }
        }
    }
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM