隨筆-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 崛起的程序員 閱讀(444) 評論(0)  編輯  收藏 所屬分類: oracle

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


          網站導航:
           
          主站蜘蛛池模板: 那坡县| 新宾| 西充县| 句容市| 迁安市| 阳春市| 肥乡县| 锡林浩特市| 安阳市| 资中县| 如东县| 丹东市| 泰来县| 龙游县| 马鞍山市| 浪卡子县| 辰溪县| 盐边县| 桂东县| 涟水县| 呼图壁县| 临洮县| 那坡县| 哈密市| 稻城县| 闸北区| 青川县| 涞源县| 定日县| 光山县| 仁布县| 阿鲁科尔沁旗| 曲沃县| 梅州市| 云龙县| 顺义区| 北辰区| 抚宁县| 五常市| 杭锦后旗| 景德镇市|