隨筆-88  評論-77  文章-48  trackbacks-0

          使用PL/SQL從數據庫中讀取BLOB對象

          作者:eygle
          出處:
          http://www.eygle.com/blog
          日期:April 30, 2005
          瀏覽次數: 507
          本文鏈接:
          http://www.eygle.com/archives/2005/04/eoaplsqloeaoeae.html

          ? 使用存儲過程(PL/SQL)向數據庫中存儲BLOB對象 | Blog首頁 | 五一的生活 ?


          注意:本文方法僅適用于Oracle10g,由于在Oracle9i中存在Bug,不能使用此方法。
          在Oracle9i中,可以通過java/c編碼實現,但是可能在目標文件名為中文時存在問題。
          1.確認現有對象

          SQL> col fdesc for a30
          SQL> select fid,fname,fdesc from eygle_blob;
          
                 FID FNAME                                              FDESC
          ---------- -------------------------------------------------- ------------------------------
                   1 ShaoLin.jpg                                        少林寺-康熙手書
                   2 DaoYing.jpg                                        倒映
          

          2.創建存儲Directory
          SQL> connect / as sysdba
          Connected.
          SQL> create or replace directory BLOBDIR as 'D:\oradata\Pic';
          
          Directory created.
          
          SQL>
          SQL> grant read,write on directory BLOBDIR to eygle;
          
          Grant succeeded.
          
          SQL>
          

          3.創建存儲過程
          SQL> connect eygle/eygle
          Connected.
          SQL>
          SQL> CREATE OR REPLACE PROCEDURE eygle_dump_blob (piname varchar2,poname varchar2) IS
            2    l_file      UTL_FILE.FILE_TYPE;
            3    l_buffer    RAW(32767);
            4    l_amount    BINARY_INTEGER := 32767;
            5    l_pos       INTEGER := 1;
            6    l_blob      BLOB;
            7    l_blob_len  INTEGER;
            8  BEGIN
            9    SELECT FPIC
           10    INTO      l_blob
           11    FROM      eygle_blob
           12    WHERE  FNAME = piname;
           13
           14    l_blob_len := DBMS_LOB.GETLENGTH(l_blob);
           15    l_file := UTL_FILE.FOPEN('BLOBDIR',poname,'wb', 32767);
           16
           17    WHILE l_pos < l_blob_len LOOP
           18      DBMS_LOB.READ (l_blob, l_amount, l_pos, l_buffer);
           19      UTL_FILE.PUT_RAW(l_file, l_buffer, TRUE);
           20      l_pos := l_pos + l_amount;
           21    END LOOP;
           22
           23    UTL_FILE.FCLOSE(l_file);
           24
           25  EXCEPTION
           26    WHEN OTHERS THEN
           27      IF UTL_FILE.IS_OPEN(l_file) THEN
           28        UTL_FILE.FCLOSE(l_file);
           29      END IF;
           30      RAISE;
           31  END;
           32  /
          
          Procedure created.
          

          4.取出數據
          SQL> host ls -l d:\oradata\Pic
          total 7618
          -rwxrwxrwa   1 gqgai           None            2131553 Apr 19 10:12 DaoYing.jpg
          -rwxrwxrwa   1 gqgai           None            1768198 Apr 19 10:12 ShaoLin.jpg
          
          SQL> exec eygle_dump_blob('ShaoLin.jpg','01.jpg')
          
          PL/SQL procedure successfully completed.
          
          SQL> host ls -l d:\oradata\Pic
          total 11072
          -rwxrwxrwa   1 Administrators  SYSTEM          1768198 Apr 26 07:16 01.jpg
          -rwxrwxrwa   1 gqgai           None            2131553 Apr 19 10:12 DaoYing.jpg
          -rwxrwxrwa   1 gqgai           None            1768198 Apr 19 10:12 ShaoLin.jpg
          
          SQL>
          SQL> exec eygle_dump_blob('DaoYing.jpg','02.jpg')
          
          PL/SQL procedure successfully completed.
          
          SQL> host ls -l d:\oradata\Pic
          total 15236
          -rwxrwxrwa   1 Administrators  SYSTEM          1768198 Apr 26 07:16 01.jpg
          -rwxrwxrwa   1 Administrators  SYSTEM          2131553 Apr 26 07:19 02.jpg
          -rwxrwxrwa   1 gqgai           None            2131553 Apr 19 10:12 DaoYing.jpg
          -rwxrwxrwa   1 gqgai           None            1768198 Apr 19 10:12 ShaoLin.jpg
          
          

          posted on 2006-04-27 09:25 崛起的程序員 閱讀(451) 評論(0)  編輯  收藏 所屬分類: oracle

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


          網站導航:
           
          主站蜘蛛池模板: 水富县| 甘孜县| 米易县| 东乡县| 浙江省| 旌德县| 乳源| 姚安县| 漳浦县| 汉沽区| 揭西县| 东兴市| 板桥市| 墨竹工卡县| 长岭县| 泉州市| 长海县| 民权县| 陆川县| 新兴县| 密山市| 农安县| 定襄县| 镇巴县| 陆丰市| 启东市| 马关县| 高安市| 灵台县| 那曲县| 扎赉特旗| 垦利县| 班玛县| 丽水市| 札达县| 棋牌| 松江区| 遂川县| 玉溪市| 澄城县| 昌宁县|