<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    重復容易,改變很難
    java,,,不錯的玩具
    posts - 21,  comments - 42,  trackbacks - 0

    當需要把插入多條數據的行為合并為一個事務時,可以考慮把一個list型數據作為參數傳入存儲過程,
    可以調用jdbc內部實現類來實現,這些類在classes12.zip(oracle 8,別的版本可能是其他名字的zip包)。
     如:
    (一)  需要將一個list傳入存儲過程。
     具體操作如下:
      1,建立數據庫對象來映射list數據類型。
       --定義一個與list中各元素的數據類型相同的數據庫對象
       CREATE TYPE AOBJECT AS OBJECT(
          aaaa          NUMBER(8),
          bbbb         NUMBER(8)
        )
       /
       --定義一個list數據庫對象
       CREATE TYPE ALIST AS VARRAY(100) OF AOBJECT
       /

      2,具體java代碼如下:
      import java.sql.CallableStatement;
      import java.sql.Connection;
      import java.sql.PreparedStatement;
      import java.util.ArrayList;
      
      /*
       * 以下就是classes12.zip中的實現類
      */
      import oracle.jdbc.driver.OracleCallableStatement;
      import oracle.sql.ARRAY;
      import oracle.sql.ArrayDescriptor;
      import oracle.sql.STRUCT;
      import oracle.sql.StructDescriptor; 
      
      .......
      
      public static long addRecords(ArrayList list) {
       Connection con = null;
       CallableStatement stmt = null;
       int backVal = 0;
       try {
        con = pool.getConnection();
        if (con != null) {
         ARRAY aArray = getArray(con, "AOBJECT","ALIST", list);//該函數調用的第二三個參數必須大寫
         stmt = con.prepareCall("{call produce1(?,?)}"); //調用某個存儲過程
         ((OracleCallableStatement) stmt).setARRAY(1, aArray);
         stmt.registerOutParameter(2, java.sql.Types.INTEGER);
         stmt.execute();
         backVal = stmt.getInt(2);
        }
       } catch (Exception e) {
        ....
       } finally {
        ....//釋放數據庫連接
       }
       return backVal;
      }

      private static ARRAY getArray(Connection con, String OracleObj,
       String Oraclelist, ArrayList objlist) throws Exception {
       ARRAY list = null;
       if (objlist != null && objlist.size() > 0) {
        StructDescriptor structdesc = new StructDescriptor(OracleObj, con);
        STRUCT[] structs = new STRUCT[objlist.size()];
        Object[] result = new Object[0];
        for (int i = 0; i < objlist.size(); i++) {
         result = new Object[2];//數組大小應和你定義的數據庫對象(AOBJECT)的屬性的個數
         result[0] = new Integer(..);  //將list中元素的數據傳入result數組
         result[1] = new Integer(..);  //
         
         structs[i] = new STRUCT(structdesc, con, result);
        }
        ArrayDescriptor desc = ArrayDescriptor.createDescriptor(Oraclelist,
          con);
        list = new ARRAY(desc, con, structs);
       } // if
       return list;
      } // function
      
    (二) 當需要傳入存儲過程的參數的集合類型的數據時,這個集合容器中的元素可能不需要一個類似結構體的類型,具有多個元素。
    而是一個基本類型的集合,可以采用oracle的數組的概念。
     1,建立數據庫對象來映射list數據類型。
       --定義一個list數據庫對象
       CREATE TYPE ALIST AS VARRAY(100) OF  NUMBER(12, 2);
       /
      2,具體java代碼如下:
      import java.sql.CallableStatement;
      import java.sql.Connection;
      import java.sql.PreparedStatement;
      import java.util.ArrayList;
      
      /*
       * 以下就是classes12.zip中的實現類
      */
      import oracle.jdbc.driver.OracleCallableStatement;
      import oracle.sql.ARRAY;
      import oracle.sql.ArrayDescriptor;
      import oracle.sql.STRUCT;
      import oracle.sql.StructDescriptor; 
      
      .......
      
      public static long addRecords(ArrayList list) {
       Connection con = null;
       CallableStatement stmt = null;
       int backVal = 0;
       try {
        con = pool.getConnection();
        if (con != null) {
          
          int elements[] = { 300, 400, 500, 600 };                // line 59
         ArrayDescriptor desc = ArrayDescriptor.createDescriptor("ALIST", conn);
         ARRAY aArray = new ARRAY(desc, conn, elements);

         stmt = con.prepareCall("{call produce1(?,?)}"); //調用某個存儲過程
         ((OracleCallableStatement) stmt).setARRAY(1, aArray);
         stmt.registerOutParameter(2, java.sql.Types.INTEGER);
         stmt.execute();
         backVal = stmt.getInt(2);
        }
       } catch (Exception e) {
        ....
       } finally {
        ....//釋放數據庫連接
       }
       return backVal;
      }


     




      
      相信看了以上代碼您就能知道如何調用oracle驅動程序的提供的類,給存儲過程傳入list數據類型。
      
      有疑問請給我留言!!

    posted on 2007-06-02 23:02 分享愛的空間 閱讀(2953) 評論(0)  編輯  收藏

    只有注冊用戶登錄后才能發表評論。


    網站導航:
     

    <2025年7月>
    293012345
    6789101112
    13141516171819
    20212223242526
    272829303112
    3456789

    常用鏈接

    留言簿(5)

    隨筆檔案

    文章檔案

    相冊

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 精品国产免费观看| 午夜无码A级毛片免费视频| 99视频在线精品免费观看6| 亚洲色av性色在线观无码| 一级毛片不卡片免费观看| 五月天网站亚洲小说| 日韩成人免费视频| 亚洲AV无码乱码在线观看富二代 | 国产精品免费大片一区二区| 亚洲国产成人久久笫一页| 免费人成视频在线播放| 亚洲国产成人久久综合野外| 一级毛片a女人刺激视频免费| 亚洲日韩VA无码中文字幕 | 亚洲日韩中文字幕一区| 麻豆精品国产免费观看| 国产成人精品亚洲| 亚洲国产精品碰碰| 成人免费777777被爆出| 亚洲AV无码一区二区乱子伦| 国产a视频精品免费观看| 97se亚洲国产综合自在线| 免费黄色大片网站| 四虎影视永久在线精品免费| 亚洲色成人网站WWW永久| 久久这里只精品热免费99| 亚洲国产日韩在线| 国产高清在线免费视频| 一级毛片在线播放免费| 亚洲丁香色婷婷综合欲色啪| 国产片AV片永久免费观看| 亚洲精品无码成人片久久不卡| 五月天婷亚洲天综合网精品偷| 韩国免费a级作爱片无码| 亚洲国产一区在线观看| 四虎永久免费影院| 日本免费一区二区三区四区五六区| 亚洲综合丁香婷婷六月香| 亚洲区日韩区无码区| 久久狠狠躁免费观看2020| 搡女人真爽免费视频大全|