oracle 10g函式大全--其他函式

水之原發表於2013-08-27
DUMP(w[,x[,y[,z]]])
【功能】返回資料型別、位元組長度和在內部的儲存位置.
【引數】
 w為各種型別的字串(如字元型、數值型、日期型……)
 x為返回位置用什麼方式表達,可為:8,10,16或17,分別表示:8/10/16進位制和字元型,預設為10。
 y和z決定了內部引數位置

【返回】型別 <[長度]>,符號/指數位 [數字1,數字2,數字3,......,數字20]
如:Typ=2 Len=7: 60,89,67,45,23,11,102

SELECT DUMP('ABC',1016) FROM dual;  
返回結果為:Typ=96 Len=3 CharacterSet=ZHS16GBK: 41,42,43 

  程式碼 資料型別
  0 對應 VARCHAR2
  1 對應 NUMBER
  8 對應 LONG
  12 對應 DATE
  23 對應 RAW
  24 對應 LONG RAW
  69 對應 ROWID
  96 對應 CHAR
  106 對應 MSSLABEL

各位的含義如下:

1.型別: Number型,Type=2 (型別程式碼可以從Oracle的文件上查到)
2.長度:指儲存的位元組數
3.符號/指數位
在儲存上,Oracle對正數和負數分別進行儲存轉換:
正數:加1儲存(為了避免Null)
負數:被101減,如果總長度小於21個位元組,最後加一個102(是為了排序的需要)

指數位換算:
正數:指數=符號/指數位 - 193 (最高位為1是代表正數) 
負數:指數=62 - 第一位元組

4.從<數字1>開始是有效的資料位

從<數字1>開始是最高有效位,所儲存的數值計算方法為:

將下面計算的結果加起來:

每個<數字位>乘以100^(指數-N) (N是有效位數的順序位,第一個有效位的N=0)

5、舉例說明

SQL> select dump(123456.789) from dual;
返回:Typ=2 Len=6: 195,13,35,57,79,91
 
<指數>:    195 - 193 = 2 
<數字1>     13 - 1     = 12 *100^(2-0) 120000 
<數字2>     35 - 1     = 34 *100^(2-1) 3400 
<數字3>     57 - 1     = 56 *100^(2-2) 56 
<數字4>     79 - 1     = 78 *100^(2-3) .78 
<數字5>     91 - 1     = 90 *100^(2-4) .009 
                             123456.789 

SQL> select dump(-123456.789) from dual;
返回:Typ=2 Len=7: 60,89,67,45,23,11,102
演算法:
<指數>  62 - 60 = 2(最高位是0,代表為負數) 
<數字1> 101 - 89 = 12 *100^(2-0) 120000 
<數字2> 101 - 67 = 34 *100^(2-1) 3400 
<數字3> 101 - 45 = 56 *100^(2-2) 56 
<數字4> 101 - 23 = 78 *100^(2-3) .78 
<數字5> 101 - 11 = 90 *100^(2-4) .009 
                               123456.789(-) 

現在再考慮一下為什麼在最後加102是為了排序的需要,-123456.789在資料庫中實際儲存為

60,89,67,45,23,11 

而-123456.78901在資料庫中實際儲存為 

60,89,67,45,23,11,91 

可見,如果不在最後加上102,在排序時會出現-123456.789<-123456.78901的情況。

greatest(exp1,exp2,exp3,……,expn)
【功能】返回表示式列表中值最大的一個。如果表示式型別不同,會隱含轉換為第一個表示式型別。
【引數】exp1……n,各型別表示式
【返回】exp1型別

【示例】
  SELECT greatest(10,32,'123','2006') FROM dual;

   SELECT greatest('kdnf','dfd','a','206') FROM dual;

least(exp1,exp2,exp3,……,expn)
【功能】返回表示式列表中值最小的一個。如果表示式型別不同,會隱含轉換為第一個表示式型別。
【引數】exp1……n,各型別表示式
【返回】exp1型別

【示例】
  SELECT least(10,32,'123','2006') FROM dual;

SELECT least('kdnf','dfd','a','206') FROM dual;

【語法】NVL (expr1, expr2)
【功能】若expr1為NULL,返回expr2;expr1不為NULL,返回expr1。
注意兩者的型別要一致 


【語法】NVL2 (expr1, expr2, expr3) 
【功能】expr1不為NULL,返回expr2;expr2為NULL,返回expr3。
	expr2和expr3型別不同的話,expr3會轉換為expr2的型別 

user
【功能】返回當前會話對應的資料庫使用者名稱。
【引數】無
 
【返回】字元型

uid
【功能】返回當前會話所對應的使用者id號。
【引數】無
 
【返回】字元型

userenv(parameter)
【功能】返回當前會話上下文屬性。
【引數】Parameter是引數,可以用以下引數代替:
Isdba:若使用者具有dba許可權,則返回true,否則返回false.
Language:返回當前會話對應的語言、地區和字符集。
LANG:返回當前環境的語言的縮寫
Terminal:返回當前會話所在終端的作業系統識別符號。
Sessionid:返回正在使用的審計會話號.
Client_info:返回使用者會話資訊,若沒有則返回null.
【返回】根據引數不同則型別不同

【示例】
Select userenv('isdba'),userenv('Language'),userenv('Terminal'),userenv('Client_info') from dual;

decode(條件,值1,翻譯值1,值2,翻譯值2,...值n,翻譯值n,預設值)
【功能】根據條件返回相應值
【引數】c1, c2, ...,cn,字元型/數值型/日期型,必須型別相同或null
注:值1……n 不能為條件表示式,這種情況只能用case when then end解決

·含義解釋:  
  decode(條件,值1,翻譯值1,值2,翻譯值2,...值n,翻譯值n,預設值)  
  該函式的含義如下:  
  IF 條件=值1 THEN
  RETURN(翻譯值1)
  ELSIF 條件=值2 THEN
  RETURN(翻譯值2)
  ......
  ELSIF 條件=值n THEN
  RETURN(翻譯值n)  
  ELSE
  RETURN(預設值)
  END IF
  
或:
  when case 條件=值1 THEN
  RETURN(翻譯值1)
  ElseCase 條件=值2 THEN
  RETURN(翻譯值2)
  ......
  ElseCase 條件=值n THEN
  RETURN(翻譯值n)  
  ELSE
  RETURN(預設值)
  END

【示例】
  ·使用方法:  
  1、比較大小  
  select decode(sign(變數1-變數2),-1,變數1,變數2) from dual; --取較小值
  sign()函式根據某個值是0、正數還是負數,分別返回0、1、-1  
  例如:
  變數1=10,變數2=20
  則sign(變數1-變數2)返回-1,decode解碼結果為“變數1”,達到了取較小值的目的。
  
  2、表、檢視結構轉化  
  現有一個商品銷售表sale,表結構為:  
  month    char(6)      --月份
  sell    number(10,2)   --月銷售金額  
  現有資料為:  
  200001  1000
  200002  1100
  200003  1200
  200004  1300
  200005  1400
  200006  1500
  200007  1600
  200101  1100
  200202  1200
  200301  1300
  
  想要轉化為以下結構的資料:  
  year   char(4)      --年份
  month1  number(10,2)   --1月銷售金額
  month2  number(10,2)   --2月銷售金額
  month3  number(10,2)   --3月銷售金額
  month4  number(10,2)   --4月銷售金額
  month5  number(10,2)   --5月銷售金額
  month6  number(10,2)   --6月銷售金額
  month7  number(10,2)   --7月銷售金額
  month8  number(10,2)   --8月銷售金額
  month9  number(10,2)   --9月銷售金額
  month10  number(10,2)   --10月銷售金額
  month11  number(10,2)   --11月銷售金額
  month12  number(10,2)   --12月銷售金額
  
  結構轉化的SQL語句為:
  
  create or replace view
  v_sale(year,month1,month2,month3,month4,month5,month6,  
  month7,month8,month9,month10,month11,month12)
  as
  select
  substrb(month,1,4),
  sum(decode(substrb(month,5,2),'01',sell,0)),
  sum(decode(substrb(month,5,2),'02',sell,0)),
  sum(decode(substrb(month,5,2),'03',sell,0)),
  sum(decode(substrb(month,5,2),'04',sell,0)),
  sum(decode(substrb(month,5,2),'05',sell,0)),
  sum(decode(substrb(month,5,2),'06',sell,0)),
  sum(decode(substrb(month,5,2),'07',sell,0)),
  sum(decode(substrb(month,5,2),'08',sell,0)),
  sum(decode(substrb(month,5,2),'09',sell,0)),
  sum(decode(substrb(month,5,2),'10',sell,0)),
  sum(decode(substrb(month,5,2),'11',sell,0)),
  sum(decode(substrb(month,5,2),'12',sell,0))
  from sale
  group by substrb(month,1,4);

【語法】NULLIF (expr1, expr2)
【功能】expr1和expr2相等返回NULL,不相等返回expr1

COALESCE(c1, c2, ...,cn)
【功能】返回列表中第一個非空的表示式,如果所有表示式都為空值則返回1個空值
【引數】c1, c2, ...,cn,字元型/數值型/日期型,必須型別相同或null
【返回】同引數型別
【說明】從Oracle 9i版開始,COALESCE函式在很多情況下就成為替代CASE語句的一條捷徑
【示例】
select COALESCE(null,3*5,44) hz from dual; 返回15
select COALESCE(0,3*5,44) hz from dual; 返回0
select COALESCE(null,'','AAA') hz from dual; 返回AAA
select COALESCE('','AAA') hz from dual; 返回AAA
rownum
【功能】返回當前行號
【引數】無
 
【返回】數值型

BFILENAME(dir,file)
【功能】函式返回一個空的BFILE位置值指示符,函式用於初始化BFILE變數或者是BFILE列。
【引數】dir是一個directory型別的物件,file為一檔名。
 
insert into lobdemo(key,bfile_col) values (-1,biflename('utils','file1'));

VSIZE(X)
【功能】返回X的大小(位元組)數
【引數】x
 
select vsize(user),user from dual;
返回:6 asdied

  select length('adfad合理') "bytesLengthIs" from dual --7

  select lengthb('adfad') "bytesLengthIs" from dual --5

  select lengthb('adfad合理') "bytesLengthIs" from dual --9

  select vsize('adfad合理') "bytesLengthIs" from dual --9

  select lengthc('adfad合理')"bytesLengthIs" from dual --7

  lengthb=vsize

  lengthc=length

case [<表示式>]
when <表示式條件值1> then <滿足條件時返回值1> 
[when <表示式條件值2> then <滿足條件時返回值2> 
……
[else  <不滿足上述條件時返回值>]]
end

【功能】當:<表示式>=<表示式條件值1……n> 時,返回對應 <滿足條件時返回值1……n> 
當<表示式條件值1……n>不為條件表示式時,與函式decode()相同,
decode(<表示式>,<表示式條件值1>,<滿足條件時返回值1>,<表示式條件值2>,<滿足條件時返回值2> ……,<不滿足上述條件時返回值>)

【引數】
<表示式> 預設為true (邏輯型)
<表示式條件值1……n> 型別要與<表示式>型別一致,
若<表示式>為字元型,則<表示式條件值1……n>也要為字元型

【注意點】
1、以CASE開頭,以END結尾
2、分支中WHEN 後跟條件,THEN為顯示結果
3、ELSE 為除此之外的預設情況,類似於高階語言程式中switch case的default,可以不加
4、END 後跟別名
5、只返回第一個符合條件的值,剩下的when部分將會被自動忽略,得注意條件先後順序

【示例】
建立環境:
create table xqb
(xqn number(1,0));
insert into xqb xqn values(1);
insert into xqb xqn values(2);
insert into xqb xqn values(3);
insert into xqb xqn values(4);
insert into xqb xqn values(5);
insert into xqb xqn values(6);
insert into xqb xqn values(7);
commit;

查詢結果:
SELECT xqn, 
       CASE
          WHEN xqn = 1  THEN '星期一'
          WHEN xqn = 2  THEN '星期二'
          WHEN xqn = 3  THEN '星期三'
	  else '星期三以後'
       END 星期
FROM xqb

另類寫法
SELECT xqn, 
       CASE xqn
          WHEN 1  THEN '星期一'
          WHEN 2  THEN '星期二'
          WHEN 3  THEN '星期三'
	  else '星期三以後'
       END 星期
FROM xqb

decode正確表達:
SELECT xqn, 
decode(xqn,1,'星期一',2,'星期二',3,'星期三','星期三以後') 星期
FROM xqb

decode錯誤表達:
SELECT xqn, 
decode(TRUE,xqn=1,'星期一',xqn=2,'星期二',xqn=3,'星期三','星期三以後') 星期
FROM xqb

組合條件表達:
SELECT xqn, 
       CASE
          WHEN xqn <= 1  THEN '星期一'
          WHEN xqn <= 2  THEN '星期二'   --條件同:not(xqn<=1) and xqn<=2
          WHEN xqn <= 3  THEN '星期三'   --條件同:not(xqn<=1 and xqn<=2) and xqn<=3
	  else '星期三以後'
       END 星期
FROM xqb

【語法】sys_guid()
【功能】生產32位的隨機數,不過中間包括一些大寫的英文字母。

【返回】長度為32位的字串,包括0-9和大寫A-F

【示例】
select sys_guid() from  dual

【語法】SYS_CONTEXT(c1,c2)
【功能】返回系統c1對應的c2的值。可以使用在SQL/PLSQL中,但不可以用在並行查詢或者RAC環境中

【引數】
c1,'USERENV'
c2,參數列,詳見示例

【返回】字串

【示例】
select
SYS_CONTEXT('USERENV','TERMINAL') terminal,
SYS_CONTEXT('USERENV','LANGUAGE') language,
SYS_CONTEXT('USERENV','SESSIONID') sessionid,
SYS_CONTEXT('USERENV','INSTANCE') instance,
SYS_CONTEXT('USERENV','ENTRYID') entryid,
SYS_CONTEXT('USERENV','ISDBA') isdba,
SYS_CONTEXT('USERENV','NLS_TERRITORY') nls_territory,
SYS_CONTEXT('USERENV','NLS_CURRENCY') nls_currency,
SYS_CONTEXT('USERENV','NLS_CALENDAR') nls_calendar,
SYS_CONTEXT('USERENV','NLS_DATE_FORMAT') nls_date_format,
SYS_CONTEXT('USERENV','NLS_DATE_LANGUAGE') nls_date_language,
SYS_CONTEXT('USERENV','NLS_SORT') nls_sort,
SYS_CONTEXT('USERENV','CURRENT_USER') current_user,
SYS_CONTEXT('USERENV','CURRENT_USERID') current_userid,
SYS_CONTEXT('USERENV','SESSION_USER') session_user,
SYS_CONTEXT('USERENV','SESSION_USERID') session_userid,
SYS_CONTEXT('USERENV','PROXY_USER') proxy_user,
SYS_CONTEXT('USERENV','PROXY_USERID') proxy_userid,
SYS_CONTEXT('USERENV','DB_DOMAIN') db_domain,
SYS_CONTEXT('USERENV','DB_NAME') db_name,
SYS_CONTEXT('USERENV','HOST') host,
SYS_CONTEXT('USERENV','OS_USER') os_user,
SYS_CONTEXT('USERENV','EXTERNAL_NAME') external_name,
SYS_CONTEXT('USERENV','IP_ADDRESS') ip_address,
SYS_CONTEXT('USERENV','NETWORK_PROTOCOL') network_protocol,
SYS_CONTEXT('USERENV','BG_JOB_ID') bg_job_id,
SYS_CONTEXT('USERENV','FG_JOB_ID') fg_job_id,
SYS_CONTEXT('USERENV','AUTHENTICATION_TYPE') authentication_type,
SYS_CONTEXT('USERENV','AUTHENTICATION_DATA') authentication_data
from dual

Oracle dbms_random包的用法

from:http://space.myfarmer.cn/?action-viewthread-tid-17039

1.dbms_random.value方法

dbms_random是一個可以生成隨機數值或者字串的程式包。這個包有initialize()、seed()、terminate()、value()、normal()、random()、string()等幾個函式,但value()是最常用的,value()的用法一般有兩個種,第一 
function value return number; 
這種用法沒有引數,會返回一個具有38位精度的數值,範圍從0.0到1.0,但不包括1.0,如下示例: 
SQL> set serverout on 
SQL> begin 
   2    for i in 1..10 loop 
   3      dbms_output.put_line(round(dbms_random.value*100)); 
   4    end loop; 
   5  end; 
   6  / 
46 
19 
45 
37 
33 
57 
61 
20 
82 
8 
  
PL/SQL 過程已成功完成。 
  
SQL>  
  
第二種value帶有兩個引數,第一個指下限,第二個指上限,將會生成下限到上限之間的數字,但不包含上限,“學無止境”兄說的就是第二種,如下: 
SQL> begin 
   2    for i in 1..10 loop 
   3      dbms_output.put_line(trunc(dbms_random.value(1,101))); 
   4    end loop; 
   5  end; 
   6  / 
97 
77 
13 
86 
68 
16 
55 
36 
54 
46 
  
PL/SQL 過程已成功完成。 

2. dbms_random.string 方法

某些使用者管理程式可能需要為使用者建立隨機的密碼。使用10G下的dbms_random.string 可以實現這樣的功能。

例如:
SQL> select dbms_random.string('P',8 ) from dual ;

DBMS_RANDOM.STRING('P',8)
----
3q<M"yf[

第一個引數的含義:
■ 'u', 'U' - returning string in uppercase alpha characters
■ 'l', 'L' - returning string in lowercase alpha characters
■ 'a', 'A' - returning string in mixed case alpha characters
■ 'x', 'X' - returning string in uppercase alpha-numeric
characters
■ 'p', 'P' - returning string in any printable characters.
Otherwise the returning string is in uppercase alpha
characters.
P 表示 printable,即字串由任意可列印字元構成

而第二個參數列示返回的字串長度。
3. dbms_random.random 方法
    random返回的是BINARY_INTEGER型別值,產生一個任意大小的隨機數
  與dbms_random.value 的區別舉例:
   Order By dbms_random.value;
這條語句功能是實現記錄的隨機排序
另外:
dbms_random.value 和
dbms_random.random 兩者之間有什麼區別?
1。Order By dbms_random.value ,為結果集的每一行計算一個隨機數,dbms_random.value 是結果集的一個列(雖然這個列並不在select list 中),然後根據該列排序,得到的順序自然就是隨機的啦。
2。看看desc資訊便知道vlue和random這兩個函式的區別了,value返回的是number型別,並且返回的值介於1和0之間,而random返回的是BINARY_INTEGER型別(以二進位制形式儲存的數字,據說運算的效率高於number但我沒測試過,但取值範圍肯定小於number,具體限制得查資料了)
如果你要實現隨機排序,還是用value函式吧


4. dbms_random.normal方法 

NORMAL函式返回服從正態分佈的一組數。此正態分佈標準偏差為1,期望值為0。這個函式返回的數值中有68%是介於-1與+1之間,95%介於-2與+2之間,99%介於-3與+3之間。

5. dbms_random.send方法  

用於生成一個隨機數種子,設定種子的目的是可以重複生成隨機數,用於除錯。否則每次不同,難以排程。


Oracle包utl_inaddr
作用:用於取得區域網或Internet環境中的主機名和IP地址. 


1、utl_inaddr.get_host_address 環境中IP地址
如果查詢失敗,則提示系統錯誤
查詢www.qq.com的IP地址
select UTL_INADDR.get_host_address('www.qq.com') from dual;
查詢本機IP地址
select UTL_INADDR.get_host_address() from dual;
查詢區域網內yuechu的IP地址
select UTL_INADDR.get_host_address('yuechu') from dual;


2、UTL_INADDR.get_host_name返回環境中主機名
返回本機主機名
select UTL_INADDR.get_host_name() from dual;
返回區域網內指定IP地址的主機名
select UTL_INADDR.get_host_name('192.168.0.156') from dual;
返回intrenet中指定IP地址的網址
select UTL_INADDR.get_host_name('219.153.50.84') from dual;

相關文章