LONG型別遷移到LOB型別(一)
LONG型別由於過多的限制,Oracle很早就推薦使用LOB型別進行替代,在Oracle的官方文件中給出了幾種將LONG型別遷移到LOB型別的方法,這裡簡單討論一下。
這一篇討論利用TO_LOB進行遷移。
官方文件給出的方法如下:
SQL> CREATE TABLE T
2 (ID NUMBER,
3 CONTENTS LONG);
Table created.
SQL> INSERT INTO T
2 SELECT ROWNUM, OWNER || OBJECT_NAME || OBJECT_TYPE
3 FROM ALL_OBJECTS;
75327 rows created.
SQL> COMMIT;
Commit complete.
SQL> CREATE TABLE T_NEW
2 (ID NUMBER,
3 CONTENTS CLOB);
Table created.
SQL> INSERT INTO T_NEW
2 SELECT ID, TO_LOB(CONTENTS)
3 FROM T;
75327 rows created.
SQL> COMMIT;
Commit complete.
SQL> DROP TABLE T PURGE;
Table dropped.
SQL> RENAME T_NEW TO T;
Table renamed.
這種方法需要刪除原表,先不說是否會造成業務停頓,光是原表涉及的索引、約束、許可權等重建就已經很麻煩了。
其實這個方法可以改進為:
SQL> DROP TABLE T PURGE;
Table dropped.
SQL> CREATE TABLE T
2 (ID NUMBER,
3 CONTENTS LONG);
Table created.
SQL> INSERT INTO T
2 SELECT ROWNUM, OWNER || OBJECT_NAME || OBJECT_TYPE
3 FROM ALL_OBJECTS;
75327 rows created.
SQL> COMMIT;
Commit complete.
SQL> ALTER TABLE T
2 ADD (CONTENTS_NEW CLOB);
Table altered.
SQL> UPDATE T
2 SET CONTENTS_NEW = TO_LOB(CONTENTS);
SET CONTENTS_NEW = TO_LOB(CONTENTS)
*
ERROR at line 2:
ORA-00932: inconsistent datatypes: expected - got LONG
SQL> ALTER TABLE T ADD PRIMARY KEY (ID);
Table altered.
SQL> UPDATE T T1
2 SET CONTENTS_NEW =
3 (SELECT TO_LOB(CONTENTS)
4 FROM T T2
5 WHERE T1.ID = T2.ID);
75327 rows updated.
SQL> ALTER TABLE T DROP COLUMN CONTENTS;
Table altered.
SQL> ALTER TABLE T RENAME COLUMN CONTENTS_NEW TO CONTENTS;
Table altered.
雖然Oracle不支援在UPDATE語句的時候直接使用TO_LOB進行LONG型別的轉換,但是可以利用自關聯的方式繞過Oracle的限制。
這種方法避免了表的重建,也就避免了索引、約束以及許可權等物件的重建。
不過LONG欄位刪除後,會留下很多的空閒空間分別在表的各個 BLOCK中,如果有必要收縮高水位線,可以考慮對錶再進行一次MOVE操作。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-665351/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- LONG型別遷移到LOB型別(三)型別
- LONG型別遷移到LOB型別(二)型別
- LOB型別型別
- Java long型別和Long型別的那些事Java型別
- LONG欄位型別向CLOB遷移型別
- 操作LONG型別型別
- Oracle Long型別轉換為Clob型別Oracle型別
- LONG型別複製型別
- long型別相關型別
- int型別和long long型別運算執行時間的差別型別
- Jenkins:批次自動將 Maven 型別 Job 遷移到自由風格型別JenkinsMaven型別
- Long型別的資料,利用COPY命令遷移型別
- Long raw和Long型別總結型別
- 為lob型別分配extents型別
- 移動LOB型別的索引型別索引
- oracle裡long型別詳解Oracle型別
- Long -> lob , to_lob 轉換,遷移
- Oracle - LOB(大物件資料型別)Oracle物件資料型別
- Oracle Lob型別儲存淺析Oracle型別
- 關於long型別的轉換型別
- oracle裡long型別的總結Oracle型別
- long型別資料的擷取型別
- PLSQL Language Reference-PL/SQL資料型別-SQL資料型別-LONG和LONG RAW變數SQL資料型別變數
- LONG RAW的欄位型別不能使用impdp + dblink遷移型別
- Oracle LOB資料型別的處理Oracle資料型別
- Spring Mvc Long型別精度丟失SpringMVC型別
- long型別轉換成varchar2型別
- expdp測試包含有lob型別的物件型別物件
- 測試Java中的long,int基本型別Java型別
- Oracle 中LONG RAW BLOB CLOB型別介紹Oracle型別
- long資料型別跨平臺問題資料型別
- 將lob型別的index移動到其它tablespace型別Index
- 轉:11g對LOB型別的新增功能型別
- 靜態long型別常量serialVersionUID的作用型別UI
- 使用copy命令解決LONG型別的困擾型別
- 含LONG型別欄位的表無法MOVE型別
- TS資料型別:型別別名/聯合型別/字面量型別/型別推論等綱要資料型別
- 淺談程式語言型別的強型別,弱型別,動態型別,靜態型別型別