ORA-01461的解决过程~~
转自:http://blog.itpub.net/7607759/viewspace-521189
近日生产库中的一个过程报出了ora-1461的错误,虽然错误实际处理起来非常简单,但解决过程中与yangtingkun老大就该问题思想火花的碰撞还是让我颇有收益。
创建一个最简单的示例演示一下错误的触发:
SQL> CREATE TABLE T_VARCHAR (ID VARCHAR2(10));
Table created
SQL> DECLARE
2 V_STR VARCHAR2(10000) := lpad('a',10000,'a');
3 BEGIN
4 INSERT INTO T_VARCHAR VALUES (SUBSTR(V_STR,1,10));
5 END;
6 /
DECLARE
V_STR VARCHAR2(10000) := lpad('a',10000,'a');
BEGIN
INSERT INTO T_VARCHAR VALUES (SUBSTR(V_STR,1,10));
END;
ORA-01461: can bind a LONG value only for insert into a LONG column
ORA-06512: at line 5
一条最简单的insert居然报错了,有意思吧,是因为v_str的值超长?不应该啊,因为我们在insert时是执行了substr的,甚至说将substr改成这样,还是会报错:
SQL> DECLARE
2 V_STR VARCHAR2(10000) := lpad('a',10000,'a');
3 BEGIN
4 INSERT INTO T_VARCHAR VALUES (SUBSTR(V_STR,1,1));
5 END;
6 /
DECLARE
V_STR VARCHAR2(10000) := lpad('a',10000,'a');
BEGIN
INSERT INTO T_VARCHAR VALUES (SUBSTR(V_STR,1,1));
END;
ORA-01461: can bind a LONG value only for insert into a LONG column
ORA-06512: at line 5
显然不会是因为多字节截取问题导致的插入失败,而且如果是插入字符超出列长度的话,应该是报这个错误才对:
SQL> insert into t_varchar values (lpad('a',11,'a'));
insert into t_varchar values (lpad('a',11,'a'))
ORA-12899: value too large for column "TEST"."T_VARCHAR"."ID" (actual: 11, maximum: 10)
下面,改一下我们的插入语句:
SQL> DECLARE
2 V_STR VARCHAR2(10000) := lpad('a',10000,'a');
3 BEGIN
4 V_STR := SUBSTR(V_STR,1,10);
5 INSERT INTO T_VARCHAR VALUES (V_STR);
6 END;
7 /
PL/SQL procedure successfully completed
这下成功了,似乎有点儿头绪,再改一下:
SQL> DECLARE
2 V_STR CHAR(4000) := 'a';
3 BEGIN
4 INSERT INTO T_CHAR VALUES (SUBSTR(V_STR,1,10));
5 END;
6 /
PL/SQL procedure successfully completed
也成功了。ok,基本确认问题所在,总结如下:
字符类型在pl/sql中做为变量存大,最大可支持32767个字节,但在sql中通常只能够支持到4000字节(char/nchar为2000),因此如果声明的变量长度超出了sql中类型长度,并且变量实际值也超出类型可接受最大值时,就会触发ORA-01461错误,解决方法自然相当简单,只要在插入/更新之前截取字符长度到符合要求的长度就可以了。
另外,这里需要注意,一定要在插入/更新之前截取,而不要在插入/更新时substr,如例:
SQL> DECLARE
2 V_STR VARCHAR2(10000) := lpad('a',10000,'a');
3 BEGIN
4 INSERT INTO T_VARCHAR VALUES (SUBSTR(V_STR,1,10));
5 END;
6 /
DECLARE
V_STR VARCHAR2(10000) := lpad('a',10000,'a');
BEGIN
INSERT INTO T_VARCHAR VALUES (SUBSTR(V_STR,1,10));
END;
ORA-01461: can bind a LONG value only for insert into a LONG column
ORA-06512: at line 5
这样也仍然是会出错的,这应该是由于pl/sql引擎在编译时对变量长度的判断先于substr进行,因此不等执行就先报错了。
ORA-01461的解决过程~~的更多相关文章
- 【故障处理】ORA-30012的解决过程
[故障处理]ORA-30012的解决过程 1 BLOG文档结构图 2 前言部分 2.1 导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O ...
- 转载:oracle11G 已开启监听,但远程连接依旧无监听解决过程
1.连接数据库显示无监听程序,首先查看服务器的oracle监听服务是否开启,服务名称:OracleOraDb11g_home1TNSListener(具体环境中可能不完全一样,但是认准TNSListe ...
- oracle11G 已开启监听,但远程连接依旧无监听解决过程
1.连接数据库显示无监听程序,首先查看服务器的oracle监听服务是否开启,服务名称:OracleOraDb11g_home1TNSListener(具体环境中可能不完全一样,但是认准TNSListe ...
- .NET平台开源项目速览(7)关于NoSQL数据库LiteDB的分页查询解决过程
在文章:这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧!(第二辑) 与 .NET平台开源项目速览(3)小巧轻量级NoSQL文件数据库LiteDB中,介绍了LiteDB的基本使用情况以及部 ...
- 启动Tomcat一闪而过——分析及解决过程
启动Tomcat一闪而过--分析及解决过程 嗯,昨天将有关JDK的知识稍微整理了一下,现在稍微整理一下有关Tomcat的! 1:Tomcat是什么? Tomcat是当今世界上使用最为广泛的.开源免费的 ...
- 这几天帮一个朋友解决了一点小问题(RF的有些小问题及解决过程)
最近涉猎自动化太少了,以至于都不经常更新了.最近一个朋友在做移动端自动化的时候遇到了一些小问题来找我解决.本人也不是很精通,只是接触的时间长了一点了.下面就是一些问题和解决过程: 1.她刚过来的时候, ...
- nginx负载下站点错误响应会导致其他节点重复响应问题的解决过程
目录 前言 问题来了 问题又来了 问题分析 困惑 转机 后续 前言: 这是我上周工作过程中的一次解决问题的过程.解决的是nginx负载下站点错误响应导致其他节点重复响应. 我在整理这个记叙文时,在给这 ...
- 再记一次w3wp占用CPU过高的解决过程(Dictionary和线程安全)
在此之前项目有发生过两次类似的状况,都得以解决,但最近又会发现偶尔CPU会跑满,虽然之前使用过WinDbg解决过两次问题但人的记忆是不可靠的,今天处理同样问题的时候还是遇到了一些障碍,这一次希望可以记 ...
- 记录linux /bin被误删除的解决过程
1.事因: 执行shell测试时,shell中rm -rf $path/* 变量$path为空,结果执行的命令是rm -rf / 事发时及时ctrl+c中断,导致只有/bin /boot目录删除 2. ...
- 记VS2013并行编译导致出错的解决过程
接前一篇,电脑换了新的,系统是64bit的win8系统,先安装了SQLServer2012,再安装VS2010旗舰版,Stop!为什么还是2010?因为2010太经典了,以至于公司的项目还在用它写项目 ...
随机推荐
- mybatis 使用oracle merge into 语句踩坑实录
由于需求涉及oracle的clob类型字段,在mybatis的mapper xml文件中编写merge into语句时总是失败. 附上错误代码 <insert id="mergeInt ...
- ionic platform add ios, Error:spawn EACCES
RT: cordova ionic 环境搭建好之后,需要添加平台才能打包,添加平台如果出错:Error:spawn EACCES, 原因是因为没添加hooks, 请使用 ionic add hooks ...
- 自然语言处理之Levenshtien Distance算法研究
自然语言处理中,一个很重要的应用就是问答系统,这里面,涉及到问题和知识库里面的问题的匹配度,从而检索出问题的答案,这个是一个比较常见的应用算法. 编辑距离(Edit Distance),又称Leven ...
- Xshell中vim退出内容仍停留在屏幕的问题
Xshell中vim退出内容仍停留在屏幕的问题 我每次在vim中退出后内容都显示在屏幕上面,看上去特别烦,就在网上看了下,通过调试成功. 第一种方法:在xshell中设置 1.这是我在vim中退出的状 ...
- Centos 使用find查找
CentOS查找目录或文件 find / -name svn 查找目录:find /(查找范围) -name '查找关键字' -type d查找文件:find /(查找范围) -name 查找关键字 ...
- Maven Gradle 区别
Maven面临的挑战 软件行业新旧交替的速度之快往往令人咂舌,不用多少时间,你就会发现曾经大红大紫的技术已经成为了昨日黄花,当然,Maven也不会例外.虽然目前它基本上是Java构建的事实标准,但我们 ...
- T-SQL目录汇总1
DDL alter create drop DML select update delete insert DCL grant revoke deny ================= ...
- ALGO-152_蓝桥杯_算法训练_8-2求完数
记: 掌握完数的概念 AC代码: #include <stdio.h> int main(void) { int i,j,sum; ; i <= ; i ++) { sum = ; ...
- C++进阶--Named Parameter Idiom
//############################################################################ /* Named Parameter Id ...
- lucene 4.0 - Facet demo
package com.fox.facet; import java.io.File; import java.io.IOException; import java.util.ArrayList; ...