.Net程式員學用Oracle系列(10):系統函數(下)

来源:http://www.cnblogs.com/hanzongze/archive/2017/01/14/Oracle-SystemFunction2.html
-Advertisement-
Play Games

《.Net程式員學用Oracle系列:導航目錄》 本文大綱 1、 " 轉換函數 " 1.1、 "TO_CHAR" 1.2、 "TO_NUMBER" 1.3、 "TO_DATE" 1.4、 "CAST" 2、 " 近似值函數 " 2.1、 "ROUND" 2.2、 "TRUNC" 3、 " 正則函數 ...


《.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 ##,### $.
SELECT REGEXP_REPLACE(' a b c ','() ','\1') res FROM DUAL;  -- res:abc
SELECT REGEXP_REPLACE(' a b c ','() ','\1_') res FROM DUAL; -- res:_a_b_c_
SELECT REGEXP_REPLACE(' a b c ',' ','_') res FROM DUAL;     -- res:_a_b_c_

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系列:導航目錄》

本文聲明:如果您認為這篇文章還可以或對您有幫助,請點擊文章末尾的“推薦”按鈕。歡迎轉載、演繹或用於商業目的,但必須保留本文的署名韓宗澤,並且要在明顯位置給出原文鏈接!本人初寫博客,水平有限,若有不當之處,敬請批評指正,謝謝!



您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 後臺資料庫操作某個表時處於假死狀態,可能該表被某個用戶鎖定,導致其他用戶無法繼續操作, 如下是解決方案和實例。 查被鎖的表,以及用戶 解鎖,釋放SESSION SQL 實例如下: 執行查詢鎖表的sql,得到結果 現在想要sys_dbcfileinfo表被鎖定,如果處於其他用戶一直忘記提交狀態,現在繼 ...
  • Deeplearning 學習記錄,從人工神經網路到捲積神經網路_3_使用tensorflow搭建CNN來分類not_MNIST數據 ...
  • 前言 好長時間沒摸資料庫了,周末在家寫了個報表的存儲過程,一時間對使用存儲過程實現分頁的同時並計算出記錄總數不知道怎麼更好的去實現。按照我們正常的業務邏輯,存儲過程數據首先是分頁,其次接受若幹查詢條件,返回分頁結果集的同時還需要返回記錄總數給客戶端。 我對於這樣一個業務存儲過程總結如下:1、內核層, ...
  • SqlServer創建數據表描述及列描述信息 Intro Q: 為什麼要創建描述信息? A: 滑鼠懸停在對應表和列上時,會出現描述信息,可以提高工作的效率,藉助工具我們根據數據表可以生成Model,可以將描述信息。 添加描述語法 添加描述存儲過程【sp_addextendedproperty】語法 ...
  • 1.增加一列: Alter table 表名 add 列名 varchar2(10); 1.增加一列: Alter table 表名 add 列名 varchar2(10); 2.修改一列: Alter table 表名 modify 列名 varchar2(20); 3.刪除一列: Alter t ...
  • 資料庫版本 SQL SERVER 2012 企業版,版本號:11.0.5582.0 問題場景: 資料庫配置Alwayson環境,同機房2節點同步自動切換+跨機房非同步,在非同步機房中選取同一節點做完整備份和日誌備份,完整備份為COPY_ONLY方式,完整備份從0:35開始至1:40成功結束,日誌備份從0 ...
  • 金蝶KIS專業版 替換SXS.dll 遭後門清空數據(憑證被改為:恢複數據聯繫QQ 735330197,2251434429)恢復解決方法。 【客戶名稱】:山東青島福隆發紡織品有限公司 【軟體名稱】:金蝶KIS專業版12.2 【資料庫版本】:MS SQL server 2000 【資料庫大小】:1G ...
  • 這裡為百度經驗 http://jingyan.baidu.com/article/ff42efa93580c4c19e2202b6.html 然而在最後一步,回車不能夠越過密碼。 需要在解壓的mysq文件下的data文件下找到Acer.err,用記事本打開, Crtl+H查找 A temporary ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...