关于 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. DS博客作业08—课程总结

    1.当初你是如何做出选择计算机专业的决定的? 开始时我选择的专业就是网络/物联网,计算机专业是一个充满创造性的专业 2.对比开篇博客,哪些方面还存在哪些不足? 这个人就像戏台上的老将军,全身插满fla ...

  2. html实现高亮检索

    实现效果如下: demo.html <!DOCTYPE html> <html> <head> <meta charset="utf-8" ...

  3. 浏览器端-W3School-JavaScript:JavaScript Math 对象

    ylbtech-浏览器端-W3School-JavaScript:JavaScript Math 对象 1.返回顶部 1. Math 对象 Math 对象用于执行数学任务. 使用 Math 的属性和方 ...

  4. Selenium 2自动化测试实战4(引用模块)

    一.模组1.模组也叫类库或模块,引用模块 在python中,通过import….或from….import….的方式引用模块,下面引用time模块 import time print (time.ct ...

  5. Oracle 无备份情况下的恢复--临时文件/在线重做日志/ORA-00205

    13.5 恢复临时文件 临时文件没有也不应该备份.通过V$TEMPFILE可以找到所有的临时文件. 此类文件的损坏会造成需要使用临时表空间的命令执行失败,不至于造成实例崩溃或session中断.由于临 ...

  6. Pytorch笔记 (2) 初识Pytorch

    一.人工神经网络库 Pytorch ———— 让计算机  确定神经网络的结构 +   实现人工神经元 + 搭建人工神经网络 + 选择合适的权重 (1)确定人工神经网络的 结构: 只需要告诉Pytorc ...

  7. linux等 入门思维导图

  8. 实验仓 #779.【CSP2019模拟 Day 1】A题

    题目传送门 考场上面做了一个暴力的做法,然后,然后他$WA$了. emmm...($T$就算了吧,$WA$了算什么事啊) 好吧,这道题,其实好像...是一道思维题来着. 如果出现了这样两个打X的格子上 ...

  9. echarts 饼图-->如何修改legend模板?

    首先需要在初始化图表的方法中过滤一下数据 ,将你需要的 名称  所占百分比 所占数量  筛选出来 let dataFilter = [ { value: 20, name: "未知" ...

  10. [ASP.NET] [JS] GridView点击高亮当前选择行,并在点击另一行时恢复上一选择行背景颜色

    在ASP.NET中的gridview控件里面可以通过设定其OnRowDataBound事件来进行实现高亮当前行的操作 前端控件的设置: 只要设置好OnRowDataBound属性即可,会自动在.cs文 ...