注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

Oracle专业打杂

定会重回巅峰……

 
 
 

日志

 
 

如何查看Oracle表中blob字段占用存储空间的大小  

2015-10-14 14:25:17|  分类: Oracle基础知识 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
在项目中遇到一件事,外部人员不能将文件插入到blob字段中,所以过来求援。文件正常插入到数据库中后,又问文件在数据库中占用多大的空间,结果就出事了,具体如下。

--用sys用户创建目录,然后授权给scott读写权限,在c:\tmp1下面存放有1.txt文件,文件大小3.49M
conn / as sysdba
create or replace directory utllobdir as 'c:\tmp1'; 
grant read,write on directory utllobdir to scott;


--用户scott用户连接数据库,创建含有blob对象的表,然后利用存储过程插入数据
conn scott/tiger
-- create table bfile_tab (bfile_column BFILE);
create table t (blob_column BLOB);


--在表T中插入数据
declare
   a_blob  BLOB;
   a_bfile BFILE := BFILENAME('UTLLOBDIR','1.txt'); 
begin
   -- insert into bfile_tab values (a_bfile)  returning bfile_column into a_bfile;
   insert into t values (empty_blob()) returning blob_column into a_blob;
   dbms_lob.fileopen(a_bfile);
   dbms_lob.loadfromfile(a_blob, a_bfile, dbms_lob.getlength(a_bfile));
   dbms_lob.fileclose(a_bfile);
   commit;
end;


--查看表T的大小,可以看出表T的大小是64k
SQL> select segment_name,segment_type,blocks,bytes/1024 from user_segments where segment_name='T';
SEGMENT_NAME         SEGMENT_TYPE           BLOCKS BYTES/1024
-------------------- ------------------ ---------- ----------
T                    TABLE                       8         64


--为表T插入重复的数据,一共是64条相同的数据
SQL> insert into t select * from t;
已创建 1 行。
……
SQL> /
已创建32行。

SQL> select count(*) from t;
  COUNT(*)
----------
        64
--表T目前的大小依然是64K,想想表T不应该这么小,应该是思路出了问题。
SQL> select segment_name,segment_type,blocks,bytes/1024 from user_segments where segment_name='T';
SEGMENT_NAME         SEGMENT_TYPE           BLOCKS BYTES/1024
-------------------- ------------------ ---------- ----------
T                    TABLE                       8         64


--通过查看文献得知可以利用dbms_lob.getlength来得到一行中blob的大小
SQL> CREATE OR REPLACE PROCEDURE getsizeblob IS
 len int;
 fil Blob;
 BEGIN
 SELECT BLOB_COLUMN INTO fil FROM t WHERE rownum= 1;
 len := dbms_lob.getlength(fil);
 dbms_output.put_line(len/1024/1024);
 END;
 /
过程已创建。
--查看rownum=1的blob对象的大小,可以看出是3.49M,与导入的文件大小相同
SQL> set serveroutput on;
SQL> exec getsizeblob;
3.493011474609375
PL/SQL 过程已成功完成。

  评论这张
 
阅读(38)| 评论(1)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017