VARCHAR2轉換為CLOB碰到ORA-22858錯誤
今天開發人員問我如何將一個VARCHAR2型別的欄位轉化為CLOB型別。
記得在9i及以前版本是不能直接轉換的,不過10g以上版本還真沒有注意過這個問題,測試了一下直接轉換,果然碰到了ORA-22858錯誤。
SQL> CREATE TABLE T_VAR (C VARCHAR2(4000));
Table created.
SQL> INSERT INTO T_VAR
2 VALUES (LPAD('A', 4000, 'A'));
1 row created.
SQL> COMMIT;
Commit complete.
SQL> ALTER TABLE T_VAR MODIFY (C CLOB);
ALTER TABLE T_VAR MODIFY (C CLOB)
*
ERROR at line 1:
ORA-22858: invalid alteration of datatype
Oracle的文件對這個錯誤的描述是:
ORA-22858: 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.
顯然是CLOB欄位的特殊性,限制了直接修改資料型別。
雖然不能直接修改為CLOB,但是如果記錄為空,可以直接修改為LONG型別:
SQL> ALTER TABLE T_VAR MODIFY (C LONG);
ALTER TABLE T_VAR MODIFY (C LONG)
*
ERROR at line 1:
ORA-01439: column to be modified must be empty to change datatype
SQL> DELETE T_VAR;
1 row deleted.
SQL> ALTER TABLE T_VAR MODIFY (C LONG);
Table altered.
不久前的一篇文章介紹過,對於LONG型別,不管有沒有資料存在,可以直接修改為CLOB型別:http://yangtingkun.itpub.net/post/468/501094
SQL> INSERT INTO T_VAR
2 VALUES (LPAD('A', 4000, 'A'));
1 row created.
SQL> COMMIT;
Commit complete.
SQL> ALTER TABLE T_VAR MODIFY (C CLOB);
Table altered.
對於LONG型別的轉換,Oracle並不是簡單的將列的定義換成CLOB,而是生成了一個臨時列,將資料儲存,然後刪除原LONG列。
Oracle可以對LONG型別的轉換操作進行封裝,不知道為什麼沒有對VARCHAR2型別轉換為CLOB進行封裝,使得一個簡單的ALTER TABLE命令必須透過多個命令才能完成。
至於VARCHAR2到CLOB的轉換就沒有必要詳細說明了,採用線上重定義就能實現。如果有足夠的維護時間,也可以直接新增CLOB列,對新增CLOB列賦值、刪除原VARCHAR2型別列,最後對新增CLOB列改名。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-670898/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Oracle Blob 轉換為ClobOracle
- Oracle Long型別轉換為Clob型別Oracle型別
- oracle如何變更varchar2型別的列為clobOracle型別
- long2varchar 把long轉換為varchar2
- CLOB與BLOB的轉換
- long查詢結果轉換為varchar2型別型別
- lob欄位型別轉換ora-22858型別
- 如何將varchar2修改為clob型別欄位(使用long過渡)型別
- RAC安裝時碰到的錯誤
- Oracle long轉為varchar2Oracle
- clob和字串之間的轉換字串
- long型別轉換成varchar2型別
- MySQL主從複製錯誤——列型別轉換錯誤MySql型別
- inconsistent datatypes: expected - got CLOB錯誤一例Go
- 11.2靜默安裝碰到的錯誤
- 安裝CLUSTER碰到 Assertion failed offset fFileSize錯誤AI
- Java 中 CLOB 和字串之間的轉換Java字串
- SQL Server中型別轉換(將varchar值轉換為資料型別為int的列時發生語法錯誤)SQLServer資料型別
- sqlldr 時碰到錯誤 ORA-01722: invalid numberSQL
- 11.2開啟資料庫碰到ORA-214錯誤資料庫
- fastjson轉換json時,碰到的那些首字母大小寫轉換的坑!ASTJSON
- Oracle新手最經常碰到的6個錯誤及解決方案Oracle
- 評“MySQL 隱式轉換引起的執行結果錯誤”MySql
- 隱式轉換錯誤:ORA-01722: invalid number
- java json字串轉換為物件,轉換為listJavaJSON字串物件
- 啟動idea時, 碰到"failed to load jvm DLL ..."錯誤 解決方案IdeaAIJVM
- 解決:錯誤1 error C2440: “初始化”: 無法從“char *”轉換為“ATL::CStringTError
- javascript 字元轉換為ascii碼,ascii碼轉換為字元JavaScript字元ASCII
- Activity轉換為View和把圖片轉換為ViewView
- 將 UTF-8 零錯誤的轉換成 BIG5
- ORA-22835: 緩衝區對於 CLOB 到 CHAR 轉換或 BLOB 到 RAW 轉換而言太小
- 解決了一例Shutdown時碰到Ora-600錯誤的問題
- 資料泵匯出碰到ORA-600(kcbz_check_objd_typ_3)錯誤OBJ
- 往資料型別為clob的表列直接insert或update長度大於4000會報字串太長錯誤資料型別字串
- oracle錯誤一覽(轉)Oracle
- ftp錯誤命令速查(轉)FTP
- unix時間轉換為datetimedatetime轉換為unixtime
- 5個文字格式轉換函式,拯救表格錯誤不求人(中)函式