Oracle Long类型转换为Clob类型
INSERT INTO sammy_test_clob
?? SELECT TO_LOB (report_xml)
???? FROM qm_s_report
??? WHERE report_name = 'Sammy';
TO_LOB函數(shù)和LONG類型一樣,限制有很多。簡(jiǎn)單的說(shuō),TO_LOB一般只用在CREATE TABLE或INSERT TABLE語(yǔ)句后面的子查詢中。在其他地方使用會(huì)報(bào)錯(cuò),比如UPDATE語(yǔ)句。
這還不是最大的問(wèn)題,最大的問(wèn)題在于,TO_LOB函數(shù)似乎并沒(méi)有真正的將LONG類型轉(zhuǎn)化為LOB數(shù)據(jù)類型。個(gè)人感覺(jué),Oracle只是對(duì)LONG類型做了一些處理,使之可以存放到一個(gè)LOB類型中去。
轉(zhuǎn)自:http://blog.csdn.net/gbnew/archive/2007/07/20/1700596.aspx
TO_LOB函數(shù)是一個(gè)很特殊的函數(shù),特殊之處在于,這個(gè)函數(shù)可以處理LONG類型數(shù)據(jù),而且這個(gè)函數(shù)和LONG類型一樣,擁有很多的限制。不過(guò),這些還不是很特殊的地方,下面簡(jiǎn)單看一下TO_LOB這個(gè)函數(shù)。
?
Oracle的LONG類型可謂“臭名昭著”,由于LONG類型的限制太多,以至于Oracle很少去提LONG類型有哪些限制條件,而一般都是通過(guò)說(shuō)明在哪些情況下,可以使用LONG類型。
正是這些限制阻止了LONG的使用,Oracle也在推出了大對(duì)象類型——LOB之后,強(qiáng)烈建議用戶不要在使用LONG類型。
但是,具有諷刺意味的是,Oracle建議用戶不要再使用LONG類型,可是數(shù)據(jù)字典中,隨處可以看到LONG的身影。而且,即使是目前使用的最高版本10R2,LONG類型仍然在數(shù)據(jù)字典中隨處可見(jiàn)。不知道Oracle是考慮兼容性的問(wèn)題還是其他什么原因,反正Oracle仍然沒(méi)有把LONG類型從數(shù)據(jù)字典中移出去。不知道11g中是否有所改觀。
雖然Oracle自己沒(méi)有做到,但是仍然建議用戶不要在使用LONG,并使用BLOB、CLOB來(lái)替換現(xiàn)有系統(tǒng)中的LONG字段。而且LONG類型的限制也確實(shí)使人頭疼,將LONG類型轉(zhuǎn)化為LOB類型的工具,就是TO_LOB函數(shù)。
TO_LOB函數(shù)和LONG類型一樣,限制有很多。簡(jiǎn)單的說(shuō),TO_LOB一般只用在CREATE TABLE或INSERT TABLE語(yǔ)句后面的子查詢中。在其他地方使用會(huì)報(bào)錯(cuò),比如UPDATE語(yǔ)句。
這還不是最大的問(wèn)題,最大的問(wèn)題在于,TO_LOB函數(shù)似乎并沒(méi)有真正的將LONG類型轉(zhuǎn)化為LOB數(shù)據(jù)類型。個(gè)人感覺(jué),Oracle只是對(duì)LONG類型做了一些處理,使之可以存放到一個(gè)LOB類型中去。
SQL> CREATE TABLE T1 (ID NUMBER, TEXT CLOB);
表已創(chuàng)建。
SQL> CREATE TABLE T2 (ID NUMBER, TEXT VARCHAR2(4000));
表已創(chuàng)建。
SQL> INSERT INTO T1 SELECT ROWNUM, TEXT FROM DBA_VIEWS;
INSERT INTO T1 SELECT ROWNUM, TEXT FROM DBA_VIEWS
*第 1 行出現(xiàn)錯(cuò)誤:
ORA-00997: illegal use of LONG datatype
SQL> INSERT INTO T1 SELECT ROWNUM, TO_LOB(TEXT) FROM DBA_VIEWS;
已創(chuàng)建2268行。
SQL> COMMIT;
提交完成。
使用TO_LOB可以將LONG數(shù)據(jù)插入到CLOB字段中,但是如果想要將LONG數(shù)據(jù)插入到VARCHAR2中:
SQL> INSERT INTO T2 SELECT ROWNUM, TEXT FROM DBA_VIEWS;
INSERT INTO T2 SELECT ROWNUM, TEXT FROM DBA_VIEWS
*第 1 行出現(xiàn)錯(cuò)誤:
ORA-00997: illegal use of LONG datatype
SQL> INSERT INTO T2 SELECT ROWNUM, DBMS_LOB.SUBSTR(TO_LOB(TEXT), 4000, 1) FROM DBA_VIEWS;
INSERT INTO T2 SELECT ROWNUM, DBMS_LOB.SUBSTR(TO_LOB(TEXT), 4000, 1) FROM DBA_VIEWS
*第 1 行出現(xiàn)錯(cuò)誤:
ORA-00932: inconsistent datatypes: expected - got LONG
直接插入肯定不行,但是剛才已經(jīng)得到了CLOB類型,那么將CLOB轉(zhuǎn)化為VARCHAR2不就可以了?但是結(jié)果確出人意料。觀察錯(cuò)誤信息,Oracle認(rèn)為返回的數(shù)據(jù)類型是LONG。似乎TO_LOB并沒(méi)有進(jìn)行數(shù)據(jù)類型的轉(zhuǎn)化。下面再驗(yàn)證一下:
SQL> SELECT DUMP(TO_LOB(TEXT)) FROM DBA_VIEWS;
SELECT DUMP(TO_LOB(TEXT)) FROM DBA_VIEWS
*第 1 行出現(xiàn)錯(cuò)誤:
ORA-00932: inconsistent datatypes: expected - got LONG
SQL> SELECT DUMP(TEXT) FROM T1;
SELECT DUMP(TEXT) FROM T1
*第 1 行出現(xiàn)錯(cuò)誤:
ORA-00932: inconsistent datatypes: expected - got CLOB
從這個(gè)對(duì)比中已經(jīng)可以清楚的看到,TO_LOB函數(shù)并不像想象中的那樣返回CLOB類型,而實(shí)際上返回的仍然是LONG類型。
SQL> INSERT INTO T2 SELECT ROWNUM, TO_LOB(TEXT) FROM DBA_VIEWS;
已創(chuàng)建2268行。
直接使用TO_LOB似乎可以插入,但是仔細(xì)對(duì)比一下結(jié)果就會(huì)發(fā)現(xiàn),LONG類型數(shù)據(jù)沒(méi)有真正的插入到表中:
SQL> COL TEXT FORMAT A50
SQL> SET LONG 50
SQL> SELECT * FROM T2 WHERE ROWNUM < 3;
ID TEXT
---------- --------------------------------------------------
1
2
SQL> SELECT * FROM T1 WHERE ROWNUM < 3;
ID TEXT
---------- --------------------------------------------------
1 select OWNER, TABLE_NAME, TABLESPACE_NAME, CLUSTER
2 select a.apply_name, a.queue_name, a.queue_owner,
?
?轉(zhuǎn)載于:https://www.cnblogs.com/songsh96/archive/2007/09/05/882587.html
總結(jié)
以上是生活随笔為你收集整理的Oracle Long类型转换为Clob类型的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Jquery Datatable 数
- 下一篇: dubbo forbid service