编程开发之--Oracle数据库--存储过程在out参数中使用光标(3)
生活随笔
收集整理的這篇文章主要介紹了
编程开发之--Oracle数据库--存储过程在out参数中使用光标(3)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
在本系列學習隨筆中的第2節我們留下了2個問題,我們現在討論在out參數中使用光標。
1、要在out參數中使用光標,我們需要申明一個包的結構,包的結構分為包頭和包體,包頭只負責申明,包體只負責實現。包頭、包體也是數據庫中的對象,與表是同一級別類型。
? ? 應用場景舉例:查詢某部門所有員工的所有信息
? ? 包頭:根據以下步驟創建
命名包名:mypackage:
在包中編寫我們自己的存儲過程或者存儲函數:
按下鍵盤ctrl+s,sql developer將自動存盤并且進行編譯:
接下來我們創建包的主體:
將會自動為我們創建要實現的包體部分:
然后我們將包體實現完整:
同樣,按下ctrl+s后,將自動幫我們存盤和編譯生成相應的包體結構樹:
使用desc語句查看包的結構:
2、在應用中訪問包中的存儲過程,需要帶上包的名字
? ? 在測試包中添加我們的測試類TestCursor.java
package demo.oracle;import java.sql.CallableStatement; import java.sql.Connection; import java.sql.ResultSet;import org.junit.Test;import demo.utils.JDBCUtils; import oracle.jdbc.OracleCallableStatement; import oracle.jdbc.internal.OracleTypes;public class TestCursor {/*** create or replace PACKAGE MYPACKAGE AS type empcursor is ref cursor;procedure queryEmpList(dno in number,empList out empcursor);END MYPACKAGE;*/@Testpublic void testCursor(){//{call <procedure-name>[(<agr1>,<agr2>,...)]}String sql="{call MYPACKAGE.queryEmpList(?,?)}";Connection conn=null;CallableStatement call=null;ResultSet rs=null;try {//獲得數據庫連接conn=JDBCUtils.getConnection();//根據連接創建statmentcall=conn.prepareCall(sql);//對in參數賦值call.setInt(1, 10);//對out參數進行申明call.registerOutParameter(2, OracleTypes.CURSOR);//執行我們的調用call.execute();//取出該部門中所有員工的信息,由于我們當前是Oracle的光標,Oracle的存儲過程,所以我們要對call進行轉換rs=((OracleCallableStatement)call).getCursor(2);while(rs.next()){//取出該員工的員工號、姓名、薪水、職位字段作為示例int empno = rs.getInt("empno");String name = rs.getString("ename");double salary = rs.getDouble("sal");String job = rs.getString("job");System.out.println(empno+"\t"+name+"\t"+salary+"\t"+job);}} catch (Exception e) {e.printStackTrace();}finally {JDBCUtils.release(conn, call, rs);}} }啟動我們的單元測試,運行結果:
總結:存儲過程可以實現存儲函數所有的能力
轉載于:https://www.cnblogs.com/ZeroMZ/p/9196927.html
超強干貨來襲 云風專訪:近40年碼齡,通宵達旦的技術人生總結
以上是生活随笔為你收集整理的编程开发之--Oracle数据库--存储过程在out参数中使用光标(3)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 性能优化的基本常识
- 下一篇: 深入理解javascript系列(十七)