如何查看和下载Oracle BLOB类型的数据

简介: 如何查看和下载Oracle BLOB类型的数据

工具导出导入blob类型文件

有一个字段是BLOB类型的,里边存储了一个pdf文件。现在想查看这个pdf的具体内容。使用PLSQL Developer竟然报错,看不到具体pdf的内容 (注意:第二天,我又用Foxit Reader 福昕 pdf软件,结果可以打开的,用2345pdf软件是打不开的) 。使用External或Image或HTML查看都看不了。

这里说明一点,如果勾选了下边的“Execute automatically next time”,那么每次打开BLOB都会用你选择的外部软件来打开的。所以,该选项最好不要选择, 万一选择了,那么就可以按ctrl再单击BLOB即可重新打开该对话框。

其实,Oracle自带的“Oracle SQL Developer”这个软件还是比较好的,接下来就使用这个软件来下载数据库中的pdf文件。 双击BLOB字段即可出现编辑按钮,然后点击编辑按钮即可出现对话框。在对话框中可以选择导出到本地或使用外部编辑器打开都行。

代码导出导入blob类型文件

使用以下代码可以插入BLOB类型的图片或pdf文档到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或其它格式的文件,那么在导出完成后只需要将文件的后缀名修改掉即可,并不会损坏文件。

LOB类型的数据大小

Oracle中 lob字段采用独立的lob segment来存储,因此表的大小不能只查看dba_segments.

mos给出了查询语句:

How to Compute the Size of a Table containing Outline CLOBs and BLOBs (文档 ID 118531.1)

-- 某个含lob字段的表大小
SELECT
 (SELECT trunc(SUM(S.BYTES)/1024/1024/1024) 
  FROM DBA_SEGMENTS S
  WHERE S.OWNER = UPPER('&&SCHEMA') AND
       (S.SEGMENT_NAME = UPPER('&&TABNAME'))) as tbsize_g,
 (SELECT trunc(SUM(S.BYTES)/1024/1024/1024)   
  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'))) as lobsize_g,
 (SELECT trunc(SUM(S.BYTES)/1024/1024/1024)   
  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')))  as lobindexsize_g ,
(select count(*) from &&SCHEMA..&&TABNAME)
FROM DUAL;



------------ 含LOB字段的表总大小
SELECT
  (SELECT trunc(SUM(S.BYTES)/1024/1024/1024)                      -- The Table Segment size
  FROM DBA_SEGMENTS S, DBA_LOBS L
  WHERE S.OWNER = UPPER('&&SCHEMA') and L.TABLE_NAME = S.SEGMENT_NAME ) as tbsize_g,
 (SELECT trunc(SUM(S.BYTES)/1024/1024/1024)                       -- 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.OWNER = UPPER('&&SCHEMA')))  as lobsize_g,
 (SELECT trunc(SUM(S.BYTES)/1024/1024/1024)           -- The Lob Index size
  FROM DBA_SEGMENTS S, DBA_INDEXES I
  WHERE S.OWNER = UPPER('&&SCHEMA') AND
       (I.INDEX_NAME = S.SEGMENT_NAME  AND INDEX_TYPE = 'LOB' AND I.OWNER = UPPER('&&SCHEMA'))) as lobindexsize_g
FROM DUAL; 

目录
相关文章
|
1天前
|
SQL Oracle 关系型数据库
不小心删除表或数据后,如何利用Oracle的闪回进行恢复
不小心删除表或数据后,如何利用Oracle的闪回进行恢复
|
7天前
|
Oracle 安全 关系型数据库
Oracle数据守卫(DG):数据的“守护者”与“时光机”
【4月更文挑战第19天】Oracle Data Guard保障数据安全,通过实时维护备库实现故障切换,保证业务连续性。它使用日志传输和应用保持数据同步,如同“时光机”,借助闪回技术能恢复误操作数据。此外,它还提供数据压缩、加密和故障转移等功能,提升数据库安全性与性能。作为数据管理员,理解并善用Data Guard是确保企业数据安全的关键。
|
7天前
|
存储 NoSQL Oracle
Oracle 12c的内存列存储:数据的“闪电侠”
【4月更文挑战第19天】Oracle 12c的内存列存储以超高速度革新数据处理,结合列存储与内存技术,实现快速查询与压缩。它支持向量化查询和并行处理,提升效率,但需合理配置以平衡系统资源。作为数据管理员,应善用此功能,适应业务需求和技术发展。
|
7天前
|
存储 Oracle 关系型数据库
Oracle 12c的多重索引:数据的“多维导航仪”
【4月更文挑战第19天】Oracle 12c的多重索引提升数据查询效率,如同多维导航仪。在同一表上创建针对不同列的多个索引,加速检索过程。虽然过多索引会增加存储和维护成本,但合理选择和使用索引策略,结合位图、函数索引等高级特性,能优化查询,应对复杂场景。数据管理员应善用这些工具,根据需求进行索引管理,支持企业数据分析。
|
7天前
|
存储 Oracle 数据管理
Oracle 12c的自动数据优化(ADO)与热图:数据管理的“瘦身”与“透视”艺术
【4月更文挑战第19天】Oracle 12c的ADO和热图技术革新数据管理。ADO智能清理无用数据,优化存储,提升查询速度,实现数据&quot;瘦身&quot;;热图则以直观的视觉表示展示数据分布和状态,助力识别性能瓶颈,犹如数据的&quot;透视&quot;工具。这两项技术结合,强化数据管理,为企业业务发展保驾护航。
|
7天前
|
SQL Oracle 关系型数据库
Oracle的PL/SQL游标属性:数据的“导航仪”与“仪表盘”
【4月更文挑战第19天】Oracle PL/SQL游标属性如同车辆的导航仪和仪表盘,提供丰富信息和控制。 `%FOUND`和`%NOTFOUND`指示数据读取状态,`%ROWCOUNT`记录处理行数,`%ISOPEN`显示游标状态。还有`%BULK_ROWCOUNT`和`%BULK_EXCEPTIONS`增强处理灵活性。通过实例展示了如何在数据处理中利用这些属性监控和控制流程,提高效率和准确性。掌握游标属性是提升数据处理能力的关键。
|
7天前
|
SQL Oracle 安全
Oracle的PL/SQL循环语句:数据的“旋转木马”与“无限之旅”
【4月更文挑战第19天】Oracle PL/SQL中的循环语句(LOOP、EXIT WHEN、FOR、WHILE)是处理数据的关键工具,用于批量操作、报表生成和复杂业务逻辑。LOOP提供无限循环,可通过EXIT WHEN设定退出条件;FOR循环适用于固定次数迭代,WHILE循环基于条件判断执行。有效使用循环能提高效率,但需注意避免无限循环和优化大数据处理性能。掌握循环语句,将使数据处理更加高效和便捷。
|
15天前
|
SQL Oracle 关系型数据库
【Oracle】玩转Oracle数据库(一):装上去,飞起来!
【Oracle】玩转Oracle数据库(一):装上去,飞起来!
56 7
|
1月前
|
Oracle 关系型数据库 数据库
|
1月前
|
Oracle 关系型数据库 数据库
Oracle数据库基本概念理解(3)
Oracle数据库基本概念理解(3)
18 2

推荐镜像

更多