转自: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的解决过程~~的更多相关文章

  1. 【故障处理】ORA-30012的解决过程

    [故障处理]ORA-30012的解决过程 1  BLOG文档结构图 2  前言部分 2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O ...

  2. 转载:oracle11G 已开启监听,但远程连接依旧无监听解决过程

    1.连接数据库显示无监听程序,首先查看服务器的oracle监听服务是否开启,服务名称:OracleOraDb11g_home1TNSListener(具体环境中可能不完全一样,但是认准TNSListe ...

  3. oracle11G 已开启监听,但远程连接依旧无监听解决过程

    1.连接数据库显示无监听程序,首先查看服务器的oracle监听服务是否开启,服务名称:OracleOraDb11g_home1TNSListener(具体环境中可能不完全一样,但是认准TNSListe ...

  4. .NET平台开源项目速览(7)关于NoSQL数据库LiteDB的分页查询解决过程

    在文章:这些.NET开源项目你知道吗?让.NET开源来得更加猛烈些吧!(第二辑) 与 .NET平台开源项目速览(3)小巧轻量级NoSQL文件数据库LiteDB中,介绍了LiteDB的基本使用情况以及部 ...

  5. 启动Tomcat一闪而过——分析及解决过程

    启动Tomcat一闪而过--分析及解决过程 嗯,昨天将有关JDK的知识稍微整理了一下,现在稍微整理一下有关Tomcat的! 1:Tomcat是什么? Tomcat是当今世界上使用最为广泛的.开源免费的 ...

  6. 这几天帮一个朋友解决了一点小问题(RF的有些小问题及解决过程)

    最近涉猎自动化太少了,以至于都不经常更新了.最近一个朋友在做移动端自动化的时候遇到了一些小问题来找我解决.本人也不是很精通,只是接触的时间长了一点了.下面就是一些问题和解决过程: 1.她刚过来的时候, ...

  7. nginx负载下站点错误响应会导致其他节点重复响应问题的解决过程

    目录 前言 问题来了 问题又来了 问题分析 困惑 转机 后续 前言: 这是我上周工作过程中的一次解决问题的过程.解决的是nginx负载下站点错误响应导致其他节点重复响应. 我在整理这个记叙文时,在给这 ...

  8. 再记一次w3wp占用CPU过高的解决过程(Dictionary和线程安全)

    在此之前项目有发生过两次类似的状况,都得以解决,但最近又会发现偶尔CPU会跑满,虽然之前使用过WinDbg解决过两次问题但人的记忆是不可靠的,今天处理同样问题的时候还是遇到了一些障碍,这一次希望可以记 ...

  9. 记录linux /bin被误删除的解决过程

    1.事因: 执行shell测试时,shell中rm -rf $path/* 变量$path为空,结果执行的命令是rm -rf / 事发时及时ctrl+c中断,导致只有/bin /boot目录删除 2. ...

  10. 记VS2013并行编译导致出错的解决过程

    接前一篇,电脑换了新的,系统是64bit的win8系统,先安装了SQLServer2012,再安装VS2010旗舰版,Stop!为什么还是2010?因为2010太经典了,以至于公司的项目还在用它写项目 ...

随机推荐

  1. RedHat7局域网下安装离线Ambari

    1 Ambari介绍.安装与应用案例介绍 1.1 Ambari Ambari 跟 Hadoop 等开源软件一样,也是 Apache Software Foundation 中的一个项目,并且是顶级项目 ...

  2. Solr[Q] -No live SolrServers available to handle this request, no servers hosting shard

    No live SolrServers available to handle this request , no servers hosting shard 当某一片索引对应的结点全部宕了以后,会报 ...

  3. 【剑指offer】字符串替换

    请实现一个函数,将一个字符串中的每个空格替换成“%20”.例如,当字符串为We Are Happy.则经过替换之后的字符串为We%20Are%20Happy. *StringBuffer 扩容 str ...

  4. Hadoop概念学习系列之谈hadoop/spark里为什么都有,键值对呢?(四十)

    很少有人会这样来自问自己?只知道,以键值对的形式处理数据并输出结果,而没有解释为什么要以键值对的形式进行. 包括hadoop的mapreduce里的键值对,spark里的rdd里的map等. 这是为什 ...

  5. CTE(Common Table Expression) 公用表表达式

    在编写T-SQL代码时,往往需要临时存储某些结果集.前面我们已经广泛使用和介绍了两种临时存储结果集的方法:临时表和表变量.除此之外,还可以 使用公用表表达式的方法.公用表表达式(Common Tabl ...

  6. 学习笔记之Java

    Java (programming language) - Wikipedia https://en.wikipedia.org/wiki/Java_(programming_language) Ja ...

  7. rtpproxy 配置

    1.下载rtpproxy并安装 cd /home/hi 下载rtpproxy最新版,比如rtpproxy-2.1.0.tar.gz tar –xzvf rtpproxy-2.1.0.tar.gz cd ...

  8. http和https的区别联系

    超文本传输协议HTTP协议被用于在Web浏览器和网站服务器之间传递信息,HTTP协议以明文方式发送内容,不提供任何方式的数据加密,如果攻击者截取了Web浏览器和网站服务器之间的传输报文,就可以直接读懂 ...

  9. 6行代码解决golang TCP粘包

    转自:https://studygolang.com/articles/12483 什么是TCP粘包问题以及为什么会产生TCP粘包,本文不加讨论.本文使用golang的bufio.Scanner来实现 ...

  10. CRM 更新解决方案之注意事项

    一般需要开发新功能时,企业或者软件公司往往会先从生产环境克隆出一台测试用系统. 开发人员会在测试系统中对功能进行开发或者测试. 这时当新功能开发和测试完成之后,需要将新的解决方案导入生产环境. 导入时 ...