【DB笔试面试626】在Oracle中,如何查看和下载BLOB类型的数据?

题目部分

在Oracle中,如何查看和下载BLOB类型的数据?

答案部分

BLOB类型的数据存储的是二进制文件,例如pdf、jpg或mp4视频格式文件等。对于BLOB类型的数据,可以使用图形化界面软件(例如PLSQL Developer或Oracle SQL Developer)来下载这些二进制数据,也可以使用PL/SQL程序来对这些数据进行读写。

例如PLSQL Developer:

Oracle SQL Developer:

另外,可以使用以下代码插入BLOB类型的文件到Oracle数据库中:

drop table IMAGE_LOB;
CREATE TABLE IMAGE_LOB (
   T_ID VARCHAR2 (5) NOT NULL,
   T_IMAGE BLOB NOT NULL
   );

--插入blob文件  
CREATE OR REPLACE DIRECTORY IMAGES AS '/home/oracle/';
CREATE OR REPLACE NONEDITIONABLE PROCEDURE IMG_INSERT(TID      VARCHAR2,
                                                      FILENAME VARCHAR2) AS
    F_LOB BFILE;
    B_LOB BLOB;
BEGIN
    INSERT INTO IMAGE_LOB
        (T_ID, T_IMAGE)
    VALUES
        (TID, EMPTY_BLOB()) RETURN T_IMAGE INTO B_LOB;
    F_LOB := BFILENAME('IMAGES', FILENAME);
    DBMS_LOB.FILEOPEN(F_LOB, DBMS_LOB.FILE_READONLY);
    DBMS_LOB.LOADFROMFILE(B_LOB, F_LOB, DBMS_LOB.GETLENGTH(F_LOB));
    DBMS_LOB.FILECLOSE(F_LOB);
    COMMIT;
END;
 /
BEGIN
    IMG_INSERT('1','1.jpg');
    IMG_INSERT('2','2.jpg');
    IMG_INSERT('3','1.pdf');
 END;
/
select length(t_image) from image_lob; --可以查看该字段占用的空间大小
SELECT * FROM image_lob;`

可以使用以下代码导出数据库中的BLOB文件:

DECLARE
    l_file   utl_file.file_type;
    --l_lob    BLOB;
    l_offset INT := 1;
    l_amount INT := 32767;
    l_len    INT;
    l_buffer RAW(32767);
BEGIN
    FOR cur IN (SELECT t_image,t.t_id FROM image_lob t) LOOP

                l_file := utl_file.fopen('IMAGES', cur.t_id||'.jpg', 'wb', 32767);
        l_len  := dbms_lob.getlength(cur.t_image);
                l_offset := 1;   

        WHILE l_offset < l_len LOOP
            dbms_lob.read(cur.t_image, l_amount, l_offset, l_buffer);
            utl_file.put_raw(l_file, l_buffer, TRUE);
            l_offset := l_offset + l_amount;
        END LOOP; 

        utl_file.fclose(l_file);

    END LOOP;
END;
/

需要注意的是,这里导出的文件都是jpg格式的,如果存储的是pdf或其它格式的文件,那么在导出完成后只需要将文件的后缀名修改掉即可,并不会损坏文件。

Oracle中的lob字段采用独立的Lob Segment来存储,因此表的大小不能只查看DBA_SEGMENTS视图,还需要和DBA_LOBS视图结合来查看。另外,也可以通过LENGTH函数来查看LOB类型的字段占用的空间大小。Mos(How to Compute the Size of a Table containing Outline CLOBs and BLOBs(文档ID 118531.1))给出了查询语句:

ACCEPT SCHEMA PROMPT 'Table Owner: '
ACCEPT TABNAME PROMPT 'Table Name:  '
SELECT
 (SELECT SUM(S.BYTES)                             -- The Table Segment size
  FROM DBA_SEGMENTS S
  WHERE S.OWNER = UPPER('&SCHEMA') AND
       (S.SEGMENT_NAME = UPPER('&TABNAME'))) +
 (SELECT SUM(S.BYTES)                              -- The Lob Segment Size
  FROM DBA_SEGMENTS S, DBA_LOBS L
  WHERE S.OWNER = UPPER('&SCHEMA') AND
       (L.SEGMENT_NAME = S.SEGMENT_NAME AND L.TABLE_NAME = UPPER('&TABNAME') AND L.OWNER = UPPER('&SCHEMA'))) +
 (SELECT SUM(S.BYTES)                               -- The Lob Index size
  FROM DBA_SEGMENTS S, DBA_INDEXES I
  WHERE S.OWNER = UPPER('&SCHEMA') AND
       (I.INDEX_NAME = S.SEGMENT_NAME AND I.TABLE_NAME = UPPER('&TABNAME') AND INDEX_TYPE = 'LOB' AND I.OWNER = UPPER('&SCHEMA')))
  "TOTAL TABLE SIZE"
FROM DUAL;

& 说明:

有关BLOB的更多内容可以参考我的BLOG:http://blog.itpub.net/26736162/viewspace-2639269/

本文选自《Oracle程序员面试笔试宝典》,作者:李华荣。

本文分享自微信公众号 - DB宝(xiaomaimiaolhr)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-08-28

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏运维经验分享

mongodb 3.4 集群搭建升级版 五台集群 原

最新版mongodb推荐使用yaml语法来做配置,另外一些旧的配置在最新版本中已经不在生效,所以我们在生产实际搭建mongodb集群的时候做了一些改进。如果大家...

13740
来自专栏腾讯数据库技术

深入浅出InnoDB MLOG CHECKPOINT

提示:公众号展示代码会自动折行,建议横屏阅读 1 MLOG CHECKPOINT是什么 在MySQL 5.7存储引擎InnoDB崩溃恢复中,我们一定看到过M...

15920
来自专栏运维经验分享

搭建高可用mongodb集群(四)—— 分片 原

Posted on 29 三月, 2014 by lanceyan | 104 Replies

12440
来自专栏运维经验分享

MongoDB分片集群搭建 原

©著作权归作者所有:来自51CTO博客作者三和梁朝伟的原创作品,如需转载,请注明出处,否则将追究法律责任

8240
来自专栏运维经验分享

MongoDB3.6集群搭建(分片+副本集) 原

分片则指为处理大量数据,将数据分开存储,不同服务器保存不同的数据,它们的数据总和即为整个数据集。追求的是高性能。 在生产环境中,通常是这两种技术结合使用,分片...

8820
来自专栏腾讯云数据库(TencentDB)

为传统银行换“心”,腾讯TDSQL成为首款应用于银行传统核心的国产分布式数据库

☆   点击▲关注 腾讯云数据库 ☆ 实现信息技术的自主可控,可以说是金融行业最紧迫、最重要的推进战略了。 人民银行、银保监会等主管部门密集出台文件,指导金...

14240
来自专栏运维经验分享

MongoDB集群管理工具UMongo 原

UMongo (前身是 JMongoBrowser) 是一个图形化界面的工具,用来浏览和管理 MongoDB 集群,支持 Linux, Windows 和 Ma...

11860
来自专栏运维经验分享

MongoDB之复制集篇 原

当Primary节点完成数据操作后,Secondary会做出一系列的动作保证数据的同步:

13430
来自专栏运维经验分享

mongodb副本集加分片集群安全认证使用账号密码登录 原

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

16750
来自专栏腾讯云TStack专栏

搬运基础服务到kubernetes,遇这3类大坑怎么破?

? 工作中需要将原本部署在物理机或虚拟机上的一些基础服务搬到kubernetes中,在搬的过程中遇到了不少坑,笔者在此特别分享一下所遇到的问题及相应的解决方法...

19350

扫码关注云+社区

领取腾讯云代金券

年度创作总结 领取年终奖励