Java Votary

            BlogJava :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理 ::
            48 隨筆 :: 1 文章 :: 80 評論 :: 0 Trackbacks
          Java JDBC里如何取得Oracle存儲過程返回的動態結果集
          作者:葉楓


          版權聲明:本文可以自由轉載,轉載時請務必以超鏈接形式標明文章原始出處和作者信息及本聲明
          作者:葉楓(http://blog.matrix.org.cn/page/葉楓)
          原 文:[http://www.matrix.org.cn/resource/article/43/43999_JDBC_Oracle.html]http://www.matrix.org.cn/resource/article/43/43999_JDBC_Oracle.html[/url]
          關鍵字:JDBC Oracle Cursor



          1. 關于oracle和結果集

          其實在大多數情況下,我們并不需要從oracle存儲過程里返回一個或多個結果集,
          除非迫不得已。

          如果大家用過MS SQL Server或Sybase SQL Server,那么從存儲過程返回一個
          動態的結果集是一件非常容易的事情,只要在存儲過程結束時寫上

          “select column1,column2,.... from table_list where condition“

          就可以了。

          但在Oracle中不能這樣做. 我們必須使用Oracle Cursor.
          在Oracle PL/SQL中,Cursor用來返回一行或多行記錄,借助Cursor,我們可以從結果集中取得所有記錄.

          Cursor并不難,但是要從Oracle存儲過程中返回結果集, 就需要用到Cursor變量,Cursor變量Oracle PL/SQL
          的類型是REF CURSOR, 我們只要定義了REF CURSOR 類型就可以使用Cursor變量. 比如我們可以這樣定義:
          TYPE ref_cursor IS REF CURSOR;
          了解了Cursor以及Cursor變量,下面就介紹如何使用Cursor變量給JDBC返回結果集.

          2. 定義表結構

          在以下例子里,我們要用到一張表Hotline.

          Create table hotline(
          country varchar2(50),
          pno varchar2(50));


          3. 定義存儲過程

          create or replace package PKG_HOTLINE is

          type HotlineCursorType is REF CURSOR;

          function getHotline return HotlineCursorType;

          end;

          create or replace package body PKG_HOTLINE is
          function getHotline return HotlineCursorType is
          hotlineCursor HotlineCursorType;
          begin
          open hotlineCursor for select * from hotline;
          return hotlineCursor;
          end;
          end;


          在這個存儲過程里,我們定義了HotlineCursorType 類型,并且在存儲過程中
          簡單地查找所有的記錄并返回HotlineCursorType.

          4. 測試存儲過程

          在Oracle SQL/Plus里登陸到數據庫. 按以下輸入就看到返回的結果集.

          SQL> var rs refcursor;
          SQL> exec :rs := PKG_HOTLINE.getHotline;
          SQL> print rs;


          5. Java調用

          簡單地寫一個Java Class.

          ....
          public void openCursor(){
          Connection conn = null;
          ResultSet rs = null;
          CallableStatement stmt = null;
          String sql = “{? = call PKG_HOTLINE.getHotline()}“;

          try{
          conn = getConnection();
          stmt = conn.prepareCall(sql);
          stmt.registerOutParameter(1,OracleTypes.CURSOR);
          stmt.execute();
          rs = ((OracleCallableStatement)stmt).getCursor(1);
          while(rs.next()){
          String country = rs.getString(1);
          String pno = rs.getString(2);
          System.out.println(“country:“+country+“|pno:”+pno);
          }

          }catch(Exception ex){
          ex.printStackTrace();
          }finally{
          closeConnection(conn,rs,stmt);
          }

          }
          .....


          好了,大功告成.
          posted on 2005-12-02 21:59 Dion 閱讀(3195) 評論(0)  編輯  收藏 所屬分類: Java
          主站蜘蛛池模板: 峡江县| 务川| 华阴市| 山丹县| 鄂托克旗| 永嘉县| 石门县| 江陵县| 黑龙江省| 木兰县| 白银市| 腾冲县| 瑞昌市| 鞍山市| 镇康县| 如东县| 玉溪市| 通州市| 凤冈县| 乌鲁木齐县| 贡觉县| 太和县| 巴东县| 麦盖提县| 宜昌市| 淮阳县| 武隆县| 梁河县| 色达县| 手游| 城步| 沙田区| 元谋县| 阆中市| 奉新县| 阿鲁科尔沁旗| 和林格尔县| 新沂市| 平泉县| 衡水市| 郁南县|