oracle中varchar2字段转clob字段(读取方法为PHP)

本文介绍如何将Oracle数据库中的Varchar2类型字段转换为Clob类型,并提供了一种通过存储过程读取Clob字段内容的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

系统中有一个表的字段(如:content)是varchar2类型(最多只能存储4000字符),不够用了,因此将其改为clob类型(支持4G存储量)。

如果该字段content列不为空的话,不能直接通过sql语句修改其字段类型,会报ORA-22858的错误,如图所示:

解决方法:

1.首先创建一个clob的临时字段:

1 alter table table_name add(tmp clob);

2.然后将content字段内容全部复制到tmp字段中,具体方法请见:

http://my.oschina.net/guyfar/blog/73829

3.修改content字段名为content_bak,将tmp的字段名改为content即可。

1 alter table table_name rename column content to content_bak;
2  
3 alter table  table_name  rename column tmp to content;

到这里就完成了字段类型的转换。

虽然数据类型已经转换完成,会发现调用此字段的程序会报错。那是因为通过sql查询出的clob字段是对象类型,因此会报错。

我是通过存储过程来调用的,存储过程如下:

01 create or replace function getclob(
02  
03      table_name  in varchar2,
04  
05      field_id     in varchar2,
06  
07      field_name  in varchar2,
08  
09      v_id  in number,
10  
11      v_pos  in number) return varchar2
12  
13 is
14  
15      lobloc  clob;
16  
17      buffer  varchar2(32767);
18  
19      amount  number := 2000;
20  
21      offset  number := 1;
22  
23      query_str  varchar2(1000);
24  
25 begin
26  
27    query_str :='select '||field_name||' from '||table_name||' where '||field_id||'= :id ';
28  
29 --initialize buffer with data to be found
30  
31    EXECUTE IMMEDIATE query_str INTO lobloc USING v_id;
32  
33    offset:=offset+(v_pos-1)*2000;
34  
35 --read 2000 varchar2 from the buffer
36  
37    dbms_lob.read(lobloc,amount,offset,buffer);
38  
39     return buffer;
40  
41 exception
42  
43     when no_data_found then
44  
45     return buffer;
46  
47 end;

调用存储过程的PHP方法:

01 function edt_disp_getclob($id$field_id$field_name$len) {
02     $a = 2000;
03     $b $a / 2;
04     if (($len $b) == 0) {
05         $maxpage floor $len $a );
06     else {
07         $maxpage floor $len $a ) + 1;
08     }
09     $i = 0;
10     $con "";
11     $a new DB_Sql ();
12     while $i $maxpage ) {
13         $i $i + 1;
14         $sql "select getclob('table_name','$field_id','$field_name','$id','$i') as h from dual";
15         //echo $sql."<BR>";exit;
16         $a->query ( $sql );
17         if ($a->next_record ()) {
18             $h $a->Record ["h"];
19         }
20         $con $con $h;
21     }
22     if (! empty $con )) {
23         $a->disconnect ();
24     }
25     return $con;
26 }

调用:

1 $con = edt_disp_getclob($id'id''con'$con_len);

参数说明:

$id :要查询的行

id   :按ID查询

con  :字段名称

$con_len  :要查询的字段长度(提前通过sql查出)


将oracle中的varchar2修改为clob:
alter table t_hzoa_sys_alert add texts clob;
update t_hzoa_sys_alert t set t.texts=t.receiveuserid;
alter table t_hzoa_sys_alert drop column receiveuserid;
alter table t_hzoa_sys_alert rename column texts to receiveuserid;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值