oracle关于length和vsize函数的一些感想

来源:互联网 发布:python json 汉字 编辑:程序博客网 时间:2024/04/28 12:19
oracle关于length和vsize函数的一些感想
有时候我们判断一个入参或者值是否存在会通过它的长度来判断。下面就谈谈在oracle中的使用(本人所遇到的一些情况,仅供参考):
先描述下我要写的一个过程:根据开始月份和结束月份做一个回款统计报表。
再上代码:



最后进入正文:
入参为两个长度为6的月份。当然时间不能是任意的,所以要做个时间合法性校验。
起初的时候就做了个校验:1.时间的长度为6; 2.结束月份不能小于开始月份 3.不能跨年
有人就说了这有什么?没错,这确实没什么。如果这样就够了,那么就没有本文了。可能有人会问,入参不能未空。确实,这个我也有想到,看32行
if (p_e_len!=6) or (p_e_len!=6) then
 ...
end if;
我也是相当然的以为没有入参,那么这里校验就不会通过。可是我错了,大错特错。
实际运行过程中,如果两个时间的入参都不传。那么直接跳过该if判断,进入到else中。

首先来看一下语句:select length(null) from dual;
 没有任何值。
是否有人疑问,空不就是0吗?不急,接着往下看。

再看23行:
if (i_begin_date is null) or (i_end_date is null) then
    。。。。。
end if;

同样,两个入参不传,进入到了“。。。。。”中。
由此可推断 select length(null) fro dual的结果为null。

那么0和null是否能画上等号呢?
    if 0 is null then
      o_msg :='0等于null';
    else
      o_msg :='0不等于null';
    end if;
测试结果为: 0不等于null
为毛?
这是有oracle本身决定的,不做解释。
2.到这,本文的内容基本讲完了。说到计算长度,还有个函数也应该认识一下:vsize()。
   
   
--------------------------------------------------------------------------


这又是为嘛?
length函数计算字符串的实际长度,
vsize计算的则是字符串的实际存储空间(字节)。
所以才会有 vsize('ni中 ma') 等于7而不是6。(我的数据库编码格式为GBK,如果是utf-8的话,就是8字节了[一个中文字符为3字节])。
vsize通常在截取字符串的时候很有用。
3.有个有点牛叉叉sql大家可以探讨一下:
  select vsize(sysdate) from dual; 为多少字节?

-----------------------------------

-----------------------------------


为毛等于7?不应该是9吗?会不会把sysdate当做字符串处理了?
所以我想是想多了。
看看下面这个:

是不是有多感悟?开来是在把系统时间转为字符串的时候出现问题了。
注意观察为什么会有两条短线(-),是不是因为我们没有指定格式,它会有个默认的日期格式呢?
这个我谷哥、度娘了找了好久没找到答案。水平有限啊。