ORACLE 字符串超长问题解决方案
前两天我在工作中遇到这样一个问题,我们有一个程序是用来增量抽取EBS 中的表数据的,有的是全量抽取,即先删除原表中的数据,然后重新抽取数据,示例代码如下:
truncate table ods_emp drop storage;
insert into ods_emp select * from emp;
另外一种方式是增量抽取,用的是merge语句,这里就不写了;)
接触过EBS库存模块的同志们知道,INV中的物料表是MTL_SYSTEM_ITEM_B,这个表的字段那叫一个多!我之前搞错了,用的是第一种方案提取的,这就会导致我的程序运行之后数据会大量减少(原因是临时表只有一两天的数据,大家懂得)。恰好这问题是在调试程序时出现的,并且不只是我负责的INV出现了问题,其他同事的模块也有。于是项目经理怒了,发话:今天谁搞不完,加班!
我可不想加班,赶紧把语句由INSERT写成MERGE。写完一运行,报错:

哦,原来是字符超长了。在这里我就不把之前的程序写这里了,以免吓到大家。我用下面的代码来模拟这个错误吧:
SQL> DECLARE
2 v_str VARCHAR2(32767);
3 v_cnt NUMBER;
4 BEGIN
5 v_str := RPAD('select count(*) from emp',32768);
6 EXECUTE IMMEDIATE v_str INTO v_cnt;
7 dbms_output.put_line('v_cnt: '||v_cnt);
8 END;
9 /
DECLARE
*
第 1 行出现错误:
ORA-06502: PL/SQL: 数字或值错误 : 字符串缓冲区太小
ORA-06512: 在 line 5
我想这还不好办嘛,直接把varchar2改成long。可是还是报错了:
SQL> DECLARE
2 v_str LONG;
3 v_cnt NUMBER;
4 BEGIN
5 v_str := RPAD('select count(*) from emp',32768);
6 EXECUTE IMMEDIATE v_str INTO v_cnt;
7 dbms_output.put_line('v_cnt: '||v_cnt);
8 END;
9 /
DECLARE
*
第 1 行出现错误:
ORA-06502: PL/SQL: 数字或值错误 : 字符串缓冲区太小
ORA-06512: 在 line 5
我之前在网上查的是LONG类型支持2G的大小,不知为啥,这次报错了。平时由于工作的限制,很少接触像LONG,LOB,CLOB等大数据类型,以后可得仔细研究下了。
自己当时有点儿着急了,也想不出合适的办法来,只能请教同事了。还真有一个同事遇到过,她把字符串变量定义成CLOB类型,具体请看代码:
DECLARE
v_str CLOB;
v_temp_str VARCHAR2(32767);
v_cnt NUMBER;
BEGIN
dbms_lob.createtemporary(v_str,true);--创建一个临时lob
v_temp_str := RPAD('select count(*) ',32767);
dbms_lob.append(v_str,v_temp_str);--把临时字符串付给v_str
v_temp_str := RPAD('from emp ',32767);
dbms_lob.append(v_str,v_temp_str);--把临时字符串付给v_str
EXECUTE IMMEDIATE v_str INTO v_cnt;
dbms_output.put_line('v_cnt: '||v_cnt);
dbms_lob.freetemporary(v_str);--释放lob
END;
运行结果:v_cnt: 14
总结:1.用CLOB类型可以处理字符串超长的情况;
2.ORACLE 的大数据类型还须研究。
ORACLE 字符串超长问题解决方案的更多相关文章
- 未在本地计算机上注册“OraOLEDB.Oracle.1”提供程序解决方案
未在本地计算机上注册“OraOLEDB.Oracle.1”提供程序解决方案 一.现象: C#程序中需要以Provider=OraOLEDB.Oracle.1方式访问ORACLE数据库.但程序执行时报 ...
- Oracle工程建设行业解决方案
为何选择Oracle工程建设行业解决方案? Oracle为工程建设企业提供一套全面.开放且集成的业务管理软件.服务器和存储解决方案.这些解决方案经过集成设计,能够实现卓越性能,从而优化业务的方方面面. ...
- ORACLE字符串分组聚合函数(字符串连接聚合函数)
ORACLE字符串连接分组串聚函数 wmsys.wm_concat SQL代码: select grp, wmsys.wm_concat(str) grp, 'a1' str from dual un ...
- [转]Oracle字符串拼接的方法
本文转自:http://www.blogjava.net/liuwuping12064915/archive/2011/06/27/353096.html 和其他数据库系统类似,Oracle字符串连接 ...
- oracle 字符串切割成结果集方法
oracle字符串切割几种方式 方法一: SELECT COLUMN_VALUE FROM TABLE(SYS.ODCIVARCHAR2LIST('1','2','3','4','5')); 方法二: ...
- 常见ORACLE错误,及解决方案(遇则即时更新)
1.当登陆时提示“ORA-03113:通信通道的文件结束”时: 解决方案: 需在X:\oraclexe\app\oracle\product\10 ...
- Oracle字符串操作[转:http://www.cnblogs.com/xd502djj/archive/2010/08/11/1797577.html]
ORACLE 字符串操作 1 字符串连接 SQL> select 'abc' || 'def' from dual; 'ABC'|------abcdef 2 小写SQL>select ...
- Oracle字符串行拆分成列的三种方式
Oracle字符串行拆分成列的三种方式 --muphy 开发过程中经常会遇到将前台多个值用逗号连接一同传递到后台查询,这个用逗号连接的字符串分隔的每个字符串分别对应Oracle数据库表的不同行. 如下 ...
- Oracle字符串函数
Oracle字符串函数 平常我们用Oracle主要有两种字符串类型1.char始终为固定的长度,如果设置了长度小于char列的值,则Oracle会自动用空格填充的.当比较char时,Oracle用空格 ...
随机推荐
- SFC中的问题描述
本文主要描述了在大规模的网络环境中部署服务功能存在的一些问题,还提出了几个关键领域,即SFC工作组将要探讨的关于SFC结构.工作协议.相关文档. 1.问题描述 SFC工作组致力于解决的几个服务部署中存 ...
- Javascript数组常用方法
一.forEach对数组的遍历 二.map返回经过运算的新数组 三.filter返回满足条件的新数组 四.返回数组前后元素运算的结果 五.every遍历数组每项元素是否满足某个条件,全部满足返回tru ...
- SQL之收集SQL Server线程等待信息
要知道线程等待时间是制约SQL Server效率的重要原因,这一个随笔中将学习怎样收集SQL Server中的线程等待时间,类型等信息,这些信息是进行数据库优化的依据. sys.dm_os_wait_ ...
- CloudNotes之桌面客户端篇:增强的笔记列表
今天,我发布了CloudNotes的一个更新版本:1.0.5484.36793.这个版本与1.0.5472.20097不同的是,它拥有增强的笔记列表,与之前单调的列表系统相比,新的笔记列表不仅可以显示 ...
- SQL Server 2016里的sys.dm_exec_input_buffer
在你的DBA职业里,你们谁有用过DBCC INPUTBUFFER命令,来获得已经提交到SQL Server特定会话的最后SQL语句?请举手!大家都用过! 我们都知道DBCC命令有点尴尬,因为你不能在T ...
- iOS滤镜实现之LOMO(美图秀秀经典LOMO)
LOMO追求鲜艳色彩,随意.自由的态度,是一种经常使用的滤镜,今天介绍一下iOS 中LOMO滤镜的实现 首先它有3张输入图像 1.我们要处理的图像.即我们要应用LOMO滤镜的图像 2 3 在gpuim ...
- C#循环测试题
关于如下程序结构的描述中,哪一项是正确的? for ( ; ; ) { 循环体; //何问起 } a) 不执行循环体b) 一直执行循环体,即死循环c) 执行循环体一次d) 程序不符合语法要 ...
- 让Visual Studio Code对jQuery支持智能提示!
本人新手,对代码各种不熟悉,记不准确,总是打错,造成各种失误!! 其实这个方法应该适合大部分前端开发工具!! 园里子有前人写了一篇文章对智能提示的实现!不过很多新手看不懂吧. http://www.c ...
- 第一个hadoop 程序
首先检查hadoop是否安装并配置正确然后建立WordCount.java文件里面保存package org.myorg; import java.io.IOException;import java ...
- Java中,方法的重写、重载的区别,以及多态的实例
首先我们要明白什么是重写和重载 重写(override):子类方法覆盖了父类的方法. (类与类之间继承的关系) 例:父类代码 public class Deng { public void Qi ...