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

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

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

oracle中varchar2字段转clob字段(读取方法为PHP)_第1张图片

解决方法:

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字段是对象类型,因此会报错。

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

view source
print ?
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."
";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;

你可能感兴趣的:(Oracle)