系统中有一个表的字段(如: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;
3
alter
table
table_name rename
column
tmp
to
content;
到这里就完成了字段类型的转换。
虽然数据类型已经转换完成,会发现调用此字段的程序会报错。那是因为通过sql查询出的clob字段是对象类型,因此会报错。
我是通过存储过程来调用的,存储过程如下:
01
create
or
replace
function
getclob(
03
table_name
in
varchar2,
07
field_name
in
varchar2,
11
v_pos
in
number)
return
varchar2
17
buffer varchar2(32767);
19
amount number := 2000;
23
query_str varchar2(1000);
27
query_str :=
'select '
||field_name||
' from '
||table_name||
' where '
||field_id||
'= :id '
;
31
EXECUTE
IMMEDIATE query_str
INTO
lobloc USING v_id;
33
offset:=offset+(v_pos-1)*2000;
37
dbms_lob.
read
(lobloc,amount,offset,buffer);
43
when
no_data_found
then
调用存储过程的PHP方法:
01
function
edt_disp_getclob(
$id
,
$field_id
,
$field_name
,
$len
) {
04
if
((
$len
%
$b
) == 0) {
05
$maxpage
=
floor
(
$len
/
$a
);
07
$maxpage
=
floor
(
$len
/
$a
) + 1;
12
while
(
$i
<
$maxpage
) {
14
$sql
=
"select getclob('table_name','$field_id','$field_name','$id','$i') as h from dual"
;
17
if
(
$a
->next_record ()) {
18
$h
=
$a
->Record [
"h"
];
22
if
(!
empty
(
$con
)) {
调用:
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;