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

来源:互联网 发布:淘宝产品权重 编辑:程序博客网 时间:2024/06/03 04:06

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

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

解决方法:

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

1alter table table_name add(tmp clob);

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

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

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

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

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

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

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

view source
print?
01create 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 
13is
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 
25begin
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 
41exception
42 
43    when no_data_found then
44 
45    return buffer;
46 
47end;

调用存储过程的PHP方法:

01function 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;
0 0
原创粉丝点击