成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

Oracle中大對象(LOB)處理方法

瀏覽:188日期:2023-03-12 15:25:07
目錄
  • 一、LOB數據類型分類
    • 1、按存儲數據的類型分
    • 2、按存儲方式分
    • 3、Null LOBs與Empty LOBs
  • 二、LOB寫入
    • 三、LOB讀取
      • 四、BFile文件大對象(存儲在操作系統文件中的數據)
        • 1. 創建
        • 2. 讀取
      • 五、將文件系統數據庫通過BFile導入到LOB字段中
        • 六、C#讀寫Oracle BOLB數據。
          • (1)寫入數據到Orable Blob字段中。
          • (2)讀取Oracle Blob到文件中。

        一、LOB數據類型分類

        1、按存儲數據的類型分

        • 字符類型: 
          CLOB:存儲大量 單字節 字符數據。 
          NLOB:存儲定寬 多字節 字符數據。
        • 二進制類型: 
          BLOB:存儲較大無結構的二進制數據。
        • 二進制文件類型: 
          BFILE:將二進制文件存儲在數據庫外部的操作系統文件中。存放文件路徑。

        2、按存儲方式分

        • 存儲在內部表空間: 
          CLOB,NLOB和BLOB
        • 指向外部操作系統文件: 
          BFILE

        3、Null LOBs與Empty LOBs

        DECLARE
            some_clob CLOB;
        BEGIN
            IF some_clob IS NULL THEN
        dbms_output.put_line("a"); --NULL 表示該 LOB 字段或變量中連 LOB 指針都沒有
            ELSIF dbms_lob.getlength(some_clob) = 0 THEN
        dbms_output.put_line("b"); --empty LOB 是指該 LOB 字段或變量中保存了一個 LOB 指針,但這個指針并沒有指向任何 LOB 數據
            ELSE
        dbms_output.put_line("c"); --指針有實際內容
            END IF;
        END;

        二、LOB寫入

        Blob數據不能象其它類型數據一樣直接插入(INSERT)。插入前必須先插入一個空的Blob對象,BLOB類型的空對象為EMPTY_BLOB(),之后通過SELECT命令查詢得到先前插入的記錄并鎖定,繼而將空對象修改為所要插入的Blob對象。

        當獲取到一個可用的 LOB 指針(定位器)后,就可以通過該指針寫入 LOB 數據了。有兩種寫入數據的系統函數:

        • DBMS_LOB.WRITE :將數據隨機地寫入 LOB 中。
        • DBMS_LOB.WRITEAPPEND :從 LOB 的最后開始寫入數據。

        運用dbms_lob包用dbms_lob.write()寫入只能存儲32k以下的圖片。

        注意:這里并不需要使用 UPDATE 來更新列 falls_myclob,因為這個 LOB 指針并沒有發生變化,我們只是將數據寫入它所指向的位置。

        declare
          myclob  clob;
          amount  binary_integer;
          offset  integer;
          first_direction varchar2(100);
          more_myclob     varchar2(500);
        begin
          --刪除所有“munining Falls”的現有行,然后
          delete from waterfalls   where falls_name =      "Munising Falls";
          
          insert into waterfalls   (falls_name, falls_myclob)  values   ("Munising Falls", EMPTY_CLOB()); --使用EMPTY_CLOB()插入新行來創建LOB定位器
          select falls_myclob   into myclob   from waterfalls  where falls_name = "Munising Falls"; --檢索由前面的INSERT語句創建的LOB定位器
          --或直接
          INSERT  into waterfalls(falls_name, falls_myclob) values("Munising Falls" EMPTY_CLOB());  returning falls_myclob   into myclob;
        
          DBMS_LOB.OPEN(myclob, DBMS_LOB.LOB_READWRITE); --打開LOB;不是嚴格必要的,但是最好打開/關閉lob。
          
          first_direction := "Follow I-75 across the Mackinac Bridge.";
          amount  := LENGTH(first_direction); --要寫的字符數
          offset  := 1; --開始寫CLOB的第一個字符
          DBMS_LOB.WRITE(myclob, amount, offset, first_direction); --使用DBMS_LOB。開始寫
          
          more_myclob := " Take US-2 west from St. Ignace to Blaney Park." ||    " From Seney, take M-28 west to Munising."; --使用DBMS_LOB.WRITEAPPEND添加更多的myclob
          DBMS_LOB.WRITEAPPEND(myclob, LENGTH(more_myclob), more_myclob);
          
          more_myclob := " In front of the paper mill, turn right on H-58." ||    " Sand Point Road."; --添加更多的myclob
          DBMS_LOB.WRITEAPPEND(myclob, LENGTH(more_myclob), more_myclob);
          
          DBMS_LOB.CLOSE(myclob); --關閉LOB,就完成了。
        end;

        三、LOB讀取

        使用系統函數 DBMS_LOB.READ( ) 來讀取 LOB 中的數據,當然,首先要得到這個 LOB 指針。比如讀取 CLOB 數據,應該指定字符串的偏移量(offset),從指定的偏移量的位置開始讀取數據。 
        CLOB 的第一個字符的偏移量是1;也需要指定讀取的字符串長度。如果這個 CLOB 數據太大,應該多次讀取數據。對于 BLOB 數據,也是這樣處理,唯一的區別就是它是按字節存儲的。 
        DBMS_LOB.READ 中的第二個參數 chars_read_1,是 IN OUT 參數。 
        調用時按照該參數指定的長度來讀取數據,讀取完畢后,將其更新為實際讀取的字符(字節)長度。 
        當讀取后,該參數的值比你原來的值小,則說明已經讀取到 LOB 的末尾了。

        declare
          myclob   clob;
          myclob_1 varchar2(300);
          myclob_2 varchar2(300);
          chars_read_1 binary_integer;
          chars_read_2 binary_integer;
          offset       integer;
        begin
          select falls_myclob into myclob from waterfalls where falls_name = "Munising Falls"; --檢索之前插入的LOB定位器
          offset := 1;  --從第一個字符開始閱讀
          chars_read_1 := 229; --嘗試讀取myclob的229個字符時,chars_read_1將使用實際讀取的字符數進行更新
          DBMS_LOB.READ(myclob, chars_read_1, offset, myclob_1);
        
          if chars_read_1 = 229 then  --如果讀取229個字符,則更新偏移量并嘗試讀取255個字符。
            offset       := offset + chars_read_1;
            chars_read_2 := 255;
            DBMS_LOB.READ(myclob, chars_read_2, offset, myclob_2);
          else
            chars_read_2 := 0;
            myclob_2 := "";
          end if;
          
          DBMS_OUTPUT.PUT_LINE("Characters read = " ||  TO_CHAR(chars_read_1 + chars_read_2));  --顯示讀取的字符總數
          DBMS_OUTPUT.PUT_LINE(myclob_1);  --顯示myclob
          DBMS_OUTPUT.PUT_LINE(myclob_2);
        end;

        四、BFile文件大對象(存儲在操作系統文件中的數據)

        PL/SQL中的Bfile只能讀取Bfile數據,而不能寫入。

        BLOB,CLOB,NCLOB 存儲在數據庫內,而 BFILE 存儲在數據庫外。BFILE 和其他三種大字段類型相比,BFILE 有以下三點不同:

        • BFILE 的數據是存儲在操作系統文件中的,而不是在數據庫中;
        • BFILE 數據不參與事務處理,也就是說,BFILE 數據的改變不能被提交和回滾(但 BFILE 指針的改變是可以提交或回滾的);
        • 從 PL/SQL 中,只能讀取 BFILE 數據,而不能寫入。必須得在數據庫外先創建 BFILE 文件,再創建 BFILE 指針。

        在 PL/SQL 中操作 BFILE,其實也是操作 LOB 指針。只是對于 BFILE 的指針來說,它指向的 BFILE 數據在數據庫外。 
        所以,一個 BFILE 列的兩行,可以存儲指向同一個文件的 BFILE 指針。

        1. 創建

        BFILE 指針由目錄(Oracle服務器上)和文件名組成(而實際的目錄和文件可以不存在),將這兩部分信息作為參數傳入 BFILENAME 函數,該函數會返回一個 BFILE 指針。

        create directory BFILE_DATA as "D:/temp";
        declare
         waterfall_picture bfile;
        begin
         waterfall_picture := BFILENAME("BFILE_DATA","waterfall.gif"); --調用BFILENAME來創建BFILE定位器
         insert into waterfalls (falls_name, falls_web_page) values ("my waterfall",waterfall_picture); --保存我們的新定位在waterfalls 
        en

        2. 讀取

        declare
         waterfall bfile;
         piece raw(60);
         amount binary_integer := 60;
         offset integer := 1;
        begin
         select falls_web_page into waterfall from waterfalls where falls_name="my waterfall"; --檢索LOB定位器
         DBMS_LOB.OPEN(waterfall); --打開定位器,讀取60個字節,然后關閉定位器
         DBMS_LOB.READ(waterfall, amount, 1, piece);
         DBMS_LOB.CLOSE(waterfall);
        
         DBMS_OUTPUT.PUT_LINE(RAWTOHEX(piece));--十六進制顯示結果
         --將原始結果轉換為我們可以讀取的字符串
         --DBMS_OUTPUT.PUT_LINE(UTL_RAW.CAST_TO_VARCHAR2(piece));
         end;

        五、將文件系統數據庫通過BFile導入到LOB字段中

        BFILE 提供了一種從數據庫中訪問文件系統中數據的方法。可能你想將這些數據保存到 BLOB 或 CLOB 字段中。 
        可以使用系統函數實現:

        • dbms_lob.loadfrombfile
        • dbms_lob.loadclobfrombfile
        • dbms_lob.loadblobfrombfile

        下面我們將圖片 watarfall.gif 保存到 BLOB 列中:

        declare
          My_Falls_bfile bfile := BFILENAME("BFILE_DATA", "waterfall.gif");
          photo       blob;
          destination_offset  integer := 1;
          source_offset       integer := 1;
        begin
          delete from waterfalls where falls_name = "my waterfall"; --刪除Tannery Falls的行,所以這個例子可以運行多次。
          insert into waterfalls (falls_name, FALLS_PHOTO) values ("my waterfall", EMPTY_BLOB());--使用EMPTY_BLOB()插入新行來創建LOB定位器
          select FALLS_PHOTO into photo from waterfalls where falls_name = "my waterfall"; --檢索由前面的INSERT語句創建的LOB定位器
          DBMS_LOB.OPEN(photo, DBMS_LOB.LOB_READWRITE);--打開目標BLOB和源BFILE
          DBMS_LOB.OPEN(My_Falls_bfile);
          DBMS_LOB.LOADBLOBFROMFILE(photo,  My_Falls_bfile, DBMS_LOB.LOBMAXSIZE, destination_offset, source_offset);  --Load the contents of the BFILE into the BLOB column
          DBMS_LOB.CLOSE(photo);  --關閉兩個lob
          DBMS_LOB.CLOSE(My_Falls_bfile);
        end;

        六、C#讀寫Oracle BOLB數據。

        (1)寫入數據到Orable Blob字段中。

        首先要在BLob字段中插入一個Empty_blob(),才能寫入下面的數據。

        * 在調用此函數之前需要寫插入一個字符串到 BLOB 中比如:
        *"CREATE TABLE tablewithlobs (a int, b BLOB, c CLOB, d NCLOB)";
        *"INSERT INTO tablewithlobs values (1, "AA", "AAA", N"AAAA")";
        * 否則程序會在 OracleLob tempLob    = reader.GetOracleLob(0) 處出錯。

        寫入:

        conn.Open();
        OracleCommand cmd = conn.CreateCommand();
        OracleTransaction transaction = cmd.Connection.BeginTransaction();      // 利用事務處理(必須)
        cmd.Transaction = transaction;
        // 獲得 OracleLob 指針
        cmd.CommandText = "select fulls_myblob from waterfalls where fulls_name = "myabc" FOR UPDATE";
        using (OracleDataReader reader = cmd.ExecuteReader())
        {
            reader.Read(); //Obtain the first row of data.
            OracleBlob tempLob = reader.GetOracleBlobForUpdate(0);   //Obtain a LOB.
            FileStream fs = new FileStream("c:\\1.txt", FileMode.Open); // 將文件寫入 BLOB 中
            tempLob.BeginChunkWrite();
            int length = 10485760;
            byte[] Buffer = new byte[length];
            int i;
            while ((i = fs.Read(Buffer, 0, length)) > 0)
            {
        tempLob.Write(Buffer, 0, i);
            }
            fs.Close();
            tempLob.EndChunkWrite();
            cmd.Parameters.Clear();
        }
        transaction.Commit(); // 提交事務
        conn.Close();

        (2)讀取Oracle Blob到文件中。

        conn.Open();
        OracleCommand cmd = conn.CreateCommand();
        OracleTransaction trans = cmd.Connection.BeginTransaction();// 利用事務處理(必須)
        cmd.Transaction = trans;
        // 獲得 OracleLob 指針
        string sql = "select fulls_myblob from waterfalls where fulls_name = "myabc"";
        cmd.CommandText = sql;
        OracleDataReader dr = cmd.ExecuteReader();
        dr.Read();
        OracleBlob tempLob = dr.GetOracleBlob(0);
        dr.Close();
        
        // 讀取 BLOB 中數據,寫入到文件中
        FileStream fs = new FileStream("c:\\1.txt", FileMode.Create);
        int length = 1048576;
        byte[] Buffer = new byte[length];
        int i;
        while ((i = tempLob.Read(Buffer, 0, length)) > 0)
        {
            fs.Write(Buffer, 0, i);
        }
        fs.Close();
        tempLob.Clone();
        cmd.Parameters.Clear();
        trans.Commit();     // 提交事務
        conn.Close();

        到此這篇關于Oracle中大對象(LOB)處理方法的文章就介紹到這了。希望對大家的學習有所幫助,也希望大家多多支持。

        標簽: Oracle
        相關文章:
        成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
        久久久久一区| 一级精品视频在线观看宜春院 | 免费成人在线视频观看| 一本一本久久| 久久久不卡影院| 粉嫩嫩av羞羞动漫久久久| 欧美午夜一区二区| 免费成人你懂的| 色悠久久久久综合欧美99| 久久综合久久综合九色| 国产成人精品一区二| 欧美日韩国产精选| 国产综合久久久久影院| 欧美二区乱c少妇| 亚洲精品国产视频| 伊人久久av导航| 最新不卡av在线| 日韩视频久久| 一级中文字幕一区二区| 91在线小视频| 久久久精品一品道一区| 欧美xxx在线观看| 久久蜜臀中文字幕| 欧美激情综合| 欧美日韩久久一区二区| 亚洲免费毛片网站| 99成人在线| 久久夜色精品国产噜噜av| 99在线精品视频| 久久久久久久精| 欧美日韩亚洲一区在线观看| 1区2区3区欧美| 中文日韩欧美| 日韩av中文字幕一区二区| 一本色道亚洲精品aⅴ| 美国三级日本三级久久99| 欧美日韩国产高清一区二区 | 国产精品青草综合久久久久99| 日韩电影在线观看一区| 国内一区二区三区| 《视频一区视频二区| 国产亚洲精品v| 亚洲.国产.中文慕字在线| 91搞黄在线观看| 国内精品自线一区二区三区视频| 国产偷久久久精品专区| 亚洲成a人v欧美综合天堂下载 | 99在线精品观看| 国产欧美精品在线观看| 国产99精品国产| 久久久久国色av免费看影院| 亚洲电影在线| 手机精品视频在线观看| 欧美久久免费观看| 91丨九色丨蝌蚪富婆spa| 亚洲国产激情av| 国产精品毛片| 精品制服美女丁香| 久久亚洲一级片| 成人午夜在线播放| 国产欧美日韩精品在线| 亚洲免费一区二区| 国产美女娇喘av呻吟久久| 久久久久久黄色| 亚洲视频www| 精品一区二区在线观看| 久久亚区不卡日本| 亚洲看片网站| 精品综合久久久久久8888| 亚洲综合日韩| 国产一区二区看久久| 欧美肥妇bbw| 91老师国产黑色丝袜在线| 久久综合九色综合欧美亚洲| 亚洲国产一区二区在线 | 久久久99精品免费观看不卡| 精品不卡视频| 日日夜夜精品视频天天综合网| 国产日本精品| 国产一区二区看久久| 欧美福利电影网| 国产综合欧美| 青青草精品视频| 久久日一线二线三线suv| 国产精品一二三区| 中文字幕一区二区三区精华液| 欧美特黄a级高清免费大片a级| 国产亚洲欧美中文| 久久av最新网址| 成人一级片在线观看| 亚洲另类春色国产| 6080午夜不卡| 国产日韩欧美一区在线| 国产91精品露脸国语对白| 精品国产伦一区二区三区观看方式| 99re6这里只有精品视频在线观看| 亚洲国产激情av| 在线观看日产精品| 欧美日韩亚洲免费| 国内成人免费视频| 欧美一级片在线| 国产亚洲欧美一区二区三区| 紧缚捆绑精品一区二区| 欧美疯狂做受xxxx富婆| 国产乱码精品一区二区三| 欧美一区三区四区| 国产精品美女黄网| 日韩精彩视频在线观看| 久久一二三国产| 在线观看欧美精品| 亚洲精品乱码久久久久久蜜桃麻豆| 亚洲一区二区三区在线播放| 91成人在线免费观看| 91精品婷婷国产综合久久竹菊| av在线免费不卡| 成人精品小蝌蚪| 欧美一区二区视频在线观看2020 | 精品国产网站在线观看| 久久久精品天堂| 亚洲综合久久久| 成人小视频在线| 欧美日韩中字一区| 日本一区二区高清| 中文字幕欧美国产| 99麻豆久久久国产精品免费优播| 国产精品一区二区三区99| 亚洲精品在线二区| 日本一区免费视频| 欧美精品观看| 国产视频一区在线观看 | 日韩一区二区电影网| 国产一区二区中文| 国产精品自拍毛片| 日日摸夜夜添夜夜添精品视频| 欧美一区二区视频网站| 国产精品一区在线播放| 欧美不卡一卡二卡免费版| 国产成人午夜99999| 蜜桃视频在线一区| 亚洲午夜三级在线| 亚洲视频免费在线| 欧美激情一区二区三区在线| 亚洲欧美日韩另类精品一区二区三区 | 8x福利精品第一导航| 久久riav二区三区| 亚洲区一区二| 国产一区欧美二区| 日韩精品一区第一页| 一区二区三区中文在线| 国产精品灌醉下药二区| 久久久久久免费毛片精品| 日韩一区二区三区四区| 欧美日韩一区高清| 欧美精品一卡| 成人毛片在线观看| 亚洲成人av中文| 亚洲欧美另类久久久精品2019 | 国产日韩精品视频一区| 老牛国产精品一区的观看方式| 成人免费电影视频| 狠狠色丁香婷婷综合久久片| 青娱乐精品视频| 日韩影院免费视频| 香蕉影视欧美成人| 亚洲一区在线看| 一区二区免费看| 一区二区在线观看视频| 亚洲欧美日韩在线| 亚洲欧美综合在线精品| 国产精品不卡在线观看| 国产精品国产三级国产三级人妇| 制服视频三区第一页精品| 中文精品视频一区二区在线观看| 国产大片一区二区| 国产美女一区二区| 国产激情一区二区三区四区| 亚洲成人av一区二区三区| 亚洲午夜精品在线| 亚洲一区在线播放| 亚洲午夜日本在线观看| 亚洲成在人线免费| 丝袜美腿高跟呻吟高潮一区| 偷拍自拍另类欧美| 视频一区二区三区入口| 午夜不卡在线视频| 日韩avvvv在线播放| 免费欧美高清视频| 精品亚洲免费视频| 国产成人在线视频网站| 成人sese在线| 午夜日韩在线| 黄色一区三区| 国产精品日韩一区二区| 色悠悠久久综合| 国产亚洲二区| 亚洲一区激情| 色婷婷精品久久二区二区蜜臀av| 亚洲激情亚洲| 亚洲色诱最新| 91久久线看在观草草青青 |