《.Net程序员学用Oracle系列:导航目录》

本文大纲

转换函数

Oracle 中的转换函数共计超过 20 个,但一大半都是做字节转换、日期(包括时间和时区)转换、LOB 类型转换、ROWID 类型转换等非常见转换的,光日期转换函数就占了 1/3。剩下几个函数当中有 4 个是比较实用的,也就是三大“TO 函数”及 CASE 函数。函数名及语法如下:

序号 函数名 语法原型 常用
1 TO_CHAR TO_CHAR( value [, format_mask] [, nls_language] )
2 TO_NUMBER TO_NUMBER( string1 [, format_mask] [, nls_language] )
3 TO_DATE TO_DATE( string1 [, format_mask] [, nls_language] )
4 CAST CAST( { expr | ( subquery ) | MULTISET ( subquery ) } AS type_name ) ×

TO_CHAR

TO_CHAR:即可作为数字字符函数也可作为日期字符函数,换句话说 value 可以是数字也可以是日期,无论何种情况,format 参数都有很多格式可选,nls language 一般不必考虑。

  • 用途一:TO_CHAR 作为数字字符函数时,format 参数有数几十种格式可选,这里主要介绍常见和常用的格式。

format 参数中的 TM:使用 TM 格式与不指定任何格式的效果一样。TM 格式有 TM9 和 TME 两种,默认是 TM9,当数字长度超过 64 位时候,TM9 的输出等同于 TME 的输出。示例:

SELECT TO_CHAR(3888) res FROM DUAL;       -- res:'3888'
SELECT TO_CHAR(3888,'TM9') res FROM DUAL; -- res:'3888'
SELECT TO_CHAR(8844.43) res FROM DUAL;       -- res:'8844.43'
SELECT TO_CHAR(8844.43,'TM9') res FROM DUAL; -- res:'8844.43'

format 参数中的点号:出现在小数点对应的位置,能且只能出现一次。示例:

SELECT TO_CHAR(8844.43,'9999.99') res FROM DUAL; -- res:' 8844.43'
SELECT TO_CHAR(8844.43,'9999.9') res FROM DUAL;  -- res:' 8844.4'

format 参数中的逗号:一般以千分位出现,如果需要也可以当作百分位、十分位,总之可出现 0 或多次。示例:

SELECT TO_CHAR(3888,'9,999') res FROM DUAL;   -- res:' 3,888'
SELECT TO_CHAR(3888,'9,9,9,9') res FROM DUAL; -- res:' 3,8,8,8'

format 参数中的 0:数字占位符,在 0 出现的位置,如果有数字则返回数字,如果没有数字则返回 0。示例:

SELECT TO_CHAR(3888,'00000') res FROM DUAL;  -- res:' 03888'
SELECT TO_CHAR(3888,'0000.0') res FROM DUAL; -- res:' 3888.0'

format 参数中的 9:数字占位符,当 9 出现在整数位时,如果有数字则返回数字,如果没有数字则返回空格,当 9 出现在小数位时,与 0 的作用相同。只要 format 中整数部分的 0 和 9 的总数没有 value 整数部分位数多,就会返回 #。示例:

SELECT TO_CHAR(3888,'99999') res FROM DUAL;  -- res:'  3888'
SELECT TO_CHAR(3888,'9999.9') res FROM DUAL; -- res:' 3888.0'
SELECT TO_CHAR(3888,'000') res FROM DUAL; -- res:'####'
SELECT TO_CHAR(3888,'999') res FROM DUAL; -- res:'####'

format 参数中的 $:美元符号,可出现在格式中任何位置,但最多只能出现一次,会在数字的返回值前加一个 $ 符号。示例:

SELECT TO_CHAR(3888,'$0000') res FROM DUAL; -- res:' $3888'

format 参数中的 B:表示空格,可出现在格式中任何位置,但最多只能出现一次,会在正数的返回值前加一个空格。本人感觉这个格式没有任何实际用处,但当 value 为正数时,几乎所有格式的返回值前面都会有一个空格,不知道是不是 Oracle 内部默认已经应用了 B 格式。示例:

SELECT TO_CHAR(3888,'B0000') res FROM DUAL;  -- res:' 3888'
SELECT TO_CHAR(-3888,'B0000') res FROM DUAL; -- res:'-3888'

format 参数中的 S:数字符号,可出现在格式开头或末尾,至多出现一次,会在 S 出现的位置给正数加一个 +,给负数加一个 -。示例:

SELECT TO_CHAR(3888,'S0000') res FROM DUAL;  -- res:'+3888'
SELECT TO_CHAR(3888,'0000S') res FROM DUAL;  -- res:'3888+'
SELECT TO_CHAR(-3888,'S0000') res FROM DUAL; -- res:'-3888'
SELECT TO_CHAR(-3888,'0000S') res FROM DUAL; -- res:'3888-'

format 参数中的 X:表示将 value 转换为 16 进制,且 value 必须是大于或等于 0 的整数。X 前面只能和 0 或 FM 组合使用。示例:

SELECT TO_CHAR(100,'XX') res FROM DUAL; -- res:' 64'

format 参数中的 FM:在格式前面再加上 FM,表示去掉返回值前面的空格。示例:

SELECT TO_CHAR(3888,'9999') res FROM DUAL;   -- res:' 3888'
SELECT TO_CHAR(3888,'FM9999') res FROM DUAL; -- res:'3888'

纯小数转换为字符串,如果能确定是纯小数,整数部分应该用 0 而不是 9,否则转换后会把小数点前面的 0 去掉,示例:

SELECT TO_CHAR(0.5,'FM9.9') res FROM DUAL; -- res:'.5'
SELECT TO_CHAR(0.5,'FM0.9') res FROM DUAL; -- res:'0.5'
  • 用途二:TO_CHAR 作为日期字符函数是,format 参数的可选格式比数值的更多,因此这里也主要介绍常见及常用的格式。

format 参数中的分隔符:除常见时间分隔符 -、:、/、,、.、; 以外,还可以使用自定义字符,如汉字,但需要用双引号包裹起来。示例:

SELECT TO_CHAR(fn_now,'yyyy-mm-dd') res FROM DUAL;            -- res:'2017-01-10'
SELECT TO_CHAR(fn_now,'yyyy-mm-dd hh24:mi') res FROM DUAL;    -- res:'2017-01-10 19:21'
SELECT TO_CHAR(fn_now,'yyyy/mm,dd hh24.mi;ss') res FROM DUAL; -- res:'2017/01,10 19.21;30'
SELECT TO_CHAR(fn_now,'yyyy"年"mm"月"dd"日"') res FROM DUAL;   -- res:'2017年01月10日'

format 参数中的 Y:yyyy 表示 4 位的年份;yyy 表示年份的后三位;yy 表示年份的后两位;y 表示年份的后一位。示例:

SELECT TO_CHAR(fn_now,'yyyy') res FROM DUAL; -- res:'2017'
SELECT TO_CHAR(fn_now,'yyy') res FROM DUAL;  -- res:'017'
SELECT TO_CHAR(fn_now,'yy') res FROM DUAL;   -- res:'17'
SELECT TO_CHAR(fn_now,'y') res FROM DUAL;    -- res:'7'

format 参数中的 M:mm 表示 2 位的月份(01~12);mi 表示分钟(0~59);month 表示月的名称;mon 月的前三个字母缩写。示例:

SELECT TO_CHAR(fn_now,'mm') res FROM DUAL;    -- res:'01'
SELECT TO_CHAR(fn_now,'mi') res FROM DUAL;    -- res:'21'
SELECT TO_CHAR(fn_now,'month') res FROM DUAL; -- res:'january  '/'1月 '
SELECT TO_CHAR(fn_now,'mon') res FROM DUAL;   -- res:'jan'/'1月 '

format 参数中的 D:单个 d 表示一周中第几天,返回 1~7;day 表示一周中的某天,返回星期几,返回值与 nls 有关;dy 表示周前三个字母缩写;dd 表示月份中的某天,返回 1~31;ddd 表示一年中的某天,返回 1~366。示例:

SELECT TO_CHAR(fn_now,'d') res FROM DUAL;   -- res:'2',在西方周日每周的第一天
SELECT TO_CHAR(fn_now,'day') res FROM DUAL; -- res:'tuesday  '/'星期二'
SELECT TO_CHAR(fn_now,'dy') res FROM DUAL;  -- res:'tue'/'星期二'
SELECT TO_CHAR(fn_now,'dd') res FROM DUAL;  -- res:'10'
SELECT TO_CHAR(fn_now,'ddd') res FROM DUAL; -- res:'010'

format 参数中的 H:hh24 表示 24 小时制的小时数;hh12 表示 12 小时制的小时数;hh 是 hh12 的简写形式。示例示例

SELECT TO_CHAR(fn_now,'hh24') res FROM DUAL; -- res:'19'
SELECT TO_CHAR(fn_now,'hh12') res FROM DUAL; -- res:'07'
SELECT TO_CHAR(fn_now,'hh') res FROM DUAL;   -- res:'07'

format 参数中的 S:ss 表示秒(0~59);sssss 表示一天从午夜开始累积的秒数(0~86399)。示例:

SELECT TO_CHAR(fn_now,'ss') res FROM DUAL;    -- res:'30'
SELECT TO_CHAR(fn_now,'sssss') res FROM DUAL; -- res:'69690'

format 参数其它的一些不常用格式,都比较简单,示例:

SELECT TO_CHAR(fn_now,'cc') res FROM DUAL; -- res:'21',世纪
SELECT TO_CHAR(fn_now,'q') res FROM DUAL;  -- res:'1',年的季度
SELECT TO_CHAR(fn_now,'iw') res FROM DUAL; -- res:'02',年的周数(ISO 标准)
SELECT TO_CHAR(fn_now,'ww') res FROM DUAL; -- res:'02',年的周数
SELECT TO_CHAR(fn_now,'w') res FROM DUAL;  -- res:'2',月的周数
SELECT TO_CHAR(fn_now,'am') res FROM DUAL; -- res:'pm',等同于 PM、A.M.和P.M.
SELECT TO_CHAR(fn_now,'ts') res FROM DUAL; -- res:'PM 7:21:30',短日期
SELECT TO_CHAR(fn_now,'rm') res FROM DUAL; -- res:'i   ',罗马数字表示的月份

TO_NUMBER

TO_NUMBER:主要用途就是把字符串形式的数字转换为数字,参数格式与 TO_CHAR 作为数字字符函数的参数格式基本相同,nls 一般也不用考虑。示例:

SELECT TO_NUMBER('8844.43','9999.99') res FROM DUAL; -- res:'8844.43'
SELECT TO_NUMBER('8844.43') res FROM DUAL;           -- res:'8844.43'
SELECT TO_NUMBER('3888','9999') res FROM DUAL;       -- res:'3888'
SELECT TO_NUMBER('3888') res FROM DUAL;              -- res:'3888'

三大 TO 函数 中,TO_NUMBER 用的相对较少,且格式要求非常严格,即便是正确的格式,哪怕是格式长度小于实际数值长度 invalid number,遇到非数值就更加会出错了。通过上面 4 个示例也很容易发现——貌似指不指定格式都没啥区别。但如果是历史数据掺杂了少量字符,也可以通过替换非数字字符的方式来进一步处理,示例:

SELECT TO_NUMBER(REGEXP_REPLACE('8844.43m','[^0-9.]','')) res FROM DUAL; -- res:8844.43

TO_DATE

TO_DATE:主要用途就是把字符串形式的日期转换为日期,参数格式 TO_CHAR 做为日期字符函数的参数格式基本相同,nls 一般也不用考虑。示例:

SELECT TO_DATE('2017/01/10','yyyy-mm-dd') res FROM DUAL; -- res:'2017-01-10'
SELECT TO_DATE('20170110','yyyymmdd') res FROM DUAL;     -- res:'2017-01-10'
SELECT TO_DATE('2017-01','yyyy-mm') res FROM DUAL;       -- res:'2017-01-01'
SELECT TO_DATE('201701','yyyymm') res FROM DUAL;         -- res:'2017-01-01'

如果要转换的日期字符串长度不一致,常会遇到这个错误:ORA-01830: data format picture ends before converting entire input string,以下三条语句都会报这个错:

SELECT TO_DATE('2017-01-10 23:15:12','yyyy-mm-dd hh24:mi') res FROM DUAL; -- ORA-01830
SELECT TO_DATE('2017-01-10 23:15','yyyy-mm-dd hh24') res FROM DUAL;       -- ORA-01830
SELECT TO_DATE('2017-01-10 23','yyyy-mm-dd') res FROM DUAL;               -- ORA-01830

我分析应该是由于实际日期比格式化串长,导致了类似“溢出”的问题。

CAST

CAST:简单来说就是把一种数据类型转换为另一种数据类型,参数包含原值和目标转换类型两部分,其中原值可以表达式也可以是子查询,还可以是个集合。示例:

SELECT CAST(3888 AS INT) res FROM DUAL;
SELECT CAST(0.5 AS INT) res FROM DUAL;
SELECT CAST(0.5 AS NUMBER) res FROM DUAL;
SELECT CAST(8844.43 AS NUMBER(6,1)) res FROM DUAL;
SELECT CAST(fn_today AS VARCHAR2(10)) res FROM DUAL;

近似值函数

有两个函数很有意思,而且经常会用到,但对于没有系统学过 PLSQL 的人或 PLSQL 写的少的人来说,也许对这两个函数并没有太多“好感”,因为总是把名字或类型或格式搞混了。本人根据它们的用途,给它们取了一个功能类别名称,称之为近似值函数。函数名及语法如下:

序号 函数名 语法原型 常用
1 ROUND ROUND( number [, decimal_places] )
1 ROUND ROUND( date [, format] )
2 TRUNC TRUNC( number [, decimal_places] ) ×
2 TRUNC TRUNC( date [, format ] )

ROUND

处理数字时:返回指定数字四舍五入后的值。两个参数都必须是数字或数字表达式,第二个参数为正数则将数字四舍五入为指定位小数,为负数则将数字四舍五入为小数点向左指定位整数,为小数则先截取数字的整数部分再做四舍五入,第二个参数值默认为 0,表示截取 0 位小数,即四舍五入到个位。

SELECT ROUND(555.555,2) res FROM DUAL;    -- res:555.56
SELECT ROUND(555.555,4) res FROM DUAL;    -- res:555.555
SELECT ROUND(555.555,-1) res FROM DUAL;   -- res:560
SELECT ROUND(555.555,-1.5) res FROM DUAL; -- res:560
SELECT ROUND(555.555,1.5) res FROM DUAL;  -- res:555.6
SELECT ROUND(555.555,0) res FROM DUAL;    -- res:556
SELECT ROUND(555.555) res FROM DUAL;      -- res:556

处理日期时:返回日期按指定区间四舍五入后得到期间的开始日期。区间的取值范围比较广,也可以不指定区间,不指定的效果相当于指定为 'dd',函数规则较多,示例难以穷尽,只介绍一些本人比较熟悉的。示例:

SELECT ROUND(fn_now) res FROM DUAL;         -- res:2017-01-11,对天四舍五入,精确到天
SELECT ROUND(fn_now,'dd') res FROM DUAL;    -- res:2017-01-11,同上
SELECT ROUND(fn_now,'mm') res FROM DUAL;    -- res:2017-01-01,对月四舍五入,取当月第一天
SELECT ROUND(fn_now,'month') res FROM DUAL; -- res:2017-01-01,同上
SELECT ROUND(fn_now,'yyyy') res FROM DUAL;  -- res:2017-01-01,对年四舍五入,取当年第一天
SELECT ROUND(fn_now,'year') res FROM DUAL;  -- res:2017-01-01,同上
SELECT ROUND(fn_now,'day') res FROM DUAL;   -- res:2017-01-08,对周四舍五入,取当周周日
SELECT ROUND(fn_now,'d') res FROM DUAL;     -- res:2017-01-08,同上
SELECT ROUND(fn_now,'q') res FROM DUAL;     -- res:2017-01-01,对季度四舍五入,取当季度第一天
SELECT ROUND(fn_now,'hh') res FROM DUAL;    -- res:2017-01-10 19:00:00,对小时四舍五入

TRUNC

处理数字时:返回数字按指定精度截取后的值。TRUNC 函数用法与 ROUND 函数用法相同,不同的是返回值可能不同,ROUND 函数按指定精度四舍五入,TRUNC 函数按指定精度直接截取。示例:

SELECT TRUNC(555.555,2) res FROM DUAL;    -- res:555.55
SELECT TRUNC(555.555,4) res FROM DUAL;    -- res:555.555
SELECT TRUNC(555.555,-1) res FROM DUAL;   -- res:550
SELECT TRUNC(555.555,-1.5) res FROM DUAL; -- res:550
SELECT TRUNC(555.555,1.5) res FROM DUAL;  -- res:555.5
SELECT TRUNC(555.555,0) res FROM DUAL;    -- res:555
SELECT TRUNC(555.555) res FROM DUAL;      -- res:555

处理日期时:返回日期在指定的当前区间的开始日期。与 ROUND 用法相似,且当区间取值为 'mm'|'month'|'hh' 时,返回值与 ROUND 相同。示例:

SELECT TRUNC(fn_now) res FROM DUAL;         -- res:2017-01-10,舍去当天的日期部分
SELECT TRUNC(fn_now,'dd') res FROM DUAL;    -- res:2017-01-10,同上
SELECT TRUNC(fn_now,'mm') res FROM DUAL;    -- res:2017-01-01,本月第一天
SELECT TRUNC(fn_now,'month') res FROM DUAL; -- res:2017-01-01,同上
SELECT TRUNC(fn_now,'yyyy') res FROM DUAL;  -- res:2017-01-01,本年第一天
SELECT TRUNC(fn_now,'year') res FROM DUAL;  -- res:2017-01-01,同上
SELECT TRUNC(fn_now,'day') res FROM DUAL;   -- res:2017-01-04,本周日,含当天
SELECT TRUNC(fn_now,'d') res FROM DUAL;     -- res:2017-01-04,同上
SELECT TRUNC(fn_now,'q') res FROM DUAL;     -- res:2017-01-01,本季度第一天
SELECT TRUNC(fn_now,'hh') res FROM DUAL;    -- res:2017-01-10 19:00:00,舍去小时之后的时间

正则函数

Oracle 对正则表达式的支持比较晚,直到 10g 才提供了 4 个正则函数,11g 中又新增了一个,由于本人使用的 10g,所以本节只简要介绍前 4 个。函数名及语法如下:

序号 函数名 语法原型 支持
1 REGEXP_INSTR REGEXP_INSTR( string, pattern [, start_position [, th_appearance [, return_option [, match_parameter [, sub_expression ] ] ] ] ] ) 10g
2 REGEXP_REPLACE REGEXP_REPLACE( string, pattern [, replacement_string [, start_position [, th_appearance [, match_parameter ] ] ] ] ) 10g
3 REGEXP_SUBSTR REGEXP_SUBSTR( string, pattern [, start_position [, th_appearance [, match_parameter [, sub_expression ] ] ] ] ) 10g
4 REGEXP_LIKE REGEXP_LIKE ( expression, pattern [, match_parameter ] ) 10g
5 REGEXP_COUNT REGEXP_COUNT( string, pattern [, start_position [, atch_parameter ] ] ) 11g

REGEXP_INSTR:与 INSTR 函数类似,它返回一个字符串中匹配一个正则表达式的第一个子串的开始位置。另外还可以指定子串出现的次数;开始搜索的位置;是返回匹配的位置还是返回匹配之后字符的位置。示例:

SELECT REGEXP_INSTR('I have a dream.','a',1,3) res FROM DUAL; -- res:13,匹配第3个 'a' 的位置
SELECT REGEXP_INSTR('I have a dream.','a') res FROM DUAL; -- res:4,匹配第1个 'a' 的位置
SELECT REGEXP_INSTR('I have a dream.','A') res FROM DUAL; -- res:0,匹配第1个 'A' 的位置
SELECT REGEXP_INSTR('I have a dream.','A',1,1,0,'i') res FROM DUAL; -- res:4,匹配第1个 'A' 的位置,并且忽略大小写

REGEXP_REPLACE:与 REPLACE 函数类似,它返回匹配一个正则表达式的子串。虽然结合使用SUBSTR 和REGEXP_INSTR 及LENGTH 也可以实现这一功能,但是使用这个函数却更为简单。示例:

SELECT REGEXP_REPLACE('Obama is the president of the USA.','Obama','Trump') res FROM DUAL; -- res:Trump is the president of the USA.
SELECT REGEXP_REPLACE('Annual income is 99,800 $.','\d','#') res FROM DUAL; -- res:Annual income is ##,### $.

REGEXP_SUBSTR:与 SUBSTR 函数类似,它返回初始参数被匹配子串替换之后的结果。

SELECT REGEXP_SUBSTR('In that distant place.','(\S*)') res FROM DUAL;          -- res:'In'
SELECT REGEXP_SUBSTR('In that distant place.','(\S*)(\s*)') res FROM DUAL;     -- res:'In '
SELECT REGEXP_SUBSTR('In that distant place.','(\S*)(\s*)',1,2) res FROM DUAL; -- res:'that '
SELECT REGEXP_SUBSTR('Programmer','A|B|P') res FROM DUAL;         -- res:'P'
SELECT REGEXP_SUBSTR('Programmer','A|B|P',1,1,'i') res FROM DUAL; -- res:'P'
SELECT REGEXP_SUBSTR('Programmer','A|B|P',1,2,'i') res FROM DUAL; -- res:'a'
SELECT REGEXP_SUBSTR('There are 10 good girls.','\d') res FROM DUAL;  -- res:1
SELECT REGEXP_SUBSTR('There are 10 good girls.','\d+') res FROM DUAL; -- res:10

REGEXP_LIKE:与 LIKE 操作符相似,如果第一个参数匹配正则表达式它就解析为 TRUE。示例:

SELECT t.enum_name FROM demo.t_field_enum t WHERE REGEXP_LIKE(t.enum_name, '(研发)');
--------------------------------------
研发一部 010101
研发二部 010102
研发三部 010103

高级函数

在 Oracle 提供的高级函数中,不计算分析函数也有 20 个左右。我感觉大部分还是比较实用的,譬如 DECODENVL2LNNVL 等函数真的是挺好用的,唯一的问题是它们都是 Oracle 的“方言”,在数据库编程规范中已经讲过为什么要尽量使用 SQL99 标准。本节会列出 15 个我认为还比较实用的函数,但只会具体讲解 CASENVLSQLCODESQLERRM 4 个找不到替代不得不用的函数,以及 USERUSERENV 两个我觉得只在开发过程中用用还挺方便的函数,其它函数一概不介绍。

序号 函数名 语法原型 常用
1 CASE CASE [ expression ] WHEN condition_1 THEN result_1 ... WHEN condition_n THEN result_n ELSE result END
2 DECODE DECODE( expression , search , result [, search , result]... [, default] ) ×
3 EMPTY_BLOB EMPTY_BLOB() ×
4 EMPTY_CLOB EMPTY_CLOB() ×
5 GROUP_ID GROUP_ID() ×
6 LNNVL LNNVL( condition ) ×
7 NANVL NANVL( value, replace_with ) ×
8 NULLIF NULLIF( expr1, expr2 ) ×
9 NVL NVL( string1, replace_with )
10 NVL2 NVL2( string1, value_if_not_null, value_if_null ) ×
11 SQLCODE SQLCODE ×
12 SQLERRM SQLERRM ×
13 SYS_CONTEXT SYS_CONTEXT( namespace, parameter [, length] ) ×
14 USER USER ×
15 USERENV USERENV( parameter ) ×

SQLCODE & SQLERRM:当需要在过程中处理异常时,就会用到这两个函数。经典示例:

EXCEPTION
  WHEN OTHERS THEN
    err_code := SQLCODE;
    err_msg := SUBSTR(SQLERRM, 1, 200);

    INSERT INTO audit_table (error_number, error_message)
    VALUES (err_code, err_msg);
END;

USER:当前登录的用户的 USERNAME。实际开发中,有时候我们需要知道当前登录用户到底是那一个,这个函数就派上用场了。示例:

SELECT USER res FROM DUAL;  -- res:DEMO

USERENV:用于检索当前 Oracle 会话信息,可检索信息的代码包括:{CLIENT_INFO/ENTRYID/INSTANCE/ISDBA/LANG/LANGUAGE/SESSIONID/TERMINAL}。这个函数替代函数是 SYS_CONTEXT,但这个功能仍然存在向后兼容,不过本人只在开发过程中用用,不必考虑这些因素。下面四个是我觉得比较实用的参数,尤其是第三个,在解决某些由编码造成的问题时很有用。示例:

SELECT USERENV('ISDBA') res FROM DUAL;    -- res:FALSE
SELECT USERENV('LANG') res FROM DUAL;     -- res:ZHS
SELECT USERENV('LANGUAGE') res FROM DUAL; -- res:SIMPLIFIED CHINESE_CHINA.ZHS16GBK
SELECT USERENV('TERMINAL') res FROM DUAL; -- res:HZZ-PC

总结

从上一篇博文到这一篇博文,我主要根据我个人的日常工作和喜好,介绍了 Oracle 中我认为还比较实用的函数,希望对园友们能有所帮助!

《.Net程序员学用Oracle系列:导航目录》

本文声明:如果您认为这篇文章还可以或对您有帮助,请点击文章末尾的“推荐”按钮。欢迎转载、演绎或用于商业目的,但必须保留本文的署名韩宗泽,并且要在明显位置给出原文链接!本人初写博客,水平有限,若有不当之处,敬请批评指正,谢谢!

.Net程序员学用Oracle系列(10):系统函数(下)的更多相关文章

  1. .Net程序员学用Oracle系列(10):系统函数(中)

    1.四大转换函数 1.1.TO_CHAR 1.2.TO_NUMBER 1.3.TO_DATE 1.4.CAST 2.两大近似值函数 2.1.ROUND 2.2.TRUNC 3.正则函数 3.1.正则函 ...

  2. .Net程序员学用Oracle系列(1):导航目录

    本人从事基于 Oracle 的 .Net 企业级开发近三年,在此之前学习和使用的都是 (MS)SQL Server.未曾系统的了解过 Oracle,所以长时间感到各种不习惯.不方便.怪异和不解,常会遇 ...

  3. .Net程序员学用Oracle系列(7):视图、函数、存储过程、包

    1.视图 1.1.创建.删除及调用普通视图 1.2.高级视图介绍 2.函数 2.1.系统函数介绍 2.2.创建.删除及调用自定义函数 3.存储过程 3.1.创建.修改及删除存储过程 3.2.调用存储过 ...

  4. 系列文章----.Net程序员学用Oracle系列

    .Net程序员学用Oracle系列(18):PLSQL Developer 攻略 .Net程序员学用Oracle系列(17):数据库管理工具(SQL Plus) .Net程序员学用Oracle系列(1 ...

  5. .Net程序员学用Oracle系列(6):表、字段、注释、约束、索引

    <.Net程序员学用Oracle系列:导航目录> 本文大纲 1.表 1.1.创建表 1.2.修改表 & 删除表 2.字段 2.1.添加字段 2.2.修改字段 & 删除字段 ...

  6. .Net程序员学用Oracle系列(7):视图、函数、过程、包

    <.Net程序员学用Oracle系列:导航目录> 本文大纲 1.视图 1.1.创建视图 2.函数 2.1.创建函数 2.2.调用函数 3.过程 3.1.创建过程 3.2.调用过程 4.包 ...

  7. .Net程序员学用Oracle系列(9):系统函数(上)

    <.Net程序员学用Oracle系列:导航目录> 本文大纲 1.字符函数 1.1.字符函数简介 1.2.语法说明及案例 2.数字函数 2.1.数字函数简介 2.2.语法说明及案例 3.日期 ...

  8. .Net程序员学用Oracle系列(11):系统函数(下)

    1.聚合函数 1.1.COUNT 函数 1.2.SUM 函数 1.3.MAX 函数 1.4.MIN 函数 1.5.AVG 函数 2.ROWNUM 函数 2.1.ROWNUM 函数简介 2.2.利用 R ...

  9. .Net程序员学用Oracle系列(26):PLSQL 之类型、变量和结构

    1.类型 1.1.属性类型 1.2.记录类型 2.变量 2.1.变量类型 2.2.变量定义 2.3.变量赋值 3.结构 3.1.顺序结构 3.2.选择结构 3.3.循环结构 4.总结 1.类型 在&l ...

随机推荐

  1. UI控件库

    UI控件库分享:DWZ(j-UI).LigerUI.Linb DWZ(j-UI): 在线演示地址:http://demo.dwzjs.com 在线文档:http://demo.dwzjs.com/do ...

  2. 删除Python UserWarning[已解决]

    在使用MySQLdb包后,导入测试时发现一个警告. /usr/lib/python2.6/site-packages/setuptools-0.8-py2.6.egg/pkg_resources.py ...

  3. SQL点滴19—T-SQL中的透视和逆透视

    原文:SQL点滴19-T-SQL中的透视和逆透视 透视 今天抽一点时间来看看透视和逆透视语句,简单的说就是行列转换.假设一个销售表中存放着产品号,产品折扣,产品价格三个列,每一种产品号可能有多种折扣, ...

  4. openwrt构建过程探索

    参考网站:http://wiki.openwrt.org/doc/howto/buildroot.exigence 需要下载必要的库文件,编译器等... 1 首先要获得openwrt的源码,参考ope ...

  5. ASP.NET MVC Model元数据

    ASP.NET MVC Model元数据(三) 前言 在上篇中我们大概的讲解了Model元数据的生成过程,并没有对Model元数据本身和详细的生成过程有所描述,本篇将会对详细的生成过程进行讲解,并且会 ...

  6. Jenkins中关于一些插件的使用方法

    最近在为公司搭建CI平台过程中,以及在具体项目实施过程中使用过的一些插件的具体用法: 1. ant插件 这个插件可能是我们最为经常使用的,若构建脚本是使用build.xml的,那构建引擎肯定会选择an ...

  7. enode框架

    enode框架 2.0 step by step之整体架构介绍 前言 enode框架简介 enode架构图 command handler一次只处理一个command 让domain生活在in mem ...

  8. ASP.NET Web API的HttpController是如何被激活的?

    ASP.NET Web API的HttpController是如何被激活的? HttpController与HttpControllerDescriptor 程序集的解析 HttpController ...

  9. ToolBox Analysis & Design

    话说小菜过做已近3年,虽出身PHP后项目大多涉及.net,系统也做得比较繁杂,从常见的CMS,企业OA,ERP,也涉及到电商系统的开发定制,爬虫,工具不一而足,其中web系统居多. 由于表现良好,时常 ...

  10. linux下开机启动脚本的方法

    1.准备好要随机启动的程序,例如 /root/test.sh .确保其可执行. 2.在目录 /etc/init.d/ 下编写控制脚本 test . #!/bin/sh ### BEGIN INIT I ...