Files
openGauss-server/contrib/gms_lob/sql/gms_lob.sql
2024-10-22 18:57:56 +08:00

991 lines
19 KiB
PL/PgSQL

drop database if exists testlob;
create database testlob;
\c testlob
create extension gms_lob;
create extension gms_output;
select gms_output.enable(4000);
create or replace function cast_to_raw(strdata varchar2) returns raw
as 'select encode(cast($1 as bytea), ''hex'')::raw;'LANGUAGE SQL;
--测试blob类型长度
CREATE TABLE testblob(id INT, b BLOB);
--cast_to_raw
INSERT INTO testblob VALUES(1, cast_to_raw('Blob'));
INSERT INTO testblob VALUES(2, cast_to_raw('中文测试'));
INSERT INTO testblob VALUES(3, cast_to_raw(''));
INSERT INTO testblob VALUES(4, cast_to_raw('test
test'));
SELECT id, gms_lob.getlength(b) FROM testblob;
DROP TABLE testblob;
--测试clob类型的长度
CREATE TABLE testclob(id INT, b CLOB);
INSERT INTO testclob VALUES(1, ('Blob'));
INSERT INTO testclob VALUES(2, ('中文测试'));
INSERT INTO testclob VALUES(3, (''));
INSERT INTO testclob VALUES(4, ('test
test'));
SELECT *,gms_lob.getlength(b) FROM testclob;
DROP TABLE testclob;
--在函数中调用
CREATE OR REPLACE FUNCTION fun_blob() RETURNS INTEGER LANGUAGE plpgsql AS $$
DECLARE
lob_object BLOB := cast_to_raw('中文1');
offset INTEGER;
BEGIN
RETURN gms_lob.getlength(lob_object);
END;
$$;
SELECT fun_blob();
CREATE OR REPLACE FUNCTION fun_clob() RETURNS INTEGER LANGUAGE plpgsql AS $$
DECLARE
lob_object CLOB := ('中文1');
offset INTEGER;
BEGIN
RETURN gms_lob.getlength(lob_object);
END;
$$;
SELECT fun_clob();
CREATE OR REPLACE FUNCTION fun_null() RETURNS INTEGER LANGUAGE plpgsql AS $$
DECLARE
lob_object CLOB;
offset INTEGER;
BEGIN
RETURN gms_lob.getlength(lob_object);
END;
$$;
SELECT fun_null();
DROP FUNCTION fun_blob;
DROP FUNCTION fun_clob;
DROP FUNCTION fun_null;
--测试输入为空的场景
SELECT gms_lob.getlength();
create table tbl_testlob(id int, c_lob clob, b_lob blob);
insert into tbl_testlob values(1, 'clob', cast_to_raw('blob'));
insert into tbl_testlob values(2, '中文clobobject测试', cast_to_raw('中文blobobject测试'));
create or replace function func_clob() returns void
AS $$
DECLARE
v_clob1 clob;
v_clob2 clob;
v_clob3 clob;
len1 int;
len3 int;
BEGIN
select c_lob into v_clob1 from tbl_testlob where id = 1;
gms_lob.open(v_clob1, gms_lob.LOB_READWRITE);
gms_lob.append(v_clob1, ' test');
len1 := gms_lob.getlength(v_clob1);
gms_output.put_line('clob2:' || v_clob2);
gms_lob.read(v_clob1, len1, 1, v_clob2);
gms_output.put_line('clob1:' || v_clob1);
gms_output.put_line('clob2:' || v_clob2);
select c_lob into v_clob3 from tbl_testlob where id = 2;
len3 := gms_lob.getlength(v_clob3);
gms_output.put_line('clob3:' || v_clob3);
--不调用open函数。默认权限为读写
gms_lob.write(v_clob3, len1, len3, v_clob1);
gms_output.put_line('clob3:' || v_clob3);
gms_lob.close(v_clob1);
gms_lob.freetemporary(v_clob2);
END;
$$LANGUAGE plpgsql;
create or replace function func_blob() returns void
AS $$
DECLARE
v_blob1 blob;
v_blob2 blob;
v_blob3 blob;
len1 int;
len3 int;
BEGIN
select b_lob into v_blob1 from tbl_testlob where id = 1;
gms_lob.open(v_blob1, gms_lob.LOB_READWRITE);
len1 := gms_lob.getlength(v_blob1);
gms_output.put_line('blob1:' || v_blob1::text);
gms_output.put_line('blob2:' || v_blob2::text);
gms_lob.read(v_blob1, len1, 1, v_blob2);
gms_output.put_line('blob1:' || v_blob1::text);
gms_output.put_line('blob2:' || v_blob2::text);
select b_lob into v_blob3 from tbl_testlob where id = 2;
len3 := gms_lob.getlength(v_blob3);
--不调用open函数。默认权限为读写
gms_output.put_line('blob3:' || v_blob3::text);
gms_lob.write(v_blob3, len1, len3, v_blob1);
gms_output.put_line('blob3:' || v_blob3::text);
gms_lob.close(v_blob1);
gms_lob.freetemporary(v_blob2);
END;
$$LANGUAGE plpgsql;
select func_clob();
select func_blob();
----------open函数-----------
--(1)打开无效的lob
DECLARE
v_clob clob;
BEGIN
gms_lob.open(v_clob, gms_lob.LOB_READWRITE);
gms_lob.close(v_clob);
END;
/
--(2)open_mode为数值
DECLARE
v_clob clob;
BEGIN
gms_lob.createtemporary(v_clob, false, 10);
gms_lob.open(v_clob, 1);
gms_lob.close(v_clob);
gms_lob.freetemporary(v_clob);
END;
/
--(3)open_mode为其他值
DECLARE
v_clob clob;
BEGIN
gms_lob.createtemporary(v_clob, false);
gms_lob.open(v_clob, 100);
gms_lob.close(v_clob);
gms_lob.freetemporary(v_clob);
END;
/
--重复打开
DECLARE
v_clob clob;
BEGIN
gms_lob.createtemporary(v_clob, false);
gms_lob.open(v_clob, gms_lob.LOB_READONLY);
gms_lob.open(v_clob, gms_lob.LOB_READWRITE);
gms_lob.close(v_clob);
gms_lob.freetemporary(v_clob);
END;
/
-- 大写名称
declare
"MYLOB" CLOB;
begin
gms_lob.createtemporary("MYLOB",true);
gms_lob.open("MYLOB",gms_lob.lob_readwrite);
"MYLOB":='foo';
raise notice '%',"MYLOB";
end;
/
----------isopen函数-----------
DECLARE
v_clob clob;
BEGIN
gms_lob.createtemporary(v_clob, false);
gms_lob.open(v_clob, gms_lob.LOB_READWRITE);
gms_output.put_line('isopen: ' || gms_lob.isopen(v_clob));
gms_lob.close(v_clob);
gms_output.put_line('isopen: ' || gms_lob.isopen(v_clob));
gms_lob.freetemporary(v_clob);
END;
/
-----------freetemporary函数-----------
DECLARE
v_clob CLOB;
v_char VARCHAR2(100);
BEGIN
v_char := 'Chinese中国人';
gms_lob.createtemporary(v_clob,TRUE,12);
gms_lob.append(v_clob,v_char);
gms_output.put_line(v_clob||' 字符长度:'||gms_lob.getlength(v_clob));
gms_lob.freetemporary(v_clob);
gms_output.put_line(' 释放后再输出:'||v_clob);
END;
/
drop table tbl_testlob;
drop function func_clob;
drop function func_blob;
declare
lob1 clob := '123';
lob2 clob := '456';
lob3 clob := '789';
begin
gms_lob.open (lob_loc => lob1,open_mode => 1);
gms_lob.open (lob_loc => lob2,open_mode => gms_lob.lob_readwrite);
gms_lob.open (lob_loc => lob3,open_mode => gms_lob.lob_readonly);
raise notice '%,%,%',lob1,lob2,lob3;
end;
/
-- 支持GMS_LOB.WRITE/READ/APPEND函数
-----------read函数-----------
--gms_lob.gms_lob_read_blob
declare
b1 blob :=cast_to_raw('ABCDEFGH');
amount INTEGER :=3;
off_set INTEGER :=2;
b2 blob :=cast_to_raw('abc');
r1 raw;
begin
gms_lob.write(b1, amount, off_set, b2);
gms_lob.read(b1, amount, off_set, r1);
gms_output.put_line(r1::text);
end;
/
-- float
declare
b1 blob :=cast_to_raw('ABCDEFGH');
amount float :=3.2;
off_set float :=2.1;
b2 blob :=cast_to_raw('abc');
r1 raw;
begin
gms_lob.write(b1, amount, off_set, b2);
gms_lob.read(b1, amount, off_set, r1);
gms_output.put_line(r1::text);
end;
/
declare
b1 blob :=cast_to_raw('ABCDEFGH');
amount float :=3.8;
off_set float :=2.9;
b2 blob :=cast_to_raw('abc');
r1 raw;
begin
gms_lob.write(b1, amount, off_set, b2);
gms_lob.read(b1, amount, off_set, r1);
gms_output.put_line(r1::text);
end;
/
declare
b1 blob :=cast_to_raw('ABCDEFGH');
amount float :=3.8;
off_set float :=2.9;
r1 raw;
begin
gms_lob.read(b1, amount, off_set, r1);
gms_output.put_line(r1::text);
end;
/
declare
b1 blob :=cast_to_raw('ABCDEFGH');
amount INTEGER :=3;
off_set INTEGER :=8;
b2 blob :=cast_to_raw('abc');
r1 raw;
begin
gms_lob.write(b1, amount, off_set, b2);
gms_lob.read(b1, amount, off_set, r1);
gms_output.put_line(r1::text);
end;
/
declare
b1 blob :=cast_to_raw('ABCDEFGH');
amount INTEGER :=3;
off_set INTEGER :=20;
b2 blob :=cast_to_raw('abc');
r1 raw;
begin
gms_lob.write(b1, amount, off_set, b2);
gms_lob.read(b1, amount, off_set, b2);
gms_output.put_line(r1::text);
end;
/
--VALUEERROR
--lob为空
declare
b1 blob;
amount INTEGER :=3;
off_set INTEGER :=2;
r1 raw;
begin
gms_lob.read(b1, amount, off_set, r1);
end;
/
--amount为空
declare
b1 blob :=cast_to_raw('11111111');
amount INTEGER;
off_set INTEGER :=9;
r1 raw;
begin
gms_lob.read(b1, amount, off_set, r1);
end;
/
--offset为空
declare
b1 blob :=cast_to_raw('11111111');
amount INTEGER :=3;
off_set INTEGER;
r1 raw;
begin
gms_lob.read(b1, amount, off_set, r1);
end;
/
--lob无效
declare
amount INTEGER :=3;
off_set INTEGER :=2;
r1 raw;
begin
gms_lob.read(cast_to_raw('111111'), amount, off_set, r1);
end;
/
--amount大于buffer大小
declare
b1 blob :=cast_to_raw('11111111');
amount INTEGER :=15;
off_set INTEGER :=2;
r1 raw;
begin
gms_lob.read(b1, amount, off_set, r1);
end;
/
--offset超出范围
declare
b1 blob :=cast_to_raw('11111111');
amount INTEGER :=3;
off_set INTEGER :=30;
r1 raw;
begin
gms_lob.read(b1, amount, off_set, r1);
end;
/
--lob只读
declare
b1 blob :=cast_to_raw('1111');
amount INTEGER :=2;
off_set INTEGER :=2;
r1 raw;
begin
gms_lob.open(b1, gms_lob.LOB_READONLY);
gms_lob.read(b1, amount, off_set, r1);
gms_output.put_line(r1::text);
end;
/
--gms_lob.gms_lob_read_clob
declare
c1 clob :='abcdefgh';
amount INTEGER :=3;
off_set INTEGER :=1;
var_buf varchar2(10);
begin
gms_lob.read(c1, amount, off_set, var_buf);
gms_output.put_line('clob read: ' || var_buf::text);
end;
/
declare
c1 clob :='abcdefgh';
amount INTEGER :=3;
off_set INTEGER :=9;
var_buf varchar2(10);
begin
gms_lob.read(c1, amount, off_set, var_buf);
gms_output.put_line('clob read: ' || var_buf::text);
end;
/
declare
c1 clob :='abcdefgh';
amount INTEGER :=10;
off_set INTEGER :=2;
var_buf varchar2(10);
begin
gms_lob.read(c1, amount, off_set, var_buf);
gms_output.put_line('clob read: ' || var_buf::text);
end;
/
--VALUEERROR
--lob为空
declare
c1 clob;
amount INTEGER :=3;
off_set INTEGER :=2;
var_buf varchar2(10);
begin
gms_lob.read(c1, amount, off_set, var_buf);
gms_output.put_line('clob read: ' || var_buf::text);
end;
/
--amount为空
declare
c1 clob :='abcdefgh';
amount INTEGER;
off_set INTEGER :=1;
var_buf varchar2(10);
begin
gms_lob.read(c1, amount, off_set, var_buf);
gms_output.put_line('clob read: ' || var_buf::text);
end;
/
--offset为空
declare
c1 clob :='abcdefgh';
amount INTEGER :=3;
off_set INTEGER;
var_buf varchar2(10);
begin
gms_lob.read(c1, amount, off_set, var_buf);
gms_output.put_line('clob read: ' || var_buf::text);
end;
/
--lob无效
declare
c1 clob;
amount INTEGER :=3;
off_set INTEGER :=2;
var_buf varchar2(10);
begin
gms_lob.read(c1, amount, off_set, var_buf);
gms_output.put_line('clob read: ' || var_buf::text);
end;
/
--amount大于buffer大小
declare
c1 clob :='abcdefgh';
amount INTEGER :=6;
off_set INTEGER :=2;
var_buf varchar2(3);
begin
gms_lob.read(c1, amount, off_set, var_buf);
gms_output.put_line('clob read: ' || var_buf::text);
end;
/
--offset超出范围
declare
c1 clob :='abcdefgh';
amount INTEGER :=2;
off_set INTEGER :=0;
var_buf varchar2(3);
begin
gms_lob.read(c1, amount, off_set, var_buf);
gms_output.put_line('clob read: ' || var_buf::text);
end;
/
--lob只读
declare
c1 clob :='1111';
amount INTEGER :=2;
off_set INTEGER :=2;
var_buf varchar2(10);
begin
gms_lob.open(c1, gms_lob.LOB_READONLY);
gms_lob.read(c1, amount, off_set, var_buf);
gms_output.put_line('clob read: ' || var_buf::text);
end;
/
-----------write函数-----------
--gms_lob.gms_lob_write_blob
declare
b1 blob :=cast_to_raw('ABCDEFGH');
amount INTEGER :=3;
off_set INTEGER :=2;
b2 blob :=cast_to_raw('abc');
begin
gms_lob.write(b1, amount, off_set, b2);
gms_output.put_line(b1::text);
end;
/
declare
b1 blob :=cast_to_raw('ABCDEFGH');
amount INTEGER :=3;
off_set INTEGER :=8;
b2 blob :=cast_to_raw('abc');
begin
gms_lob.write(b1, amount, off_set, b2);
gms_output.put_line(b1::text);
end;
/
declare
b1 blob :=cast_to_raw('ABCDEFGH');
amount INTEGER :=3;
off_set INTEGER :=20;
b2 blob :=cast_to_raw('abc');
begin
gms_lob.write(b1, amount, off_set, b2);
gms_output.put_line(b1::text);
end;
/
--buffer等于destlob
declare
b1 blob :=cast_to_raw('1234');
amount INTEGER :=2;
off_set INTEGER :=2;
begin
gms_lob.write(b1, amount, off_set, b1);
gms_output.put_line(b1::text);
end;
/
--VALUEERROR
--lob为空
declare
b1 blob;
amount INTEGER :=3;
off_set INTEGER :=2;
b2 blob :=cast_to_raw('222');
begin
gms_lob.write(b1, amount, off_set, b2);
end;
/
--amount为空
declare
b1 blob :=cast_to_raw('11111111');
amount INTEGER;
off_set INTEGER :=9;
b2 blob :=cast_to_raw('222');
begin
gms_lob.write(b1, amount, off_set, b2);
end;
/
--amount,offset向下取整
declare
b1 blob :=cast_to_raw('ABCDEFGH');
amount float :=3.9; -- 3
off_set float :=5.6; -- 5
b2 blob :=cast_to_raw('abc');
r1 raw;
begin
gms_lob.write(b1, amount, off_set, b2);
gms_output.put_line(b1::text);
end;
/
declare
b1 blob :=cast_to_raw('ABCDEFGH');
amount float :=2.2; -- 2
off_set float :=5.1; -- 5
b2 blob :=cast_to_raw('abc');
begin
gms_lob.write(b1, amount, off_set, b2);
gms_output.put_line(b1::text);
end;
/
declare
b1 blob :=cast_to_raw('ABCDEFGH');
amount INTEGER :=4;
off_set INTEGER :=8;
b2 blob :=cast_to_raw('abc');
begin
gms_lob.write(b1, amount, off_set, b2);
gms_output.put_line(b1::text);
end;
/
--offset为空
declare
b1 blob :=cast_to_raw('11111111');
amount INTEGER :=3;
off_set INTEGER;
b2 blob :=cast_to_raw('222');
begin
gms_lob.write(b1, amount, off_set, b2);
end;
/
--lob无效
declare
amount INTEGER :=3;
off_set INTEGER :=2;
b2 blob :=cast_to_raw('222');
begin
gms_lob.write(cast_to_raw('111111'), amount, off_set, b2);
end;
/
--amount大于buffer大小
declare
b1 blob :=cast_to_raw('11111111');
amount INTEGER :=5;
off_set INTEGER :=2;
b2 blob :=cast_to_raw('222');
begin
gms_lob.write(b1, amount, off_set, b2);
end;
/
--offset超出范围
declare
b1 blob :=cast_to_raw('11111111');
amount INTEGER :=3;
off_set INTEGER :=0;
b2 blob :=cast_to_raw('222');
begin
gms_lob.write(b1, amount, off_set, b2);
end;
/
--lob只读
declare
b1 blob :=cast_to_raw('1111');
amount INTEGER :=2;
off_set INTEGER :=2;
b2 blob :=cast_to_raw('222');
begin
gms_lob.open(b1, gms_lob.LOB_READONLY);
gms_lob.write(b1, amount, off_set, b2);
end;
/
--gms_lob.gms_lob_write_clob
declare
c1 clob :='11111111';
amount INTEGER :=3;
off_set INTEGER :=1;
c2 clob :='222';
begin
gms_lob.write(c1, amount, off_set, c2);
gms_output.put_line(c1::text);
end;
/
-- amount, off_set 不向下取整
declare
c1 clob :='11111111';
amount INTEGER :=3.9;
off_set INTEGER :=1.8;
c2 clob :='222';
begin
gms_lob.write(c1, amount, off_set, c2);
gms_output.put_line(c1::text);
end;
/
declare
c1 clob :='11111111';
amount INTEGER :=3;
off_set INTEGER :=1.8;
c2 clob :='222';
begin
gms_lob.write(c1, amount, off_set, c2);
gms_output.put_line(c1::text);
end;
/
declare
c1 clob :='11111111';
amount INTEGER :=3;
off_set INTEGER :=9;
c2 clob :='222';
begin
gms_lob.write(c1, amount, off_set, c2);
gms_output.put_line(c1::text);
end;
/
declare
c1 clob :='11111111';
amount INTEGER :=3;
off_set INTEGER :=10;
c2 clob :='222';
begin
gms_lob.write(c1, amount, off_set, c2);
gms_output.put_line(c1::text);
end;
/
--buffer等于destlob
declare
c1 clob :='1234';
amount INTEGER :=2;
off_set INTEGER :=2;
begin
gms_lob.write(c1, amount, off_set, c1);
gms_output.put_line(c1::text);
end;
/
--VALUEERROR
--lob为空
declare
c1 clob;
amount INTEGER :=3;
off_set INTEGER :=2;
c2 clob :='222';
begin
gms_lob.write(c1, amount, off_set, c2);
end;
/
--amount为空
declare
c1 clob :='11111111';
amount INTEGER;
off_set INTEGER :=10;
c2 clob :='222';
begin
gms_lob.write(c1, amount, off_set, c2);
end;
/
--offset为空
declare
c1 clob :='11111111';
amount INTEGER :=3;
off_set INTEGER;
c2 clob :='222';
begin
gms_lob.write(c1, amount, off_set, c2);
end;
/
--lob无效
declare
amount INTEGER :=3;
off_set INTEGER :=2;
c2 clob :='222';
begin
gms_lob.write('11111111', amount, off_set, c2);
end;
/
--amount大于buffer大小
declare
c1 clob :='11111111';
amount INTEGER :=5;
off_set INTEGER :=2;
c2 clob :='222';
begin
gms_lob.write(c1, amount, off_set, c2);
end;
/
--offset超出范围
declare
c1 clob :='11111111';
amount INTEGER :=2;
off_set INTEGER :=0;
c2 clob :='222';
begin
gms_lob.write(c1, amount, off_set, c2);
end;
/
--lob只读
declare
c1 clob :='1111';
amount INTEGER :=2;
off_set INTEGER :=2;
c2 clob :='222';
begin
gms_lob.open(c1, gms_lob.LOB_READONLY);
gms_lob.write(c1, amount, off_set, c2);
end;
/
-----------append函数-----------
--gms_lob.gms_lob_append_blob
declare
b1 blob :=cast_to_raw('11111111');
b2 blob :=cast_to_raw('222');
begin
gms_lob.append(b1, b2);
gms_output.put_line(b1::text);
end;
/
--VALUEERROR
--destlob为空
declare
b1 blob;
b2 blob :=cast_to_raw('222');
begin
gms_lob.append(b1, b2);
end;
/
--srclob为空
declare
b1 blob :=cast_to_raw('11111111');
b2 blob;
begin
gms_lob.append(b1, b2);
end;
/
--lob无效
declare
b2 blob :=cast_to_raw('222');
begin
gms_lob.append(cast_to_raw('1111'), b2);
end;
/
--lob只读
declare
b1 blob :=cast_to_raw('1111');
b2 blob :=cast_to_raw('222');
begin
gms_lob.open(b1, gms_lob.LOB_READONLY);
gms_lob.append(b1, b2);
end;
/
--gms_lob.gms_lob_append_clob
declare
c1 clob :='11111111';
c2 clob :='222';
begin
gms_lob.append(c1, c2);
gms_output.put_line(c1::text);
end;
/
--VALUEERROR
--destlob为空
declare
c1 clob;
c2 clob :='222';
begin
gms_lob.append(c1, c2);
end;
/
--srclob为空
declare
c1 clob :='11111111';
c2 clob;
begin
gms_lob.append(c1, c2);
end;
/
--lob无效
declare
c2 clob :='222';
begin
gms_lob.append('1111', c2);
end;
/
--lob只读
declare
c1 clob :='1111';
c2 clob :='222';
begin
gms_lob.open(c1, gms_lob.LOB_READONLY);
gms_lob.append(c1, c2);
end;
/
declare
b1 blob :=cast_to_raw('ABC123');
amount INTEGER :=3;
off_set INTEGER :=100;
b2 blob :=cast_to_raw('abc');
c1 int;
BEGIN
gms_lob.write(b1,amount,off_set,b2);
gms_output.put_line(b1::text);
c1:=gms_lob.getlength(b1);
gms_output.put_line(c1);
end;
/
declare
c1 clob :='ABC123';
amount INTEGER :=3;
off_set INTEGER :=100;
c2 clob :='abc';
begin
gms_lob.write(c1, amount, off_set, c2);
gms_output.put_line(c1::text);
end;
/
declare
b1 blob :=null;
b2 blob :=cast_to_raw('abc');
BEGIN
gms_lob.append(b1,b2);
gms_output.put_line(b1::text);
end;
/
drop table if exists lob_mvcc;
create table lob_mvcc(id int, c_lob clob, b_lob blob);
insert into lob_mvcc values(1, 'clob', cast_to_raw('blob'));
insert into lob_mvcc values(2, '中文clobobject测试', cast_to_raw('中文blobobject测试'));
select * from lob_mvcc order by id;
declare
c1 clob;
c2 clob :='222test';
begin
select c_lob into c1 from lob_mvcc where id=1 for update;
gms_lob.append(c1, c2);
end;
/
select * from lob_mvcc order by id;
drop table lob_mvcc;
create or replace procedure proc_1034970
as
b1 clob :='测试';
b2 clob :='测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试';
begin
gms_lob.open(b1,gms_lob.lob_readwrite);
for i in 1..100 loop
gms_lob.append(b1,b2);
end loop;
end;
/
call proc_1034970();
drop procedure proc_1034970;
\c contrib_regression
drop database if exists testlob;