国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 數(shù)據(jù)庫 > Oracle > 正文

ORACLE 超長字符串問題的解決辦法

2024-08-29 13:58:28
字體:
供稿:網(wǎng)友

這篇文章主要介紹了ORACLE 超長字符串問題的解決辦法,需要的朋友可以參考下

前兩天我在工作中遇到這樣一個(gè)問題,我們有一個(gè)程序是用來增量抽取EBS 中的表數(shù)據(jù)的,有的是全量抽取,即先刪除原表中的數(shù)據(jù),然后重新抽取數(shù)據(jù),示例代碼如下:

 

 
  1. truncate table ods_emp drop storage; 
  2. insert into ods_emp select * from emp; 

另外一種方式是增量抽取,用的是merge語句,這里就不寫了;)

接觸過EBS庫存模塊的同志們知道,INV中的物料表是MTL_SYSTEM_ITEM_B,這個(gè)表的字段那叫一個(gè)多!我之前搞錯(cuò)了,用的是第一種方案提取的,這就會(huì)導(dǎo)致我的程序運(yùn)行之后數(shù)據(jù)會(huì)大量減少(原因是臨時(shí)表只有一兩天的數(shù)據(jù),大家懂得)。恰好這問題是在調(diào)試程序時(shí)出現(xiàn)的,并且不只是我負(fù)責(zé)的INV出現(xiàn)了問題,其他同事的模塊也有。于是項(xiàng)目經(jīng)理怒了,發(fā)話:今天誰搞不完,加班!

我可不想加班,趕緊把語句由INSERT寫成MERGE。寫完一運(yùn)行,報(bào)錯(cuò):

哦,原來是字符超長了。在這里我就不把之前的程序?qū)戇@里了,以免嚇到大家。我用下面的代碼來模擬這個(gè)錯(cuò)誤吧:

 

 
  1. SQL> DECLARE 
  2. v_str VARCHAR(); 
  3. v_cnt NUMBER; 
  4. BEGIN 
  5. v_str := RPAD('select count(*) from emp',); 
  6. EXECUTE IMMEDIATE v_str INTO v_cnt; 
  7. dbms_output.put_line('v_cnt: '||v_cnt); 
  8. END; 
  9. DECLARE 

第 1 行出現(xiàn)錯(cuò)誤:

ORA-06502: PL/SQL: 數(shù)字或值錯(cuò)誤 : 字符串緩沖區(qū)太小

ORA-06512: 在 line 5

我想這還不好辦嘛,直接把varchar2改成long。可是還是報(bào)錯(cuò)了:

 

 
  1. SQL> DECLARE 
  2. v_str LONG; 
  3. v_cnt NUMBER; 
  4. BEGIN 
  5. v_str := RPAD('select count(*) from emp',); 
  6. EXECUTE IMMEDIATE v_str INTO v_cnt; 
  7. dbms_output.put_line('v_cnt: '||v_cnt); 
  8. END; 
  9. DECLARE 

第 1 行出現(xiàn)錯(cuò)誤:

ORA-06502: PL/SQL: 數(shù)字或值錯(cuò)誤 : 字符串緩沖區(qū)太小

ORA-06512: 在 line 5

我之前在網(wǎng)上查的是LONG類型支持2G的大小,不知為啥,這次報(bào)錯(cuò)了。平時(shí)由于工作的限制,很少接觸像LONG,LOB,CLOB等大數(shù)據(jù)類型,以后可得仔細(xì)研究下了。

自己當(dāng)時(shí)有點(diǎn)兒著急了,也想不出合適的辦法來,只能請(qǐng)教同事了。還真有一個(gè)同事遇到過,她把字符串變量定義成CLOB類型,具體請(qǐng)看代碼:

 

 
  1. DECLARE 
  2. v_str CLOB; 
  3. v_temp_str VARCHAR(); 
  4. v_cnt NUMBER; 
  5. BEGIN 
  6. dbms_lob.createtemporary(v_str,true);--創(chuàng)建一個(gè)臨時(shí)lob 
  7. v_temp_str := RPAD('select count(*) ',); 
  8. dbms_lob.append(v_str,v_temp_str);--把臨時(shí)字符串付給v_str 
  9. v_temp_str := RPAD('from emp ',); 
  10. dbms_lob.append(v_str,v_temp_str);--把臨時(shí)字符串付給v_str 
  11. EXECUTE IMMEDIATE v_str INTO v_cnt; 
  12. dbms_output.put_line('v_cnt: '||v_cnt); 
  13. dbms_lob.freetemporary(v_str);--釋放lob 
  14. END; 

運(yùn)行結(jié)果:v_cnt: 14

總結(jié):1.用CLOB類型可以處理字符串超長的情況;

2.ORACLE 的大數(shù)據(jù)類型還須研究。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表
主站蜘蛛池模板: 定西市| 海南省| 浏阳市| 旺苍县| 镇沅| 儋州市| 依兰县| 磐石市| 民权县| 正镶白旗| 扶绥县| 平山县| 大港区| 定西市| 渝中区| 渭源县| 阿巴嘎旗| 阿拉善左旗| 万安县| 耒阳市| 扶余县| 云阳县| 都安| 天镇县| 宁海县| 乌拉特中旗| 毕节市| 松阳县| 永兴县| 叙永县| 静安区| 牙克石市| 专栏| 郧西县| 黄浦区| 宜章县| 贵南县| 绥中县| 广宁县| 湟中县| 东丽区|