首页 > 数据库 >Oracle - DBMS_LOB函数和用法

Oracle - DBMS_LOB函数和用法

时间:2023-04-17 09:24:40浏览次数:52  
标签:LOB lob DBMS CLOB -- Oracle INTEGER

GETLENGTH
返回指定 LOB 数据的长度的函数
DBMS_LOB.GETLENGTH(lob_loc IN BLOB/CLOB/BFILE/NCLOB) RETURN INTEGER;

OPEN
打开LOB对象
DBMS_LOB.OPEN(
lob_loc IN OUT NOCOPY BLOB/CLOB/BFILE,
open_mode IN BINARY_INTEGER -- 只读:DBMS_LOB.LOB_READONLY;读写:DBMS_LOB.LOB_READWRITE
);

READ
从 LOB 数据中读取指定长度数据到缓冲区(变量中)的过程
DBMS_LOB.READ(
lob_loc IN BLOB/CLOB/BFILE, -- LOB 数据
amount IN OUT NOCOPY BINARY_INTEGER), -- IN:要读取的字符数;OUT:实际读取的字符数
offset IN INTEGER, -- 起始位置
buffer OUT RAW/VARCHAR2 -— 存储返回数据的变量
);
例:
DECLARE

var_clob CLOB;
var_buff VARCHAR2(1000);
var_len NUMBER(4);
var_start NUMBER(4);

BEGIN

SELECT RESUME INTO var_clob FROM TLOB WHERE NO = 1;
var_len := DBMS_LOB.GETLENGTH(varc);
var_start := 1;
DBMS_LOB.READ(var_clob, var_len, var_start, var_buff);
DBMS_OUTPUT.PUT_LINE('RETURN: '||var_buff);

END;


WRITE
将指定数量的数据写入LOB的过程。
DBMS_LOB.WRITE(
lob_loc IN OUT NOCOPY BLOB/CLOB, -- 被写入 LOB
amount IN BINARY_INTEGER, -- 写入长度(指写入 LOB 数据)
offset IN INTEGER, -- 写入起始位置(指被写入 LOB)
buffer IN RAW/VARCHAR2 -- 写入 LOB 的数据
);
例:
DECLARE

v_clob CLOB;
v_wstr VARCHAR2(1000);
v_strat NUMBER(4);
v_len NUMBER(4);

BEGIN

v_wstr := 'CLOB';
v_len := LENGTH(VWSTR);
v_strat := 5;

SELECT RESUME INTO v_clob FROM TLOB WHERE NO = 1 FOR UPDATE; --更新 LOB 数据需要 FOR UPDATE 锁定

DBMS_LOB.WRITE(v_clob, v_len, v_strat, v_wstr);
DBMS_OUTPUT.PUT_LINE('改写结果为: ' || v_clob);

COMMIT;

END;


APPEND
将指定的LOB数据追加到指定的LOB数据后的过程。
DBMS_LOB.APPEND(
dest_lob IN OUT NOCOPY BLOB, --追加到的目标LOB
src_lob IN BLOB -- 用来追加的LOB
);
例:
DECLARE

varcl CLOB;
vastr VARCHAR2(1000);

BEGIN

vastr := ',这是大对象列';
SELECT RESUME INTO varcl FROM TLOB WHERE NO = 1 FOR UPDATE;
DBMS_LOB.APPEND(varcl, vastr);
COMMIT;
DBMS_OUTPUT.PUT_LINE('追加结果为: ' || varcl);

END;

WRITEAPPEND
将缓冲区数据写到LOB尾部
DBMS_LOB.WRITEAPPEND(
lob_loc IN OUT NOCOPY BLOB/CLOB/NCLOB,
amount IN BINARY_INTEGER,
buffer IN RAW/VARCHAR2
);

TRIM
截断LOB数据中从第一位置开始指定长度的部分数据的过程
DBMS_LOB.TRIM(
lob_loc IN OUT NOCOPY BLOB/CLOB/NCLOB, --LOB数据
newlen IN INTEGER -- 阶段长度
);
例:
DECLARE

varc CLOB;
len NUMBER(4);

BEGIN

len := 4;
SELECT RESUME INTO varc FROM TLOB WHERE NO = 1 FOR UPDATE;
DBMS_LOB.TRIM(varc, len);
COMMIT;
DBMS_OUTPUT.PUT_LINE('截断结果为: '||varc);

END;

CLOSE
关闭已经打开的LOB
DBMS_LOB.CLOSE(lob_loc IN OUT NOCOPY BLOB/CLOB/BFILE);

SUBSTR
从LOB数据中提取子字符串的函数。
DBMS_LOB.SUBSTR(
lob_loc IN BLOB/CLOB/BFILE, -- 提取的来源
amount IN INTEGER:=32762, -- 提取长度
offset IN INTEGER:=1 -- 开始位置
)RETURN RAW/VARCHAR2; -- 提取到的内容
例:
DECLARE

vclob CLOB;
sustr VARCHAR2(1000);
len NUMBER(4);
start NUMBER(4);

BEGIN

SELECT RESUME INTO vclob FROM TLOB WHERE NO = 1;
len := 4;
start := 1;
sustr := DBMS_LOB.SUBSTR(vclob, len, start);
DBMS_OUTPUT.PUT_LINE('结果为: '||sustr);

END;


INSTR
从LOB数据中查找子字符串位置的函数。
DBMS_LOB.INSTR(
lob_loc IN BLOB/CLOB/NCLOB/BFILE,
pattern IN RAW/VARCHAR2,
offset IN INTERGER:=1,
nth IN INTEGER:=1
)RETURN INTEGER;
例:
DECLARE

vclob CLOB;
instr VARCHAR2(1000);
sustr VARCHAR2(1000);
len NUMBER(4);

BEGIN

SELECT RESUME INTO vclob FROM TLOB WHERE NO = 1;
sustr := '大对象';
len := DBMS_LOB.INSTR(vclob, instr);
DBMS_OUTPUT.PUT_LINE('位置为: ' || len);

sustr := DBMS_LOB.SUBSTR(vclob, LENGTH(instr), len);
DBMS_OUTPUT.PUT_LINE('位置为' || len || '长度为' || LENGTH(instr) || '的子字符串为:' || sustr);

END;


COMPARE

比较二个大对象是否相等。返回数值0为相等,-1为不相等。

DBMS_LOB.COMPARE(
lob_1 IN BLOB/CLOB/BFILE,
lob_2 IN BLOB/CLOB/BFILE,
amount IN INTEGER:=4294967295, --要比较的字符数(CLOB),字节数(BLOB)
offset_1 IN INTEGER:=1, --lob_1 的起始位置
offset_2 IN INTEGER:=1 --lob_2 的起始位置
);
例:
DECLARE

varc1 CLOB;
varc2 CLOB;
varc3 CLOB;
len NUMBER(4);

BEGIN

SELECT RESUME INTO varc1 FROM TLOB WHERE NO = 1;
SELECT RESUME INTO varc2 FROM TLOB WHERE NO = 2;
SELECT RESUME INTO varc3 FROM TLOB WHERE NO = 3;

len := DBMS_LOB.COMPARE(varc1,varc1);
DBMS_OUTPUT.PUT_LINE('比较的结果为: ' || len);

len := DBMS_LOB.COMPARE(varc2,varc3);
DBMS_OUTPUT.PUT_LINE('比较的结果为: ' || len);

END;


ERASE
删除LOB数据中指定位置的部分数据的过程
DBMS_LOB.ERASE(
lob_loc IN OUT NOCOPY BLOB/CLOB/NCLOB,
amount IN OUT NOCOPY INTEGER, --字符/字节数
offset IN INTEGER:=1 —起始位置
);
例:
DECLARE

vclob CLOB;
len NUMBER(4);
start NUMBER(4);

BEGIN

len := 1;
start := 5;
SELECT RESUME INTO vclob FROM TLOB WHERE NO = 1 FOR UPDATE;
DBMS_LOB.ERASE(vclob, len, start);
COMMIT;
DBMS_OUTPUT.PUT_LINE('擦除结果为: '|| clob);

END;


COPY

从指定位置开始将源LOB复制到目标LOB

DBMS_LOB.COPY(
dest_lob IN OUT NOCOPY BLOB/CLOB/NCLOB, -- 目标的LOB
src_lob IN BLOB/CLOB/NCOB, -- 拷贝的来源的LOB
amount IN INTEGER, -- 拷贝的长度
dest_offset IN INTEGER:=1, -- 目标从哪里开始接收
src_offset IN INTEGER:=1 -- 来源从来历开始拷贝
);
例:
DECLARE

vdest_lob CLOB;
vsrc_lob CLOB;
amount NUMBER;
dest_offset NUMBER;
src_offset NUMBER;

BEGIN

SELECT RESUME INTO vdest_lob FROM TLOB WHERE NO = 1 FOR UPDATE;
SELECT RESUME INTO vsrc_lob FROM TLOB WHERE NO = 2 ;

amount := DBMS_LOB.GETLENGTH(vsrc_lob);
dest_offset := DBMS_LOB.GETLENGTH(vdest_lob) + 1;
src_offset := 1;

DBMS_LOB.COPY(vdest_lob, vsrc_lob, amount, dest_offset, src_offset);
DBMS_OUTPUT.PUT_LINE('拷贝结果为: ' || vdest_lob);

END;


CREATETEMPORARY
在用户的临时表空间中,建立临时LOB
DBMS_LOB.CREATETEMPORARY(
lob_loc IN OUT NOCOPY BLOB/DLOB/NCLOB,
cache IN BOOLEAN, -- 是否将LOB读取到缓冲区
dur IN PLS_INTEGER:=10 -- 指定何时清除临时LOB(10:会话结束时;12:调用结束时)
);

ISTEMPORARY
确定定位符是否为临时LOB
DBMS_LOB.ISTEMPORARY(lob_loc IN BLOB/CLOB/NCLOB) RETURN INTEGER;

FILEEXISTS
确定FILE_LOC对应的OS文件是否存在。1:存在;0:不存在
DBMS_LOB.FILEEXISTS(file_loc IN BFILE) RETURN INTEGER;

FILEGETNAME
获取BFILE定位符所对应的目录别名和文件名
DBMS_LOB.FILEGETNAME(
file_loc IN BFILE,
dir_alias OUT VARCHAR2,
filename OUT VARCHAR2
);

FILEISOPEN
确定BFILE对应的OS文件是否打开
DBMS_LOB.FILEISOPEN(file_loc IN BFILE) RETURN INTEGER;

FREETEMPORARY
释放在默认临时表空间中的临时LOB
DBMS_LOB.FREETEMPORARY(lob_loc IN OUT NOCOPY BLOB/CLOB/NCLOB);

FILEOPEN
打开文件
DBMS_LOB.FILEOPEN(
file_loc IN OUT NOCOPY BFILE,
open_mode IN BINARY_INTEGER:FILE_READONLY
);

LOADBLOBFROMFILE
将BFILE数据装载到BLOB中,并且在装载后取得最新的偏移位置
DBMS_LOB.LOADBLOBFROMFILE(
dest_loc IN OUT NOCOPY BLOB,
src_bfile IN BFILE,
amount IN INTEGER,
dest_offset IN OUT INTEGER,
src_offset IN OUT INTEGER
);
例:
DECLARE

piece_bfile BFILE := BFILENAME('BFILE_DATA','test.jpg'); --创建一个BFILE指针
photo_blob BLOB;

BEGIN

SELECT bifle_content INTO photo_blob FROM bfile_demo WHERE bfile_id = 101;

DBMS_LOB.OPEN(photo_blob, DBMS_LOB.LOB_READWRITE);
DBMS_LOB.OPEN(piece_bfile);

DBMS_LOB.LOADBLOBFROMFILE(photo_blob, piece_bfile, DBMS_LOB.LOBMAXSIZE, 1, 1);

DBMS_LOB.CLOSE(photo_blob);
DBMS_LOB.CLOSE(piece_bfile);

END;


FILECLOSE
关闭打开的BFILE定位符所指向的OS文件
DBMS_LOB.FILECLOSE(FILE_LOC IN OUT NOCOPY BFILE);

FILECLOSEALL
关闭当前会话已经打开的所有BFILE文件
DBMS_LOB.FILECLOSEALL();

参考

http://blog.csdn.net/cunxiyuan108/article/details/16873733

http://www.linuxidc.com/Linux/2011-12/49911.htm

http://www.th7.cn/db/Oracle/201406/58454.shtml
————————————————
版权声明:本文为CSDN博主「袭冷」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/guoxilen/article/details/73470586

标签:LOB,lob,DBMS,CLOB,--,Oracle,INTEGER
From: https://www.cnblogs.com/forestwolf/p/17324728.html

相关文章

  • 史上最全近百条Oracle DBA日常维护SQL脚本指令
    查询碎片程度高(实际使用率小于30%)的表 可以收缩的表条件为什么block>100,因为一些很小的表,只有几行数据实际大小很小,但是block一次性分配就是5个(11g开始默认一次性分配1M的block大小了,见createtablestorged的NEXT参数),5个block相对于几行小表数据来说就相差太大了。算法中/0.9......
  • ORACLE 082
    Oracle0821.表被删除时,表上的约束、索引一起被删除,表被放入回收站(默认)。视图和synonym不会被删除2、TNS\sqlnet\listenner最近看到好多人说到tns或者数据库不能登录等问题,就索性总结了下面的文档。首先来说Oracle的网络结构,往复杂处说能加上加密、LDAP等等。。这里不做讨......
  • ORACLE异常上云解决方案
      下载地址https://www.syjshare.com/res/6CPJ90S9......
  • 9、数据库学习规划:Oracle - 学习规划系列文章
          甲骨文公司的Oracle数据库是笔者认为的目前市面上性能最强大的数据库。其版本也发展到了现在的12c,提供的功能也更加的强大了。以前笔者使用的是9i,十几年过去了,也才发展到12代,说明Oracle数据库的性能和底层技术是非常完善和强大的了。 1、简介;Oracle公司......
  • Oracle12C 调整 sga pga 调优记录
    3.2oracle参数调优查询oracle当前参数配置情况(processs=500;sessions=2280)1)以dba身份登录查看sga和pga情况SGA:SystemGlobalArea是OracleInstance的基本组成部分,在实例启动时分配;系统全局域SGA主要由三部分构成:共享池、数据缓冲区、日志缓冲区。SQL>showparametersga;NA......
  • 查看oracle数据库中的函数
    SQLPLUS下:查看建了哪些函数,注意,引号内大写selectobject_namefromuser_objectswhereobject_type='FUNCTION';查看函数内容,引号内为你要查询的函数名,也要大写selecttextfromuser_sourcewherename='函数名';PLSQLDeveloper下查询用户下的函数:SELECT*FROMdba_objects......
  • 安装SQLServer20xx 提示:需要安装oracle JRE7 更新 51(64位)或更高版本2种解决办法
    这个报错我们有2种方式可以解决,一个是安装提示所说的JRE7,另外一种比较简单,就是不勾选相关功能就不会要求安装JRE了;一、安装OracleJRE7解决方法:先进下面这个网站安装JDK,安装好后配置环境变量,然后重新安装SQLServer2016即可http://www.oracle.com/technetwork/java/javase/do......
  • window10专业版系统,在docker中配置oracle19c
    window10专业版系统,在Docker中配置Oracle19c1.环境说明​ 系统:windows10专业版(已打开与wsl相关的服务)​ Docker:Dokcer4.17.0(已为Docker配置环境变量)2.配置流程<1>镜像拉取​ 首先,打开Docker客户端,在cmd中输入以下命令用以镜像拉取(使用命令行拉取镜像会被默认保存至C盘):doc......
  • sql pivot 多值, oracle pivot 行转列多个字段
    --povot单值点击查看语句select*from(selectt_bcr,t_bcrq,t_sjzfje,t_qs,t_groupfromlichtest_tb_a)t1pivot(min(t_sjzfje)fort_qsin(第一期,第二期,第三期))p--povot多值点击查看语句select*from(selectt_bcr,t_bcrq,t_sjzfje,t_sj......
  • oracle查找重复数据和删除重复数据sql
    查找重复数据sql(思路就是根据需要判断重复数据的字段分组,根据having大于2的就是重复的)--查找某表重复数据selectBUSS_TYPE_ID,BUSS_TYPE,TRADE_VARIETY_ID,TRADE_VARIETY,TRADE_SUBVARIETY_ID,TRADE_SUBVARIETY,......