oracle数据库中的大对象2—— temporary lobs

简介:               到目前为止,我们讨论的都是持久化到数据库中的lob数据,但是实际应用中,我们有时候并不需要将数据持久化到数据库中,那么就需要用到Temporary lob(临时lob),它就像局部变量一样,并不持久化到数据库中。
              到目前为止,我们讨论的都是持久化到数据库中的lob数据,但是实际应用中,我们有时候并不需要将数据持久化到数据库中,那么就需要用到Temporary lob(临时lob),它就像局部变量一样,并不持久化到数据库中。我们将讨论temporary lob和用dbms_lob包来操作它们。

Oracle 8i之后支持创建,解除,访问,更新Temporary lob通过oci(oracle call interface)和dbms_lob包。临时lob的生命周期是在创建它的session内,但是这种lob可以通过程序提前结束。临时性的lob操作性能比持久化的lob高,因为它不需要做log,也不需要undo record。而且,当你更新这种lob时候,oracle拷贝整个lob到一个新的segement中。

             Temporary lob开始创建的时候是空的,你不能使用empty_clob(), empty_blob()函数来初始化它。默认地,所有的temporary lob在创建它的session结束的时候被删除。如果进程突然die或database当掉了,那么也会删除temporary lob,它的存储空间也会被释放。

           要注意的是,temporary lob和persistence lob一样,也是存在数据库的磁盘文件中。不要因为它是临时的lob就认为它是存在内存中的。Temporary lob被写到磁盘中,但是它是不会和特定表的特定lob列关联的,它写到磁盘中是存放在session的临时tablespace中的。所以,你要使用temporary lob,你必须要确认你的临时tablespace是能够容纳你要创建的temporary lob。


下面具体讨论temporary lob的创建和解除。然后看如何测试一个lob locator指向temporarylob或permanent lob。


1 、创建temporay lob

在使用temporay lob之前,我们必须先创建它。这里有两种创建方式:

一种是使用dbms_lob包的createtemporary过程传入相应的参数创建临时的clob或blob。定义如下:

PROCEDURE   createtemporary(  lob_loc IN OUT NOCOPY BLOB,
                                                              cache IN BOOLEAN,
                                                              dur IN PLS_INTEGER := 10);


PROCEDURE  createtemporary( lob_loc IN OUT NOCOPY CLOB CHARACTER SET ANY_CS,
                                                           cache IN BOOLEAN,
                                                           dur IN PLS_INTEGER := 10);
参数 描述
Lob_loc—— 将一个lob_locator传递给这个lob
cache ——是否将这个lob缓存到buffer cache中去
dur —— Duration(生命周期),这个lob的生命周期,默认是session级别,也就是10,有dbms_lob包中的常量DBMS_LOB.SESSION:=10,还可以指定为程序界别:DBMS_LOB.CALL:=12,也就是程序调用结束的时候释放此temporaylob占用的空间。


如:
/**
      使用temporay lob
**/

declare
             directions clob;
begin
          dbms_lob.createtemporary(directions,true);
                                            --如果从数据库中select into的,则为持久化的lob
                                            --select falls_directions into directions from waterfalls where
                                          falls_name='Tannery Falls';
                if(dbms_lob.istemporary(directions)=1) then
                                dbms_output.put_line('directions is temporary!');
              elsif (dbms_lob.istemporary(directions)=0) then
                             dbms_output.put_line('directions is persistence!');
             end if;
end;


第二种方式是,在plsql代码中申明一个lob变量,然后分配一个值给它,那么就隐式地创建了一个生命周期为session的temporary lob。

DECLARE
             temp_clob CLOB;
             temp_blob BLOB;
BEGIN
                      --Assigning a value to a null CLOB or BLOB variable causes
                     --PL/SQL to implicitly create a session-duration temporary
                      --LOB for you.

         temp_clob :=' http://www.nps.gov/piro/';
        temp_blob := HEXTORAW('7A');
END;
这两种方式都是可以的,但是建议使用dbms_lob.createtemporary创建,显示的比较清晰,可读性也强。


2 、解除temporary lob

将一个temporary lob设为invalid,释放它的默认存储空间,通过dbms_lob.freetemporary。
               PROCEDURE freetemporary(lob_loc IN OUT NOCOPY BLOB);
                PROCEDURE freetemporary(lob_loc IN OUT NOCOPY CLOB CHARACTER SET ANY_CS);
/**
free temporary lob     **/

DECLARE
                temp_clob CLOB;
                temp_blob BLOB;
BEGIN
                                   --implict create a clob and a blob in session
              temp_clob :=' http://www.exploringthenorth.com/alger/alger.html';
             temp_blob := HEXTORAW('7A');
                                    --free lob
            DBMS_LOB.FREETEMPORARY(temp_clob);
             DBMS_LOB.FREETEMPORARY(temp_blob);
END;


3、 检查一个lob是不是temporary
检查一个lob 是否是temporary,使用dbms_lob 包中的函数isTemporary(lob)来判断。1表示是temporary lob,否则返回0 是持久化lob。


4 、管理temporary lob
Temporary lob 的处理不同于持久化的lob,内部lob,对于temporary lob,oracle缺乏很多的支持,如没有事务管理,不能commit或rollback,不可持续读,下面列出这些缺点:
        1. 如果处理temporary lob 的时候遇到错误,那么必须释放lob,重新处理一遍。
        2. 不可将多个lob locator 分配给同一个temporary lob。
        3. 如果你修改了有lob locator 指向的temporary lob,那么oracle会做深度copy。则不同的locator 看到的数据不一样,为了最小限度深度copy,在调用createtemporary
函数的时候传入nocopy。

        4. 将temporary lob 变成持久化的lob,必须调用dbms_lob.copy方法。

         5. 一个temporary lob 只在创建它的session范围内有效,不能将这个session的temporary locator 传给另一个session。也就是在另一个session中是不可见的。


Oracle 9i release1 可以通过v$temporary_lob 视图查看每个session中缓存了和非缓存了的临时lob。DBA可以通过v$temporary_lobs 和dba_segements查看一个session中的多少空间给了temporary lob。


5 、Native lob operations
在oracle9i之前,必须用lob 的包在sql和plsql中处理lob,比如我们需要对一个clob全部转为大写,如upper(clob),那是不正确的,在oracle 9i中,clob可以使用大部分的varchar2函数,并且有隐式的实现varchar2和clob之间的相互转换。在plsql中,但在sql不可以,你可以使用<,>,=操作符。我们可以分配一个clob 给varchar2。


DECLARE
             name   CLOB;
            name_upper    CLOB;
            directions     CLOB;
            blank_space VARCHAR2(1) := ' ';
BEGIN
                                  --Retrieve a VARCHAR2 into a CLOB, apply a function to a CLOB
SELECT falls_name, SUBSTR(falls_directions,1,500)
                    INTO name, directions
                            FROM waterfalls
                                  WHERE falls_name = 'Munising Falls';
                                 --Uppercase a CLOB
                 name_upper := UPPER(name);
                                  -- Compare two CLOBs
               IF name = name_upper THEN
                      DBMS_OUTPUT.PUT_LINE('We did not need to uppercase the name.');
               END IF;
                                     --Concatenate a CLOB with some VARCHAR2 strings
               IF INSTR(directions,'Mackinac Bridge') <> 0 THEN
                     DBMS_OUTPUT.PUT_LINE('To get to ' || name_upper || blank_space
                                       || 'you must cross the Mackinac Bridge.');
               END IF;
END;


结果是:
To get to MUNISING FALLS you must cross the Mackinac Bridge.
我们看到Munising Falls被转为大写MUNISING FALLS。
注意:这些相互转换,只适用于clob,blob,nclob,不适用于bfile。


6 、oracle提供的lob转换函数
函数 描述
to_clob 将字符数据转为clob。可以是
varchar2,nvachar2,char,nchar,clob,nclob
to_blob 将raw或long raw转为blob
to_nclob 和clob 一样。
to_lob 将raw或long raw转为clob 或blob
to_raw 将blob 转为raw

相关文章
|
8天前
|
存储 Oracle 关系型数据库
数据库数据恢复—ORACLE常见故障的数据恢复方案
Oracle数据库常见故障表现: 1、ORACLE数据库无法启动或无法正常工作。 2、ORACLE ASM存储破坏。 3、ORACLE数据文件丢失。 4、ORACLE数据文件部分损坏。 5、ORACLE DUMP文件损坏。
41 11
|
21天前
|
Oracle 关系型数据库 数据库
Oracle数据恢复—Oracle数据库文件有坏快损坏的数据恢复案例
一台Oracle数据库打开报错,报错信息: “system01.dbf需要更多的恢复来保持一致性,数据库无法打开”。管理员联系我们数据恢复中心寻求帮助,并提供了Oracle_Home目录的所有文件。用户方要求恢复zxfg用户下的数据。 由于数据库没有备份,无法通过备份去恢复数据库。
|
27天前
|
存储 Oracle 关系型数据库
oracle数据恢复—Oracle数据库文件大小变为0kb的数据恢复案例
存储掉盘超过上限,lun无法识别。管理员重组存储的位图信息并导出lun,发现linux操作系统上部署的oracle数据库中有上百个数据文件的大小变为0kb。数据库的大小缩水了80%以上。 取出&并分析oracle数据库的控制文件。重组存储位图信息,重新导出控制文件中记录的数据文件,发现这些文件的大小依然为0kb。
|
14天前
|
存储 Oracle 关系型数据库
服务器数据恢复—华为S5300存储Oracle数据库恢复案例
服务器存储数据恢复环境: 华为S5300存储中有12块FC硬盘,其中11块硬盘作为数据盘组建了一组RAID5阵列,剩下的1块硬盘作为热备盘使用。基于RAID的LUN分配给linux操作系统使用,存放的数据主要是Oracle数据库。 服务器存储故障: RAID5阵列中1块硬盘出现故障离线,热备盘自动激活开始同步数据,在同步数据的过程中又一块硬盘离线,RAID5阵列瘫痪,上层LUN无法使用。
|
22天前
|
SQL Java 数据库连接
canal-starter 监听解析 storeValue 不一样,同样的sql 一个在mybatis执行 一个在数据库操作,导致解析不出正确对象
canal-starter 监听解析 storeValue 不一样,同样的sql 一个在mybatis执行 一个在数据库操作,导致解析不出正确对象
|
4月前
|
监控 Oracle 关系型数据库
"深度剖析:Oracle SGA大小调整策略——从组件解析到动态优化,打造高效数据库性能"
【8月更文挑战第9天】在Oracle数据库性能优化中,系统全局区(SGA)的大小调整至关重要。SGA作为一组共享内存区域,直接影响数据库处理能力和响应速度。本文通过问答形式介绍SGA调整策略:包括SGA的组成(如数据缓冲区、共享池等),如何根据负载与物理内存确定初始大小,手动调整SGA的方法(如使用`ALTER SYSTEM`命令),以及利用自动内存管理(AMM)特性实现智能调整。调整过程中需注意监控与测试,确保稳定性和性能。
364 2
|
5月前
|
存储 缓存 Oracle
Oracle数据库可扩展性和性能
【7月更文挑战第6天】
92 7
|
存储 SQL 负载均衡
达梦数据库与Oracle数据库:功能、性能和适用场景对比
数据库在现代信息技术领域中扮演着至关重要的角色。在企业级应用中,选择正确的数据库管理系统对于数据存储、处理和查询效率至关重要。本文将对比两个备受关注的数据库管理系统——达梦数据库和Oracle数据库,从功能、性能和适用场景等方面进行深入探讨,以帮助读者在选择合适数据库时做出明智的决策。
2844 1
|
SQL Oracle 安全
Oracle优化01-引起数据库性能问题的因素
Oracle优化01-引起数据库性能问题的因素
172 0

推荐镜像

更多