lob欄位型別轉換ora-22858
blob欄位預設值為null,需要修改blob欄位的預設值為empty_blob()
SQL> desc t_lob001;
Name
Null? Type
-----------------------------------------
-------- ----------------------------
ID NUMBER
CONTENT
BLOB
SQL> alter table t_lob001 modify(content blob default
empty_blob());
alter table t_lob001 modify(content blob default
empty_blob())
*
ERROR at line 1:
ORA-22858: invalid alteration of datatype
上述sql語句由於進行了blob到blob的轉換,出現了無效的資料型別ora-22858
同樣非lob型別轉換為lob型別同樣也不允許。
SQL> alter table t_lob001 add name varchar2(1000);
Table altered.
SQL> alter table t_lob001 modify(name blob default
empty_blob());
alter table t_lob001 modify(name blob default empty_blob())
*
ERROR at line 1:
ORA-22858: invalid alteration of datatypeSQL> desc
t_lob001;
Name
Null? Type
-----------------------------------------
-------- ----------------------------
ID
NUMBER
CONTENT
BLOB
由於修改預設值,可以直接採取alter
table t_lob001 modify( content default empty_blob())就可以了。
分析一下這個錯誤的產生,將lob欄位轉換為別的資料型別,或者將別的資料型別轉換為lob型別時,oracle是不允許的。
[oracle@server127 ~]$ oerr ora 22858
22858, 00000, "invalid alteration of
datatype"
// *Cause: An
attempt was made to modify the column type to object, REF,
//
nested table, VARRAY or LOB type.
// *Action:
Create a new column of the desired type and copy the current
//
column data to the new type using the appropriate type
//
constructor.
如果需要進行轉換,可以參照線上重定義來進行轉換欄位型別。
接下來分析下lob的預設值null和empty_blob()的區別,null值由於是未知, oracle不會為其分配儲存空間,
而empty_blob()僅僅表示該lob欄位為空值,oracle還是會為其分配lob欄位段頭的一些儲存單位。
SQL> alter
table t_lob001 modify(content default empty_blob());
Table altered.
SQL> alter table t_lob001 add(article blob default
null);
Table altered.
SQL> desc t_lob001;
Name
Null? Type
-----------------------------------------
-------- ----------------------------
ID NUMBER
CONTENT
BLOB
NAME
VARCHAR2(1000)
ARTICLE
BLOB
SQL> insert into t_lob001(id,name)
values(1,'xiaoyu');
1 row created.
SQL> commit;
Commit complete.
SQL> select dbms_lob.getlength(content)
content_length,dbms_lob.getlength(article) article_length from t_lob001;
CONTENT_LENGTH ARTICLE_LENGTH
-------------- --------------
0
下面的測試更能說明empty_blob()僅僅只是一個空的lob欄位,並不是null未知,而且會為其分配相應的lob欄位段頭的儲存位置。
SQL> select id from t_lob001 where content is null;
no rows selected
SQL> select id from t_lob001 where article is null;
ID
----------
1
關於儲存空間null和empty_blob()測試:
SQL> declare
2 begin
3 for i in 1..1000 loop
4 insert into t_lob001
values(1,null,'xiaoyu',null);
5 end loop;
6 commit;
7 end;
8 /
PL/SQL procedure successfully completed.
SQL> analyze table t_lob001 compute statistics;
Table analyzed.
SQL> select blocks from user_tables where
table_name='T_LOB001';
BLOCKS
----------
5
SQL> truncate table t_lob001;
Table truncated.
SQL> declare
2 begin
3 for i in 1..1000 loop
4 insert into t_lob001
values(1,empty_blob(),'xiaoyu',null);
5 end loop;
6 commit;
7 end;
8 /
PL/SQL procedure successfully completed.
SQL> analyze table t_lob001 compute statistics;
Table analyzed.
SQL> select blocks from user_tables where
table_name='T_LOB001';
BLOCKS
----------
13
可以看出empty_blob()儲存空間佔用了較多的儲存空間。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/25362835/viewspace-1059194/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- LOB欄位EMPTY_LOB和NULL的區別Null
- 【mongo】mongo 欄位型別互轉Go型別
- [轉]MySQL 欄位型別參考MySql型別
- 欄位的資料型別隱式轉換有關係資料型別
- oracle中lob欄位Oracle
- MySQL把字串欄位轉換為日期型別進行比較MySql字串型別
- 保留兩位小數:資料庫欄位型別NUMBER,Java欄位型別Double型別資料庫型別Java
- 主流資料庫欄位型別轉.Net型別的方法資料庫型別
- LOB型別型別
- MongoDB更改欄位型別MongoDB型別
- oracle的欄位型別Oracle型別
- 【LOB】使用資料泵時 LOB 欄位存放位置
- 強制轉換檢視某個欄位為某個型別的sql型別SQL
- ORACLE LOB大欄位維護Oracle
- sql語句修改欄位型別和增加欄位SQL型別
- LOB欄位資料清理 - 更新為null後move lobNull
- MySQL欄位型別最全解析MySql型別
- date、timestamp欄位型別型別
- MySQL欄位型別小記MySql型別
- 資料欄位型別匹配型別
- 修改表的欄位型別型別
- sqlite sql 修改欄位型別SQLite型別
- PHP 型別轉換&&型別強制轉換PHP型別
- lob欄位表空間遷移
- 【轉】修改表的欄位資料型別的方法資料型別
- 轉載:Oracle常用的資料庫欄位型別Oracle資料庫型別
- Long -> lob , to_lob 轉換,遷移
- java型別轉換與強制型別轉換(轉)Java型別
- MongoDB中的欄位型別IdMongoDB型別
- oracle 修改欄位型別的方法Oracle型別
- 欄位型別檢測指令碼型別指令碼
- 比較所有的欄位型別型別
- 型別轉換型別
- MySQL欄位新增註釋,但不改變欄位的型別MySql型別
- LONG型別遷移到LOB型別(三)型別
- LONG型別遷移到LOB型別(二)型別
- LONG型別遷移到LOB型別(一)型別
- SQL Server TEXT型別欄位字串替換示例處理指令碼SQLServer型別字串指令碼