沉睡森林@漂在北京
本处文章除注明“转载”外均为原创,转载请注明出处。
BlogJava
::
首页
::
新随笔
::
联系
::
聚合
::
管理
::
152 随笔 :: 4 文章 :: 114 评论 :: 0 Trackbacks
<
2010年3月
>
日
一
二
三
四
五
六
28
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
1
2
3
4
5
6
7
8
9
10
随笔分类
(115)
DataBase(15)
(rss)
Digester(4)
(rss)
Eclipse(1)
(rss)
Ext(29)
(rss)
jQuery(7)
(rss)
Other(28)
(rss)
Spring(19)
(rss)
Ubuntu(6)
(rss)
WebService(2)
(rss)
Workflow(4)
(rss)
随笔档案
(154)
2012年6月 (1)
2012年4月 (5)
2012年3月 (3)
2010年7月 (1)
2010年6月 (6)
2010年5月 (4)
2010年4月 (2)
2010年3月 (13)
2010年2月 (3)
2010年1月 (16)
2009年12月 (1)
2009年11月 (3)
2009年10月 (3)
2009年9月 (2)
2009年8月 (3)
2009年7月 (4)
2009年6月 (10)
2009年5月 (15)
2009年4月 (3)
2009年3月 (12)
2009年2月 (6)
2008年12月 (6)
2008年11月 (11)
2008年10月 (21)
技术blog
B/S开发
Cat in dotNET
java&maven2
JAVA之道
OOPAA
Ruby's Louvre
xmatthew
万事大吉的IT学习笔记
从嘉陵到钱塘
开发者的最佳实践
成吉的个人网站
薛敬明的专栏
ext方面很多实用的文章
搜索
最新评论
1. re: 利用axis2的wsdl2java生成webservice的客户端代码[未登录]
1
--1
2. re: SpringMVC下的权限控制
45
--sad
3. re: SpringMVC下的权限控制
发的更好地发挥到发货
--才不会
4. re: 关于oracle中varchar2的最大长度
你太给力了!果断顶起!!
--荒漠依米
5. re: 关于oracle中varchar2的最大长度
afa
--sdf
关于oracle中varchar2的最大长度
关于 varchar2 的最大长度
varchar2有两个最大长度:一个是在字段类型4000;一个是在PL/SQL中变量类型32767。今天犯了一个小错误,就是函数的varchar2类型的返回值长度也是4000,而不是我以为的32767。
想了一下,这是一个比较容易出错的地方。因为在函数中我可以声明长度超过4000的字符串变量,并且将它作为返回值,这里是不会提示编译错误的。这个函数平时都可以正常执行,而一旦这个字符串长度超过4000,函数执行就会出错。所以这个问题虽然比较简单,仍然记录一下。
C:\Documents and Settings\yuechao.tianyc>sqlplus
SQL*Plus: Release 10.2.0.1.0 - Production on 星期二 5月 5 17:15:59 2009
Copyright (c) 1982, 2005, Oracle. All rights reserved.
请输入用户名: test/test
连接到:
Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Production
With the Partitioning, OLAP and Data Mining options
SQL> create or replace function funny return varchar2
2 is
3 v_yct varchar2(32767);
4 begin
5 v_yct := rpad('a', 4001, 'b');
6 return v_yct;
7 end;
8 /
函数已创建。
SQL> select funny from dual;
select funny from dual
*
第 1 行出现错误:
ORA-06502: PL/SQL: 数字或值错误 : 字符串缓冲区太小
ORA-06512: 在 "TEST.FUNNY", line 6
本来以为记录下来就好。刚才跟一位同事讨论了一下,认为有可能在schema级varchar2的长度限制都是4000,而在PL/SQL代码级的长度限制是32767。下面继续测试:
-- 1. 作为函数入参的限制是32767
SQL> create or replace function funny( p_char in varchar2 ) return number
2 is
3 begin
4 return length(p_char);
5 end;
6 /
函数已创建。
SQL> declare
2 v_char varchar2(32767);
3 begin
4 v_char := rpad('a', 32767, 'b');
5 dbms_output.put_line(funny(v_char));
6 end;
7 /
32767
PL/SQL 过程已成功完成。
-- 2. 同样的函数,在schema级和在PL/SQL代码级长度限制不同
SQL> select length(rpad('a', 4001, 'b')) from dual;
LENGTH(RPAD('A',3276558,'B'))
-----------------------------
4000
SQL> begin
2 dbms_output.put_line(length(rpad('a', 4001, 'b')));
3 end;
4 /
4001
PL/SQL 过程已成功完成。
如果中间结果字符串长度超过限制会怎样呢?
(1)在PL/SQL中,如果中间结果超过32767,没有影响:
SQL> declare
2 v_char1 varchar2(32767);
3 v_char2 varchar2(32767);
4 v_char3 varchar2(10);
5 begin
6 v_char1 := lpad('a', 32767, 'a');
7 v_char2 := lpad('b', 32767, 'b');
8 v_char3 := substr(v_char1 || v_char2, 32763, 10);
9 dbms_output.put_line(v_char3);
10 end;
11 /
aaaaabbbbb
PL/SQL 过程已成功完成。
(2)在schema级如果中间结果超过4000,会提示错误:
SQL> select substr(rpad('a', 4000, 'a')||rpad('b', 4000, 'b'), 3996, 10) from dual;
select substr(rpad('a', 4000, 'a')||rpad('b', 4000, 'b'), 3996, 10) from dual
*
第 1 行出现错误:
ORA-01489: 字符串连接的结果过长
如果字符串长度超过限制怎么办?可以使用CLOB类型。比如最开始的那个例子,可以将返回值改为CLOB类型:
SQL> create or replace function funny return clob
2 is
3 v_yct varchar2(32767);
4 begin
5 v_yct := rpad('a', 4001, 'b');
6 return v_yct;
7 end;
8 /
函数已创建。
SQL> select funny from dual;
FUNNY
--------------------------------------------------------------------------------
abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
SQL> set long 10000
SQL> select funny from dual;
FUNNY
--------------------------------------------------------------------------------
abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
.
这样返回字符串的最大长度就是32767了。
posted on 2010-03-15 14:29
王总兵
阅读(80232)
评论(8)
编辑
收藏
所属分类:
DataBase
评论
#
re: 关于oracle中varchar2的最大长度
2010-05-26 11:53
wsw
谢谢,受教了~~
文章拿走了,呵呵
回复
更多评论
#
re: 关于oracle中varchar2的最大长度
2011-01-19 16:37
shaier
到底想要说明什么问题呢?
回复
更多评论
#
re: 关于oracle中varchar2的最大长度
2011-06-10 10:09
settleven
@shaier
同问~~~
如果前台传的参数大于4K个字符你有怎么办呢?
回复
更多评论
#
re: 关于oracle中varchar2的最大长度
2011-06-15 09:40
www
@settleven
使用clob存放数据
回复
更多评论
#
re: 关于oracle中varchar2的最大长度[未登录]
2011-10-25 10:38
欣欣
谢谢了!
回复
更多评论
#
re: 关于oracle中varchar2的最大长度
2013-04-19 11:47
qqs
Mark
回复
更多评论
#
re: 关于oracle中varchar2的最大长度
2013-06-13 15:55
sdf
afa
回复
更多评论
#
re: 关于oracle中varchar2的最大长度
2013-06-13 15:56
荒漠依米
你太给力了!果断顶起!!
回复
更多评论
新用户注册
刷新评论列表
只有注册用户
登录
后才能发表评论。
网站导航:
博客园
IT新闻
知识库
C++博客
博问
管理
相关文章:
讲解大型数据库的设计原则与开发技巧
关于oracle中varchar2的最大长度
[转]什么是savepoint?
oracle常用的监控语句
又回到了从前
存储过程事务控制
[转]ODI定时任务
oracle的flashback功能使用
oracle包——AJ_SHOWCASETABLE
oracle包—— TRANSPORT_CHECK
Powered by:
BlogJava
Copyright © 王总兵