两个读写clob字段的小过程

  首先给出建立测试表的语句:

-- 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!






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值