关于 varchar2 的最大长度
varchar2有两个最大长度:一个是在字段类型4000;一个是在PL/SQL中变量类型32767。这是一个比较容易出错的地方。因为在函数中可以声明长度超过4000的字符串变量,并且将它作为返回值,这里是不会提示编译错误的。这个函数平时都可以正常执行,而一旦这个字符串长度超过4000,函数执行就会出错。

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: 在
"MYMOTIF.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
--------------------------------------------------------------------------------
abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
bb

SQL> set long 10000
SQL> select funny from dual;
FUNNY
--------------------------------------------------------------------------------
abbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
.
 
这样返回字符串的最大长度就是32767了。

.关于oracle中varchar2的最大长度的更多相关文章

  1. Oracle中varchar2类型字段长度限制使用问题

    为纪念中华人民共和国建军90周年,特此一篇,以此纪念,我军威武!!! 一.问题背景 项目中商品发布,却没有保存成功. 二.问题定位 初步判断向数据库中保存时出现了错误,查看日志文件,由于日志文件过大就 ...

  2. 关于oracle中varchar2与nvarchar2的一点认识

    今天在oracle 10g下测试了下varchar2与nvarchar2这两种类型,网上有很多关于这两种类型的区别的帖子,我还是自己测试了下. varchar2(size type),size最大为4 ...

  3. oracle中Varchar2和nvarchar2的区别

    在oracle 11g下测试了下varchar2与nvarchar2这两种类型,网上有很多关于这两种类型的区别的帖子,我还是自己测试了下. varchar2(size type),size最大为400 ...

  4. oracle 中 某个字段的长度不够的sql 语句

    alter  table 表名 modify(字段名  类型)  之前字段type 的长度为50 现在改为100 举例 : alter table psp_model modify(type  var ...

  5. oracle中varchar2(2)存不了一个汉字的原因

    错误提示: 一个汉字占了三个字节,而不是两个,这跟字符集有关. 查一下字符集:select userenv('language') from dual; 结果显示,本机Oracle的字符集是UTF-8 ...

  6. oracle中varchar2字段存入blob字段及blob转成varchar2

    CREATE OR REPLACE FUNCTION C2B (b IN CLOB default empty_clob()) RETURN BLOB -- typecasts BLOB to CLO ...

  7. Oracle中varchar2(XX)和varchar2(XX byte)区别

    这两个相不相同是由参数NLS_LENGTH_SEMANTICS决定的,有两个单位,char(字符)或者字节(byte),该参数默认值为BYTE. alter session set nls_lengt ...

  8. oracle的varchar2和clob类型在hibernate中使用

    1.在oracle中 varchar2的最大长度为4000 bytes,即varchar2(4000),最多能储存2000个汉子或4000位的数字字母.当储存值超过时可以使用clob(Characte ...

  9. Oracle varchar2最大支持长度(转)

    oerr ora 0650206502, 00000, "PL/SQL: numeric or value error%s"// *Cause: An arithmetic, nu ...

随机推荐

  1. vue父子组件

    vue父子组件 新建 模板 小书匠  为什么要厘清哪个是父组件,哪个是子组件? 一开始浏览器接收和要显示的数据非常少,此时无需划分区域进行布局.随着页面数据量的增加,如果单纯一个窗口来加载和显示数据, ...

  2. Python 抓取数据存储到Redis中

    redis是一个key-value存储结构.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorted set ...

  3. Go(05)map介绍

    原文地址: http://www.limerence2017.com/2019/06/11/golang06/ 基本用法 map同样也是引用类型,map在使用前需要通过make进行初始化,否则会报pa ...

  4. python3下import MySQLdb出错问题

    原因:python2下是使用的MySQLdb,python3下用的是pymysql 安装 pip install pymysql

  5. Azure Data Lake Storage Gen2实战体验

    相较传统的重量级OLAP数据仓库,“数据湖”以其数据体量大.综合成本低.支持非结构化数据.查询灵活多变等特点,受到越来越多企业的青睐,逐渐成为了现代数据平台的核心和架构范式. 作为微软Azure上最新 ...

  6. 卸载openssl后yum无法使用,ssh无法连接的解决办法

    一,安装nginx时,提示openssl版本问题,用yum update openssl 发现还是不行,于是rpm -e 卸载了openssl 此时,才发现yum不能用了,然后想上传个tar包时又出现 ...

  7. 意想不到的JavaScript(每日一题2)

    问题一: 答案: 解析:

  8. word2vec原理浅析

     1.word2vec简介 word2vec,即词向量,就是一个词用一个向量来表示.是2013年Google提出的.word2vec工具主要包含两个模型:跳字模型(skip-gram)和连续词袋模型( ...

  9. 深入理解java:4. 框架编程

    了解 Servlet 和 Filter Servlet(即servlet-api.jar) 是 J2EE 最重要的一部分,有了 Servlet 你就是 J2EE 了,J2EE 的其他方面的内容择需采用 ...

  10. xc语言l博客作业03

    问题 答案 这个作业属于那个课程 c语言程序设计ll 这个作业要求在哪里 https://edu.cnblogs.com/campus/zswxy/CST2019-4/homework/8719 我在 ...