oracle超长字符串问题的解决

头两天,我在工作中遇到了这样的问题。我们有一个在EBS中提取表格数据的程序。其中一些是总卷提取,即首先从原始表中删除数据,然后提取数据。示例代码如下所示:


TRUNCATETABLE ods_emp滴存储;
插入ods_emp SELECT * FROM emp;


另一种方法是增量提取,不使用合并语句。

谁在与EBS库存模块接触的同志知道INV材料表mtl_system_item_b,和这个表的字段是一个多!以前我犯了一个错误,我用来提取它的第一个计划,这将导致大量的我的程序运行后的数据还原(因为临时表只有一个或两天的数据,你懂的)。它发生在程序的调试运行,而不只是投资,我负责因为,与其他同事的模块,所以项目经理很生气,说:今天谁不能完成,加班!

我不想加班,赶紧从INSERT到合并写语句。写一篇文章,报告错了:

哦,原来是字符太长了。这里我不写以前的程序,以免吓到大家。我用下面的代码来模拟这个错误:


已申报
v_str varchar();
v_cnt数;
开始
v_str:= RAPD('select计数(*)从EMP,);
立即执行v_str为v_cnt;
dbms_output.put_line('v_cnt:| | v_cnt);
结束;
/
声明
*




第一行错了:



ora-06502:PL / SQL:数值或数值错误:字符串缓冲区太小

ora-06512:5行

我觉得做的还不是很好,和改变VARCHAR2直接长。但它仍然是错误的:


已申报
长v_str;
v_cnt数;
开始
v_str:= RAPD('select计数(*)从EMP,);
立即执行v_str为v_cnt;
dbms_output.put_line('v_cnt:| | v_cnt);
结束;
/
声明
*


第一行错了:



ora-06502:PL / SQL:数值或数值错误:字符串缓冲区太小

ora-06512:5行



我查看了在因特网上支持2G的长型的大小。我不知道为什么这是错的。通常由于工作限制,很少接触大数据类型如长,LOB,CLOB等可以仔细研究。

当时我有点担心,我想不出正确的方法。我只能问我的同事,我的一个同事遇到,她定义字符串变量为CLOB类型。


声明
v_str CLOB;
v_temp_str varchar();
v_cnt数;
开始
dbms_lob.createtemporary(v_str,true);创建一个临时的工作
v_temp_str:= RAPD('select计数(*));
dbms_lob.append(v_str,v_temp_str);支付临时字符串,v_str
v_temp_str:= RAPD(从EMP,);
dbms_lob.append(v_str,v_temp_str);支付临时字符串,v_str
立即执行v_str为v_cnt;
dbms_output.put_line('v_cnt:| | v_cnt);
dbms_lob.freetemporary(v_str);释放LOB
结束;


运行结果:v_cnt:14

摘要:1。CLOB类型可用于处理字符串超长条件;

对2.oracle需要研究大数据类型。