Java Votary

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            48 隨筆 :: 1 文章 :: 80 評(píng)論 :: 0 Trackbacks
          Java JDBC里如何取得Oracle存儲(chǔ)過程返回的動(dòng)態(tài)結(jié)果集
          作者:葉楓


          版權(quán)聲明:本文可以自由轉(zhuǎn)載,轉(zhuǎn)載時(shí)請(qǐng)務(wù)必以超鏈接形式標(biāo)明文章原始出處和作者信息及本聲明
          作者:葉楓(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]
          關(guān)鍵字:JDBC Oracle Cursor



          1. 關(guān)于oracle和結(jié)果集

          其實(shí)在大多數(shù)情況下,我們并不需要從oracle存儲(chǔ)過程里返回一個(gè)或多個(gè)結(jié)果集,
          除非迫不得已。

          如果大家用過MS SQL Server或Sybase SQL Server,那么從存儲(chǔ)過程返回一個(gè)
          動(dòng)態(tài)的結(jié)果集是一件非常容易的事情,只要在存儲(chǔ)過程結(jié)束時(shí)寫上

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

          就可以了。

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

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

          2. 定義表結(jié)構(gòu)

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

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


          3. 定義存儲(chǔ)過程

          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;


          在這個(gè)存儲(chǔ)過程里,我們定義了HotlineCursorType 類型,并且在存儲(chǔ)過程中
          簡(jiǎn)單地查找所有的記錄并返回HotlineCursorType.

          4. 測(cè)試存儲(chǔ)過程

          在Oracle SQL/Plus里登陸到數(shù)據(jù)庫(kù). 按以下輸入就看到返回的結(jié)果集.

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


          5. Java調(diào)用

          簡(jiǎn)單地寫一個(gè)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 閱讀(3202) 評(píng)論(0)  編輯  收藏 所屬分類: Java
          主站蜘蛛池模板: 乌拉特中旗| 长治市| 海原县| 海宁市| 平度市| 景泰县| 从江县| 天峻县| 岫岩| 莱阳市| 鄂温| 噶尔县| 黄龙县| 简阳市| 铜川市| 长宁县| 绥阳县| 屏南县| 唐山市| 清苑县| 县级市| 乐昌市| 富裕县| 离岛区| 怀集县| 泰和县| 商洛市| 林州市| 平遥县| 揭阳市| 静乐县| 长葛市| 科技| 淮安市| 衡山县| 开远市| 深水埗区| 潞城市| 闻喜县| 巴林右旗| 高密市|