首先给出建立测试表的语句:
-- Create table
create table T_MATERIALS
(
ID NUMBER(4) not null,
KEYWORDS VARCHAR2(100),
CONTENTS CLOB
);
建一个序列,来当物理主键:
-- Create sequence
create sequence SEQ_MATERIALS
minvalue 1
maxvalue 10000
start with 1
increment by 1
cache 20;
create table T_MATERIALS
(
ID NUMBER(4) not null,
KEYWORDS VARCHAR2(100),
CONTENTS CLOB
);
建一个序列,来当物理主键:
-- Create sequence
create sequence SEQ_MATERIALS
minvalue 1
maxvalue 10000
start with 1
increment by 1
cache 20;
先来一个读的过程:
CREATE OR REPLACE PROCEDURE prc_clob_read(prm_id IN VARCHAR2,prm_cursor OUT SYS_REFCURSOR) IS
varC CLOB;
n_length NUMBER;
n_start NUMBER;
v_string VARCHAR2(32767);
BEGIN
SELECT contents INTO varC FROM t_materials WHERE to_char(id)=prm_id ;
n_length:=length(varc);
n_start:= 1;
dbms_lob.READ(varc,n_length,n_start,v_string);
OPEN prm_cursor FOR
SELECT v_string FROM dual;--此处限制只能是4000,没得办法了!
END prc_clob_read;
再来一个写的过程:
CREATE OR REPLACE PROCEDURE prc_clob_write(prm_id VARCHAR2,
prm_keywords IN VARCHAR2,
prm_contents IN VARCHAR2,
prm_errmsg OUT VARCHAR2) IS
varC CLOB;
n_length NUMBER;
n_start NUMBER;
n_id NUMBER;
n_count NUMBER;
BEGIN
SELECT COUNT(1) INTO n_count FROM t_materials WHERE TO_char(id) = prm_id;
IF n_count = 0 THEN
SELECT seq_materials.NEXTVAL INTO n_id FROM dual;
INSERT INTO t_materials VALUES (n_id, prm_keywords, empty_clob());
SELECT contents INTO varC FROM t_materials WHERE id = n_id FOR UPDATE;
n_length := length(prm_contents);
n_start := dbms_lob.getlength(varC) + 1; --直接给0也可以。
dbms_lob.WRITE(varc, n_length, n_start, prm_contents);
ELSE
SELECT contents
INTO varC
FROM t_materials
WHERE to_char(id) = prm_id
FOR UPDATE;
n_length := length(varc);
n_start := 1;
dbms_lob.erase(varc, n_length, n_start);
n_length := length(prm_contents);
dbms_lob.WRITE(varc, n_length, n_start, prm_contents);
END IF;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
prm_errmsg := SQLERRM;
END prc_clob_write;
说明:
1.COLB类型的读写不是很复杂,只要参考dbms_lob中的给出的几个办法很容易实现lob类型的读写。
2.LOB类型的读写都是通过“定位器”来实现的,也就是说直接select出来的,不能用。
3.当更新lob字段时,要加锁,更新完后commit解锁。
4.有了上面两个方法,就可以在前台调用,实现一个简单的“文档管理器”,我就自娱自乐了一个,感觉挺方便的。但是单个文档不要太大,因为读的
时候可能会出问题,当然解决办法很多,这里只是很简单的应用一下。
5.可能是平时工作的原因,很多的东西需要分类保存,到需要的时候还要一级目录一级目录的找,很麻烦,干脆自己做一个,很简单的一个前台,输入
关键字即可得到自己想要的内容,太方便了。
6.我有个PB做的前台,有兴趣的“同志”QQ Me!