- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章ORACLE 超长字符串问题的解决办法由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
前两天我在工作中遇到这样一个问题,我们有一个程序是用来增量抽取EBS 中的表数据的,有的是全量抽取,即先删除原表中的数据,然后重新抽取数据,示例代码如下:
1
2
|
truncate
table
ods_emp
drop
storage;
insert
into
ods_emp
select
*
from
emp;
|
另外一种方式是增量抽取,用的是merge语句,这里就不写了;) 。
接触过EBS库存模块的同志们知道,INV中的物料表是MTL_SYSTEM_ITEM_B,这个表的字段那叫一个多!我之前搞错了,用的是第一种方案提取的,这就会导致我的程序运行之后数据会大量减少(原因是临时表只有一两天的数据,大家懂得)。恰好这问题是在调试程序时出现的,并且不只是我负责的INV出现了问题,其他同事的模块也有。于是项目经理怒了,发话:今天谁搞不完,加班! 。
我可不想加班,赶紧把语句由INSERT写成MERGE。写完一运行,报错:
哦,原来是字符超长了。在这里我就不把之前的程序写这里了,以免吓到大家。我用下面的代码来模拟这个错误吧:
1
2
3
4
5
6
7
8
9
10
11
|
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 行出现错误
ORA-06502: PL/SQL: 数字或值错误 : 字符串缓冲区太小 ORA-06512: 在 line 5 。
我想这还不好办嘛,直接把varchar2改成long。可是还是报错了:
1
2
3
4
5
6
7
8
9
10
11
|
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 行出现错误
ORA-06502: PL/SQL: 数字或值错误 : 字符串缓冲区太小 ORA-06512: 在 line 5 。
我之前在网上查的是LONG类型支持2G的大小,不知为啥,这次报错了。平时由于工作的限制,很少接触像LONG,LOB,CLOB等大数据类型,以后可得仔细研究下了.
自己当时有点儿着急了,也想不出合适的办法来,只能请教同事了。还真有一个同事遇到过,她把字符串变量定义成CLOB类型,具体请看代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
DECLARE
v_str CLOB;
v_temp_str
VARCHAR
();
v_cnt NUMBER;
BEGIN
dbms_lob.createtemporary(v_str,
true
);
--创建一个临时lob
v_temp_str := RPAD(
'select count(*) '
,);
dbms_lob.append(v_str,v_temp_str);
--把临时字符串付给v_str
v_temp_str := RPAD(
'from emp '
,);
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 超长字符串问题的解决办法的文章就讲到这里了,如果你想了解更多关于ORACLE 超长字符串问题的解决办法的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
如何使用 SPListCollection.Add(String, String, String, String, Int32, String, SPListTemplate.QuickLaunchO
我刚刚开始使用 C++ 并且对 C# 有一些经验,所以我有一些一般的编程经验。然而,似乎我马上就被击落了。我试过在谷歌上寻找,以免浪费任何人的时间,但没有结果。 int main(int argc,
这个问题已经有答案了: In Java 8 how do I transform a Map to another Map using a lambda? (8 个回答) Convert a Map>
我正在使用 node + typescript 和集成的 swagger 进行 API 调用。我 Swagger 提出以下要求 http://localhost:3033/employees/sear
我是 C++ 容器模板的新手。我收集了一些记录。每条记录都有一个唯一的名称,以及一个字段/值对列表。将按名称访问记录。字段/值对的顺序很重要。因此我设计如下: typedef string
我需要这两种方法,但j2me没有,我找到了一个replaceall();但这是 replaceall(string,string,string); 第二个方法是SringBuffer但在j2me中它没
If string is an alias of String in the .net framework为什么会发生这种情况,我应该如何解释它: type JustAString = string
我有两个列表(或字符串):一个大,另一个小。 我想检查较大的(A)是否包含小的(B)。 我的期望如下: 案例 1. B 是 A 的子集 A = [1,2,3] B = [1,2] contains(A
我有一个似乎无法解决的小问题。 这里...我有一个像这样创建的输入... var input = $(''); 如果我这样做......一切都很好 $(this).append(input); 如果我
我有以下代码片段 string[] lines = objects.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.No
这可能真的很简单,但我已经坚持了一段时间了。 我正在尝试输出一个字符串,然后输出一个带有两位小数的 double ,后跟另一个字符串,这是我的代码。 System.out.printf("成本:%.2
以下是 Cloud Firestore 列表查询中的示例之一 citiesRef.where("state", ">=", "CA").where("state", "= 字符串,我们在Stack O
我正在尝试检查一个字符串是否包含在另一个字符串中。后面的代码非常简单。我怎样才能在 jquery 中做到这一点? function deleteRow(locName, locID) { if
这个问题在这里已经有了答案: How to implement big int in C++ (14 个答案) 关闭 9 年前。 我有 2 个字符串,都只包含数字。这些数字大于 uint64_t 的
我有一个带有自定义转换器的 Dozer 映射: com.xyz.Customer com.xyz.CustomerDAO customerName
这个问题在这里已经有了答案: How do I compare strings in Java? (23 个回答) 关闭 6 年前。 我想了解字符串池的工作原理以及一个字符串等于另一个字符串的规则是
我已阅读 this问题和其他一些问题。但它们与我的问题有些无关 对于 UILabel 如果你不指定 ? 或 ! 你会得到这样的错误: @IBOutlet property has non-option
这两种方法中哪一种在理论上更快,为什么? (指向字符串的指针必须是常量。) destination[count] 和 *destination++ 之间的确切区别是什么? destination[co
This question already has answers here: Closed 11 years ago. Possible Duplicates: Is String.Format a
我有一个Stream一个文件的,现在我想将相同的单词组合成 Map这很重要,这个词在 Stream 中出现的频率. 我知道我必须使用 collect(Collectors.groupingBy(..)
我是一名优秀的程序员,十分优秀!