ORACLE 超長(zhǎng)字符串問(wèn)題的解決辦法
前兩天我在工作中遇到這樣一個(gè)問(wèn)題,我們有一個(gè)程序是用來(lái)增量抽取EBS 中的表數(shù)據(jù)的,有的是全量抽取,即先刪除原表中的數(shù)據(jù),然后重新抽取數(shù)據(jù),示例代碼如下:
truncate table ods_emp drop storage; insert into ods_emp select * from emp;
另外一種方式是增量抽取,用的是merge語(yǔ)句,這里就不寫(xiě)了;)
接觸過(guò)EBS庫(kù)存模塊的同志們知道,INV中的物料表是MTL_SYSTEM_ITEM_B,這個(gè)表的字段那叫一個(gè)多!我之前搞錯(cuò)了,用的是第一種方案提取的,這就會(huì)導(dǎo)致我的程序運(yùn)行之后數(shù)據(jù)會(huì)大量減少(原因是臨時(shí)表只有一兩天的數(shù)據(jù),大家懂得)。恰好這問(wèn)題是在調(diào)試程序時(shí)出現(xiàn)的,并且不只是我負(fù)責(zé)的INV出現(xiàn)了問(wèn)題,其他同事的模塊也有。于是項(xiàng)目經(jīng)理怒了,發(fā)話:今天誰(shuí)搞不完,加班!
我可不想加班,趕緊把語(yǔ)句由INSERT寫(xiě)成MERGE。寫(xiě)完一運(yùn)行,報(bào)錯(cuò):
哦,原來(lái)是字符超長(zhǎng)了。在這里我就不把之前的程序?qū)戇@里了,以免嚇到大家。我用下面的代碼來(lái)模擬這個(gè)錯(cuò)誤吧:
SQL> DECLARE v_str VARCHAR(); v_cnt NUMBER; BEGIN v_str := RPAD('select count(*) from emp',); EXECUTE IMMEDIATE v_str INTO v_cnt; dbms_output.put_line('v_cnt: '||v_cnt); END; / DECLARE *
第 1 行出現(xiàn)錯(cuò)誤:
ORA-06502: PL/SQL: 數(shù)字或值錯(cuò)誤 : 字符串緩沖區(qū)太小
ORA-06512: 在 line 5
我想這還不好辦嘛,直接把varchar2改成long??墒沁€是報(bào)錯(cuò)了:
SQL> DECLARE v_str LONG; v_cnt NUMBER; BEGIN v_str := RPAD('select count(*) from emp',); EXECUTE IMMEDIATE v_str INTO v_cnt; dbms_output.put_line('v_cnt: '||v_cnt); END; / DECLARE *
第 1 行出現(xiàn)錯(cuò)誤:
ORA-06502: PL/SQL: 數(shù)字或值錯(cuò)誤 : 字符串緩沖區(qū)太小
ORA-06512: 在 line 5
我之前在網(wǎng)上查的是LONG類(lèi)型支持2G的大小,不知為啥,這次報(bào)錯(cuò)了。平時(shí)由于工作的限制,很少接觸像LONG,LOB,CLOB等大數(shù)據(jù)類(lèi)型,以后可得仔細(xì)研究下了。
自己當(dāng)時(shí)有點(diǎn)兒著急了,也想不出合適的辦法來(lái),只能請(qǐng)教同事了。還真有一個(gè)同事遇到過(guò),她把字符串變量定義成CLOB類(lèi)型,具體請(qǐng)看代碼:
DECLARE v_str CLOB; v_temp_str VARCHAR(); v_cnt NUMBER; BEGIN dbms_lob.createtemporary(v_str,true);--創(chuàng)建一個(gè)臨時(shí)lob v_temp_str := RPAD('select count(*) ',); dbms_lob.append(v_str,v_temp_str);--把臨時(shí)字符串付給v_str v_temp_str := RPAD('from emp ',); dbms_lob.append(v_str,v_temp_str);--把臨時(shí)字符串付給v_str EXECUTE IMMEDIATE v_str INTO v_cnt; dbms_output.put_line('v_cnt: '||v_cnt); dbms_lob.freetemporary(v_str);--釋放lob END;
運(yùn)行結(jié)果:v_cnt: 14
總結(jié):1.用CLOB類(lèi)型可以處理字符串超長(zhǎng)的情況;
2.ORACLE 的大數(shù)據(jù)類(lèi)型還須研究。
相關(guān)文章
oracle定時(shí)任務(wù)定時(shí)無(wú)效的原因分析與解決
發(fā)現(xiàn)系統(tǒng)數(shù)據(jù)沒(méi)有更新,查看oracle定時(shí)任務(wù),估計(jì)沒(méi)有執(zhí)行,下面這篇文章主要給大家介紹了關(guān)于oracle定時(shí)任務(wù)定時(shí)無(wú)效的原因分析與解決方法,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下2022-06-06Oracle 如何規(guī)范清理v$archived_log記錄實(shí)例詳解
這篇文章主要介紹了Oracle 如何規(guī)范清理v$archived_log記錄實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下2017-05-05oracle數(shù)據(jù)庫(kù)定時(shí)任務(wù)dbms_job的用法詳解
這篇文章給大家詳細(xì)介紹了dbms_job的用法,用于安排和管理作業(yè)隊(duì)列,通過(guò)使用作業(yè),可以使ORACLE數(shù)據(jù)庫(kù)定期執(zhí)行特定的任務(wù)。有需要的朋友們可以參考借鑒。2016-09-09關(guān)于Oracle數(shù)據(jù)庫(kù)dbLink的創(chuàng)建和使用詳解
這篇文章主要介紹了關(guān)于Oracle數(shù)據(jù)庫(kù)dbLink的創(chuàng)建和使用詳解,Oracle的數(shù)據(jù)庫(kù)鏈路dbLink是一種允許在兩個(gè)不同的數(shù)據(jù)庫(kù)實(shí)例之間進(jìn)行通信和數(shù)據(jù)交換的功能,它可以讓你在一個(gè)數(shù)據(jù)庫(kù)中訪問(wèn)另一個(gè)數(shù)據(jù)庫(kù)的對(duì)象和數(shù)據(jù),需要的朋友可以參考下2023-08-08PL/SQL編程經(jīng)驗(yàn)小結(jié)開(kāi)發(fā)者網(wǎng)絡(luò)Oracle
PL/SQL編程經(jīng)驗(yàn)小結(jié)開(kāi)發(fā)者網(wǎng)絡(luò)Oracle...2007-03-03深入淺析mybatis oracle BLOB類(lèi)型字段保存與讀取
本文給大家淺析mybatis oracle blob類(lèi)型字段的保存與讀取,blob字段是指二進(jìn)制大對(duì)象,用來(lái)存儲(chǔ)大量文本數(shù)據(jù)。感興趣的朋友一起學(xué)習(xí)吧2015-10-10六分鐘學(xué)會(huì)創(chuàng)建Oracle表空間的實(shí)現(xiàn)步驟
這里介紹創(chuàng)建Oracle表空間的步驟,首先查詢空閑空間、增加Oracle表空間、修改文件大小語(yǔ)句如下、創(chuàng)建Oracle表空間,最后更改自動(dòng)擴(kuò)展屬性2013-06-06