<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 40,  comments - 187,  trackbacks - 0

    以前寫(xiě)過(guò)的一篇博文中提到了出現(xiàn)“ORA-01461: 僅可以為插入 LONG 列的 LONG 值賦值”的原因,并給出了原因和解決方法,在這裡回顧一下。(詳見(jiàn) 當(dāng)遇到“數(shù)據(jù)大小超出此類(lèi)型的最大值”和“僅可以為插入 LONG 列的 LONG 值賦值”時(shí)...? )

    當(dāng)時(shí)的環(huán)境:?
    數(shù)據(jù)庫(kù):Oracle 9i
    數(shù)據(jù)庫(kù)字段類(lèi)型:varchar2(4000)
    輸入漢字:大于1000字

    原因:
    ?? 我的數(shù)據(jù)庫(kù)字符集應(yīng)該是UTF-8的,對(duì)于UTF-8或歐洲的某些字符集,oracle在存儲(chǔ)時(shí),對(duì)于一個(gè)字符需要2個(gè)或3個(gè)字節(jié)的存儲(chǔ)空間,雖然表定義中為varchar2(4000),但是其實(shí)該字段的data_length為其2倍或3倍長(zhǎng)。這種情況下oracle會(huì)把data_length長(zhǎng)度超過(guò)4000的當(dāng)做LONG型處理,你的表中有兩個(gè)這樣的字段,插入數(shù)據(jù)時(shí)相當(dāng)于同時(shí)操作2個(gè)LONG字段,所以報(bào)錯(cuò)。

    當(dāng)時(shí)的解決辦法:建議減小字段長(zhǎng)度或拆分。實(shí)在需要的,可以轉(zhuǎn)而采用CLOB字段類(lèi)型。


    現(xiàn)在的環(huán)境:

    開(kāi)發(fā)框架:Spring 2.0.6 + Hibernate 3.2
    數(shù)據(jù)庫(kù):Oracle 9i
    數(shù)據(jù)庫(kù)字段類(lèi)型:CLOB
    輸入字節(jié):1000 ~ 2000

    現(xiàn)在的問(wèn)題:
    現(xiàn)在的項(xiàng)目中我采用了CLOB字段類(lèi)型,但又遇到了這個(gè)錯(cuò)誤。當(dāng)我對(duì)Oracle數(shù)據(jù)庫(kù)中的CLOB字段進(jìn)入insert或update操作的時(shí)候,后臺(tái)出現(xiàn) java.sql.SQLException:?? ORA-01461: 僅可以為插入 LONG 列的 LONG 值賦值。這個(gè)錯(cuò)誤的特點(diǎn)是,當(dāng)插入的數(shù)據(jù)長(zhǎng)度小於1000字節(jié)或者大於2000字節(jié)時(shí)都不會(huì)報(bào)錯(cuò),一旦插入的數(shù)據(jù)長(zhǎng)度在1000 ~ 2000之間時(shí)就會(huì)報(bào)錯(cuò)。經(jīng)過(guò)google一番之後,ORA-01461錯(cuò)誤是一個(gè)經(jīng)典問(wèn)題了,有人認(rèn)為是CLOB字段本身的問(wèn)題。

    解決方法:

    方法1:
    采用Oracle 10g最新的ojdbc14.jar驅(qū)動(dòng)替換原有的驅(qū)動(dòng)即可。試過(guò)了這種方法,但是并沒(méi)有生效。

    方法2:

    1. Hibernate實(shí)體對(duì)象中的數(shù)據(jù)成員類(lèi)型為String,映射的數(shù)據(jù)庫(kù)字段類(lèi)型為org.springframework.orm.hibernate.support.ClobStringType。實(shí)例如下:
    @SuppressWarnings("serial")
    @Entity
    @Table(name?
    =?"GUIDE")
    //@Cache(usage?=?CacheConcurrencyStrategy.READ_WRITE)
    public?class?Guide?{
    ????
    ????@Type(type?
    =?"org.springframework.orm.hibernate3.support.ClobStringType")
    ????
    private?String?content;?//內(nèi)容

    ?????????
    //get?&?set?
    }


    2. 如果使用Spring的這個(gè)Clob類(lèi)型就需要在applicationContext.xml中的sessionFactory bean里注入oracleLobHandler bean。下面給出Oracle數(shù)據(jù)庫(kù)的LobHandler配置:
    .
    < bean? id ="oracleLobHandler" ?
    ??????class
    ="org.springframework.jdbc.support.lob.OracleLobHandler" ?
    ??????lazy-init
    ="true" > ??
    ????
    < property? name ="nativeJdbcExtractor" ?ref ="nativeJdbcExtractor" ? />
    </ bean > ????
    ?
    < bean? id ="nativeJdbcExtractor" ???????class ="org.springframework.jdbc.support.nativejdbc.CommonsDbcpNativeJdbcExtractor"
    ??????lazy-init
    ="true" ? /> ??

    <!-- ?Hibernate?SessionFactory? -->
    < bean? id ="sessionFactory" ?class ="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean" >
    ????
    < property? name ="dataSource" ?ref ="dataSource" ? />
    ????
    < property? name ="configLocation" ?value ="classpath:hibernate/hibernate.cfg.xml" ? />
    ????
    < property? name ="hibernateProperties" >
    ????????
    < value >
    ??????????
    ????????
    </ value >
    ????
    </ property >
    ????
    < property? name ="lobHandler" ?ref ="oracleLobHandler" ? />
    </ bean >
    .

    LobHandler 需要訪(fǎng)問(wèn)本地 JDBC 對(duì)象,這一任務(wù)委托給 NativeJdbcExtractor Bean 來(lái)完成,NativeJdbcExtractor是一個(gè)本地JDBC對(duì)象抽取器,因此我們?yōu)?LobHandler 注入了一個(gè) nativeJdbcExtractor。最后,我們把 lobHandler Bean 注入到需要進(jìn)行 LOB 數(shù)據(jù)訪(fǎng)問(wèn)操作的sessionFactory Bean中或者直接注入到dao Bean中去。

    大家可能已經(jīng)注意到 nativeJdbcExtractor 和 oracleLobHandler Bean 都設(shè)置為 lazy-init="true",這是因?yàn)?nativeJdbcExtractor 需要通過(guò)運(yùn)行期的反射機(jī)制獲取底層的JDBC 對(duì)象,所以需要避免在 Spring 容器啟動(dòng)時(shí)就實(shí)例化這兩個(gè)Bean。
    如果底層數(shù)據(jù)庫(kù)是 DB2、SQL Server、MySQL 等非 Oracle 的其它數(shù)據(jù)庫(kù),則只要簡(jiǎn)單配置一個(gè) DefaultLobHandler 就可以了,如下所示:
    <bean?id="defaultLobHandler"?
    class
    ="org.springframework.jdbc.support.lob.DefaultLobHandler"?
    lazy-init
    ="true"/>

    <bean?id="testDao"?class="com.test.dao.jdbc.TestJdbcDao">
    ???
    <property?name="lobHandler"?ref="?defaultLobHandler"/>?
    <property?name="jdbcTemplate"?ref="jdbcTemplate"?/>
    </bean>

    DefaultLobHandler 只是簡(jiǎn)單地代理標(biāo)準(zhǔn) JDBC 的 PreparedStatement 和 ResultSet 對(duì)象,由于并不需要訪(fǎng)問(wèn)數(shù)據(jù)庫(kù)驅(qū)動(dòng)本地的 JDBC 對(duì)象,所以它不需要 NativeJdbcExtractor 的幫助。

    ??? 采用第二種方法即可解決我所遇到的問(wèn)題,如果再見(jiàn)到“ORA-01461: 僅可以為插入 LONG 列的 LONG 值賦值”時(shí),希望這個(gè)方法能夠幫您順利拿下ORA-01461。



    PS:給出Oracle下幾種大容量字段類(lèi)型的解釋
    LONG: 可變長(zhǎng)的字符串?dāng)?shù)據(jù),最長(zhǎng)2G,LONG具有VARCHAR2列的特性,可以存儲(chǔ)長(zhǎng)文本一個(gè)表中最多一個(gè)LONG列
    LONG RAW: 可變長(zhǎng)二進(jìn)制數(shù)據(jù),最長(zhǎng)2G
    CLOB:? 字符大對(duì)象Clob 用來(lái)存儲(chǔ)單字節(jié)的字符數(shù)據(jù)
    NCLOB: 用來(lái)存儲(chǔ)多字節(jié)的字符數(shù)據(jù)
    BLOB: 用于存儲(chǔ)二進(jìn)制數(shù)據(jù)
    BFILE: 存儲(chǔ)在文件中的二進(jìn)制數(shù)據(jù),這個(gè)文件中的數(shù)據(jù)只能被只讀訪(fǎng)。但該文件不包含在數(shù)據(jù)庫(kù)內(nèi)。bfile字段實(shí)際的文件存儲(chǔ)在文件系統(tǒng)中,字段中存儲(chǔ)的是文件定位指針.bfile對(duì)oracle來(lái)說(shuō)是只讀的,也不參與事務(wù)性控制和數(shù)據(jù)恢復(fù)。
      
    其中CLOB,NCLOB,BLOB都是內(nèi)部的LOB(Large Object)類(lèi)型,最長(zhǎng)4G,沒(méi)有LONG只能有一列的限制。要保存圖片、文本文件、Word文件各自最好采用那種數(shù)據(jù)類(lèi)型呢?BLOB最好,LONG RAW也不錯(cuò),但Long是oracle將要廢棄的類(lèi)型,因此建議用BLOB。


    ??????????????????????????????????????????????????????????????????????????? THE END
    ?
    posted on 2008-05-06 10:30 小立飛刀 閱讀(32739) 評(píng)論(5)  編輯  收藏 所屬分類(lèi): Spring 、Hibernate 、Database

    FeedBack:
    # re: 又見(jiàn)“ORA-01461: 僅可以為插入 LONG 列的 LONG 值賦值”![未登錄](méi)
    2009-08-25 17:51 | wolf
    放屁,我插入1都不行,1大于1000嗎??  回復(fù)  更多評(píng)論
      
    # re: 又見(jiàn)“ORA-01461: 僅可以為插入 LONG 列的 LONG 值賦值”!
    2009-08-28 16:11 | 小立飛刀
    @wolf
    這位網(wǎng)友,請(qǐng)您說(shuō)話(huà)干凈一點(diǎn),有問(wèn)題可以提,我們一起探討,希望不要再有這樣的言語(yǔ)。

    “我插入1都不行,1大于1000嗎?? ” 沒(méi)明白您的問(wèn)題,再說(shuō)得詳細(xì)點(diǎn)如何  回復(fù)  更多評(píng)論
      
    # re: 又見(jiàn)“ORA-01461: 僅可以為插入 LONG 列的 LONG 值賦值”![未登錄](méi)
    2010-02-05 11:10 | gongmingwind
    您好,我也是在使用hibernate時(shí)遇到的這個(gè)問(wèn)題,按照您說(shuō)的方法試驗(yàn)了下,好像還是不行,使用的驅(qū)動(dòng)是ojdbc14-10.2.0.2.0.jar;后來(lái)改成:ojdbc14-10.2.0.3.0.jar問(wèn)題就解決了,所以可能是驅(qū)動(dòng)的問(wèn)題,故將解決方法寫(xiě)下,共同探討.  回復(fù)  更多評(píng)論
      
    # re: 又見(jiàn)“ORA-01461: 僅可以為插入 LONG 列的 LONG 值賦值”!
    2010-02-08 09:54 | 小立飛刀
    @gongmingwind
    嗯,多謝,看來(lái)是我的驅(qū)動(dòng)版本沒(méi)對(duì)上,呵呵。  回復(fù)  更多評(píng)論
      
    # re: 又見(jiàn)“ORA-01461: 僅可以為插入 LONG 列的 LONG 值賦值”!
    2011-04-24 22:27 | hourm
    @gongmingwind
    正解,確實(shí)是驅(qū)動(dòng)得問(wèn)題,另外一樓確實(shí)談吐不雅,請(qǐng)注意,樓主很有風(fēng)度
      回復(fù)  更多評(píng)論
      
    <2010年2月>
    31123456
    78910111213
    14151617181920
    21222324252627
    28123456
    78910111213

    生存或毀滅,這是個(gè)必答之問(wèn)題:是否應(yīng)默默的忍受坎苛命運(yùn)之無(wú)情打擊,還是應(yīng)與深如大海之無(wú)涯苦難奮然為敵,并將其克服。此二抉擇,究竟是哪個(gè)較崇高?

    常用鏈接

    留言簿(12)

    隨筆分類(lèi)(43)

    相冊(cè)

    收藏夾(7)

    朋友的博客

    電子資料

    搜索

    •  

    積分與排名

    • 積分 - 302621
    • 排名 - 192

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 和日本免费不卡在线v| 免费国产污网站在线观看不要卡| 四虎影视永久免费观看| 免费国产黄网站在线观看视频| 亚洲欧洲无码AV电影在线观看| a级毛片免费在线观看| 苍井空亚洲精品AA片在线播放 | 亚洲AV无码一区二区三区电影| 国产99视频免费精品是看6| xx视频在线永久免费观看| 免费无码又爽又刺激高潮软件| 亚洲日韩乱码久久久久久| 亚洲色大成网站www永久一区| 国产精品免费视频网站| 性做久久久久久免费观看| 91大神免费观看| 永久在线观看免费视频| 国产A∨免费精品视频| 美女被免费视频网站| 亚洲精华国产精华精华液| 亚洲av片不卡无码久久| vvvv99日韩精品亚洲| 免费看成人AA片无码视频吃奶| 色婷婷综合缴情综免费观看| 亚洲色av性色在线观无码| 亚洲今日精彩视频| yy6080久久亚洲精品| 永久黄网站色视频免费观看| 毛片在线免费视频| 成人性生免费视频| 日韩在线视频免费看| 免费看a级黄色片| 在线免费观看韩国a视频| 国产性生交xxxxx免费| 国产成人免费网站在线观看| 日本久久久免费高清| 成人永久福利免费观看| 国产一区二区视频免费| 亚洲av无码成人精品区| 亚洲一区二区三区免费| 久久亚洲色一区二区三区|