一、LOB写入测试:
建表:clob_test(id,position_clob,strain_clob);
create or replace PROCEDURE CLOB_WRITE_TEXT AS
V_CLOB CLOB;
BEGIN
--★(1)★遇到大对象列的时候,要首先插入空白构造函数
insert into clob_test(id,position_clob,strain_clob) values(id_seq.nextval,empty_clob(),empty_clob();
--得到clob的指针,并存放在变量v_clob中,这里要加上for update之句,
--表示事务的开始,否则dbms_lob.open 的执行会产生错误
select position_clob into V_CLOB from clob_test where id='1'
for update;
--★(2)★根据clob指针以读写方式打开clob
dbms_lob.open(v_clob,dbms_lob.lob_readwrite);
--★(3)★然后就是写入数据了,格式:DBMS_LOB.Write(被写入LOB, 写入长度(指写入LOB数据),写入起始位置(指被写入LOB),写入LOB数据);
--往lob中写入字符mis,3表示被写的字符数量,1表示开始写的位置,下面的语句表示字符串中只有3个字符被写入lob中
dbms_lob.write(v_clob,3,1,'mis');
--★注:这里还有一个函数要注意,writeappend:将缓冲区的数据追加到lob的末尾;
--格式:DBMS_LOB.WRITEAPPEND(lob_loc IN OUT NOCOPY BLOB/CLOB/NCLOB,
-- amount IN BINARY_INTEGER,
-- buffer IN RAW/VARCHAR2
-- );
--下面的语句表示字符串中只有前20个字符被追加写入到了v_clob中
dbms_lob.writeappend(v_clob,20,'shtgfsvgsdfrnyerergbfghgl.,mnbgaewbtnmgigynbrdfgi,ommnsbcdsfb');
--★(4)★最后关闭lob指针
dbms_lob.close(v_clob);
--提交修改
commit;
exception
when others then
--出现错误,提示失败
dbms_output.put_line('失败!');
rollback;
END CLOB_WRITE_TEXT;
二、LOB读取测试
对一中的表中的clob类型的列的数据做读取操作:
create or replace PROCEDURE CLOB_READ_TEXT AS
--定义把数据读取出来的clob变量
pclob CLOB;
sclob CLOB;
read_id number;
p_out varchar2(32767);
s_out varchar2(32767);
p_read_lenth number;
s_read_lenth number;
begin
--获得一个lob locator
select POSITION_CLOB into pclob from clob_test where id = '1';
select STRAIN_CLOB into sclob from clob_test where id = '1';
--将要读取lob整个长度的字符
p_read_lenth :=LENGTH(pclob);
s_read_lenth :=LENGTH(sclob);
--★读取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 -— 存储返回数据的变量
-- );
--下面的 1 表示从第一个字符开始读取,读取的字符放在变量x_out中
dbms_lob.read(pclob,p_read_lenth,1,p_out);
dbms_lob.read(sclob,s_read_lenth,1,s_out);
--显示读取的结果
--select id into read_id from clob_test;
dbms_output.put_line('当前的id值:'||read_id);
dbms_output.put_line('position的clob字符串:'||p_out);
dbms_output.put_line('长度为:'|| length(p_out));
dbms_output.put_line('strain的clob字符串:'||s_out);
dbms_output.put_line('长度为:'|| length(s_out));
end CLOB_READ_TEXT;
三、LOB截取测试
对一中的clob_test表中的clob类型的列的数据做读取操作:
create or replace PROCEDURE CLOB_SUBSTR_TEXT(p_out_array out array.filename_array ) AS
v_amount INT;
v_offset INT;
pclob CLOB;
p_read_lenth number;
p_out varchar2(32767);
v_clob1 varchar2(32767);
str1 varchar2(32767);
l_LEN integer;
i integer;
BEGIN
--数组初始化
p_out_array := array.filename_array();
--数组扩展到10000个元素
p_out_array.extend(10000);
select POSITION_CLOB into pclob from clob_test where id = '2';
p_read_lenth :=LENGTH(pclob);
--p_out为输出的源串
dbms_lob.read(pclob,p_read_lenth,1,p_out);
--以逗号为分隔符截取字符串
str1 := ','||p_out||',';
--计算出有几个“,”(数字)
l_len := length(Translate(str1, ',0123456789 ', ','));
FOR i IN 1..l_len-1 LOOP
--把数字都放数组里
SELECT substr(str1,instr(str1,',',1,i)+1 ,instr(str1,',',1,i+1)-instr(str1,',',1,i)-1 )
INTO p_out_array(i) FROM dual;
--dbms_output.put_line(t(i));
END loop;
--使用 隐式游标 判断数组的数据是否有效,当有数据返回时候该属性为TRUE
if sql%found then
--打印数组
dbms_output.put_line('游标打开!数组数据写入成功!如下:');
FOR i IN 1..l_len-1 LOOP
dbms_output.put_line(p_out_array(i));
END loop;
else
dbms_output.put_line('游标未打开!');
end if;
--★截取clob部份字符串★ 注意substr是一个函数而不是一个存储过程,不修改clob变量的值,格式如下:
--DBMS_LOB.SUBSTR(lob_loc IN BLOB/CLOB/BFILE, -- 提取的来源
-- amount IN INTEGER:=32762, -- 提取长度
-- offset IN INTEGER:=1 -- 开始位置
-- )RETURN RAW/VARCHAR2; -- 提取到的内容
v_amount:=11; --截取长度
v_offset:=1; --开始截位置
--截取v_amount长度的字符串赋值给v_clob1
v_clob1 := dbms_lob.substr(p_out,v_amount,v_offset);
dbms_output.put_line(v_clob1);
EXCEPTION
WHEN TOO_MANY_ROWS THEN
DBMS_OUTPUT.PUT_LINE('TOO_MANY_ROWS');
WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('others unknown errors !');
END CLOB_SUBSTR_TEXT;
四、LOB其他函数——后续再抽时间补上
部分参考资料:https://blog.csdn.net/guoxilen/article/details/73470586