Oracle bug 使用max或min函数into到一个char类型报字符缓冲区太小的错误
这个BUG出现会报错如下:
selectto_char(max(RENEWAL_DATE)) intoM_YEAR_MONTH fromt_renewal_schedule;
ORA-06502: PL/SQL:数字或值错误: 字符串缓冲区太小
这个时候有3个方法可以解决
1、setting initialisation parameter BLANK_TRIMMING=TRUE
2、declare PL/SQL CHAR and VARCHAR2 variable used in the INTO clause of SELECT statement as 4,000 bytes.
3、Use CAST SQL function to constraint the size to that of the variable size like
SELECT CAST(MIN('Y') AS CHAR(1)) INTO C FROM DUAL;
CAST是强制转换函数。
参数BLANK_TRIMMING设置为TRUE的时候可以解决我们的BUG问题,同时这个参数设置为TRUE会在进行变量的赋值的时候忽略末尾的空格,同时这个参数必须关闭数据库进行更改。所以请评估下,是否可行。
试验如下:
SQL> CREATE TABLE abc (
2 cont_no char(8),
3 plan_id char(7));
Table created
SQL> INSERT INTO abc VALUES ('123456 ', '7654321'); ---(这里空格有2位)
1 row inserted
SQL> commit;
SQL> DECLARE
2 c_Plan_ID char(6);
3 BEGIN
4 SELECT cont_no INTO c_Plan_ID from abc;
5 dbms_output.put_line(c_Plan_ID);
6 END;
7 /
DECLARE
c_Plan_ID char(6);
BEGIN
SELECT cont_no INTO c_Plan_ID from abc;
dbms_output.put_line(c_Plan_ID);
END;
ORA-06502: PL/SQL:数字或值错误: 字符串缓冲区太小
ORA-06512:在line 5
然后我们修改参数BLANK_TRIMMING为true
alter system set BLANK_TRIMMING=true scope=spfile;
重启数据库进行测试
进行测试
SQL> DECLARE
2 c_Plan_ID char(6);
3 BEGIN
4 SELECT cont_no INTO c_Plan_ID from abc;
5 dbms_output.put_line(c_Plan_ID);
6 END;
7 /
123456
PL/SQL procedure successfully completed
看到可以完成了
下面是METALINK的原话
SELECT containing a MIN or MAX into a CHAR variable inside a PL/SQL block Fails With ORA-06502 [ID 311653.1]
Applies to:
Oracle Server -EnterpriseEdition - Version:10.1.0.4 to 10.1.0.4
Oracle Server -EnterpriseEdition - Version:9.2.0.6 to 9.2.0.7
Oracle Server -EnterpriseEdition - Version:10.2.0.1 to 10.2.0.1
This problem can occur on any platform.
Symptoms
SELECT containing a MIN or MAX into a CHAR variable inside a PL/SQL block Fails With:
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
Example:
DECLAREC CHAR(1);BEGINSELECT MIN('Y') INTO C FROM dual;END;/DECLARE*ERROR at line 1:ORA-06502: PL/SQL: numeric or value error: character string buffer too smallORA-06512: at line 4Changes
After upgrading to Oracle10gR210.2.0.1
After applying10.1.0.4 patchset
After applying9.2.0.6 patchset
After applying9.2.0.7 patchset
Cause
This problem has been identified as
Bug:4458790 ORA-6502 selecting MAX/MIN into a CHAR variable in PLSQL
This problem is introduced in Oracle9i9.2.0.6, Oracle10g10.1.0.4 and 10.2.0.1 by the fix for Bug:3499258.
A PLSQL block which SELECTs a MAX or MIN into a fixed CHAR variable can fail with an unexpected ORA-6502 "character string buffer too small" error.
Solution
This problem is fixed in
Oracle9iR2 (9.2.0.8, terminal patchset)
Oracle11gR1(11.1.0.x or higher)
Oracle10gR1(10.1.0.5 or higher)
Oracle10gR2 (10.2.0.2 or higher)
Workarounds:
setting initialisation parameter BLANK_TRIMMING=TRUE
declare PL/SQL CHAR and VARCHAR2 variable used in the INTO clause of SELECT statement as 4,000 bytes.
Use CAST SQL function to constraint the size to that of the variable size like
SELECT CAST(MIN('Y') AS CHAR(1)) INTO C FROM DUAL;
Oracle bug 使用max或min函数into到一个char类型报字符缓冲区太小的错误的更多相关文章
- SQL中MAX()和MIN()函数的使用(比较字符串的大小)
在SQL数据库中,最大/最小值函数—MAX()/MIN()是经常要用到的,下面就将为您分别介绍MAX()函数和MIN()函数的使用,供您参考,希望对您学习SQL数据库能有些帮助. 当需要了解一列中的最 ...
- Entity Framework 6 Recipes 2nd Edition(11-6)译 -> 从一个”模型定义”函数里返回一个复杂类型
11-6.从一个”模型定义”函数里返回一个复杂类型 问题 想要从一个”模型定义”函数返回一个复杂类型 解决方案 假设我们有一个病人(patient)和他们访客(visit)的模型,如 Figure 1 ...
- jdk8-》allMatch、anyMatch、max、min函数
allMatch函数: 检查是否匹配所有元素,只有全部符合才返回true boolean flag = list.stream().allMatch(obj->obj.length()>5 ...
- 包含MIN函数的栈+一个数组实现两个堆栈+两个数组实现MIN栈
1.题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数. 思路:利用一个辅助栈来存放最小值 栈 3,4,2,5,1 辅助栈 3,2,1 每入栈一次,就与辅 ...
- python学习-33 max和min函数的高级使用
1.简单比较 age_dic={'age1456':15,'age2':16,'xiaohong_age':12,'xiaoming_age4':18,'age5':10} print(max(age ...
- 也谈Oracle异常: ORA-06502: PL/SQL: 数字或值错误 : 字符串缓冲区太小
场景: .Net程序调用Oracle方法 command.ExecuteNonQuery()执行存储过程;弹出如标题异常信息. 存储过程有4个输入参数,一个输出参数.一旦执行到给输出参数赋值的时候就报 ...
- oracle max()函数和min()函数
当需要了解一列中的最大值时,可以使用MAX()函数:同样,当需要了解一列中的最小值时,可以使用MIN()函数.语法如下. SELECT MAX (column_name) / MIN ...
- zip()函数,max()和min(),built-in function,import模块,read(),readlines(),write(),writelines(),with..as..文件处理方式
zip()函数:将可迭代对象作为参数,将对象中的对应元素打包成一个个元组. #map()普通的输出例子 print(list(zip(('a','n','c'),(1,2,3)))) print(li ...
- 20包含min函数的栈
题目描述 定义栈的数据结构,请在该类型中实现一个能够得到栈最小元素的min函数. 建一个辅助栈,把每次最小最小的元素(之前最小元素,与当前新入栈的元素比较)放在辅助栈里. import j ...
随机推荐
- CentOS(三)--初识linux的文件系统以及用户组等概念
进入到了Linux学习之CentOS第三篇了,这篇文章主要记录下对linux文件系统的初步认识,以及用户组.用户权限.文件所有者.文件所在组等概念 一.Linux文件结构及基本文件夹 文件系统是Lin ...
- 关于网络连接方式的总结(HostOnly,NAT....)
真实的网络结构: 最左侧的电脑左侧的线代表,如果这台电脑有网卡的话可以去连接别的电脑. 在一台Windows中用VMware来安装一个Linux系统(用虚线的都代表不是真实的) 上图中的虚拟网关在哪里 ...
- Junit,hamcrest和Eclemma安装及使用
Junit和hamcrest下载及安装 下载地址 Junit http://download.csdn.net/detail/luzle/6915487 Hamcrest http://d ...
- Linux 命令 - killall: 通过进程名向进程发送信号
命令格式 killall [-Z CONTEXT] [-u USER] [ -eIgiqrvw ] [ -SIGNAL ] NAME... killall -l, --list killall -V, ...
- 【WebKit】---WebKit的CSS扩展(WebKit是私有属性)
1.-webkit-touch-callout 当你触摸并按住触摸目标时候,禁止或显示系统默认菜单.在iOS上,当你触摸并按住触摸的目标,比如一个链接,Safari浏览器将显示链接有关的系统默认菜单. ...
- android NDK 开发步骤
NDK开发一般分为一下几个步骤:(默认你已经安装好了NDK和android开发环境) 1.创建一个项目 2.创建JNI目录 3.编写nativejava层方法 4.生成JNI头文件 (1)编写java ...
- 关于《Swift开发指南》背后的那些事
时间轴(倒叙)2014年8月底在图灵出版社的大力支持下,全球第一本全面.系统.科学的,包含本人多年经验的呕心沥血之作<Swift开发指南>(配有同步视频课程和同步练习)全线重磅推出2014 ...
- Android 应用程序的组成部分
Android应用程序由松散耦合的组件组成,并使用应用程序Manifest绑定到一起,应用程序Manifest描述了每一个组件和它们之间的交互方式,还用于制定应用程序元数据.其硬件和平台要求.外部库以 ...
- OpenGL2-绘制三角形
代码下载 /*** 该例子展示如何使用OpenGL绘制三角形* 为什么说绘制三角形呢 ?三维空间里面,我们看到的机会大多数* 漂亮的模型,建筑,任务,机会都是有三角形网络组成.可以说三角形* 是组成三 ...
- String.Trim
String.Trim有2个重载方法,分别是:Trim()和Trim(char[]),根据官方的解释 Trim():从当前String对象移除所有前导空白字符和尾部空白字符. Trim(char[]) ...