2014年5月24日 星期六

PL/SQL 函數說明



PL/SQL函數指令
說明
ABS(n)
絕對值
ACOS(O)
逆三角餘弦值
ADD_MONTHS(dn)
傳回d值加n個月
ASCII(n)
Ascii字元傳回十進位
ATAN(n)
逆三角正切值(徑,p/2 ~ -p/2)
ATAN2(mn)
逆三角正切值(徑,p ~ -p)
AVG(n)
傳回平均值
BFILENAME(mn)
傳回外部檔案值,m=目錄字串,
n=檔案字串
CEIL(n)
無條件進位的整數
CHARTOROWID
將字元型態轉為ROWID型態
CHR(n)
Chr進位值,傳回ascii
CONCAT(mn)
不論文字或數字相加,都以字串相
加方式
CONVERT(m,n,z)
將字串轉換另一國家字元設定值
COS(n)
傳回n的餘弦值
COSH(n)
傳回n的雙曲線餘弦值
COUNT(n)
傳回總筆數
DECODE
(C nv1r1v2r2d1)=v2
變數c字串或n數字,=v1則值=r1,則值=v2,或=dl
DUMP(mnn1n2)
傳回m的長度及內碼,n=進位(預設值=10進位)n1=m的開始位置,n2=取的位無數
EMPTY_[B C] LOB()
BLOBCLOB初始化,就是傳回BLOBCLOB的空指標
EXP(n)
傳回自然對數en次方值
FLOOR(n)
無條件捨去的整數
GREATEST(m)
m可為數字或文字,傳回最大值
GROUPING(n)
傳回群集
HEXTORAW(m)
將十六進位轉換為原始值
INITCAP(n)
傳回字句一個字為大寫
INSTR(char1, char2 [m[n]] )
char1中從m位置起char2n次出現的位置
INSTR(mn)
傳回n字串在m字串中的位置
INSTRB(mn)
byte傳回n字串在m字串中的位置
LAST_DAY(d)
傳回該月的最後一天的日期
LEAST(m1m2m3...mn)
m可為數字或文字,傳回最小值
LENGTH(n)
傳回字串的長度
LENGTHB(n)
byte方式傳回字串的長度
LN(n)
自然對數
LOG(m , n)
m進位n對數
LOWER
傳回每一字為小寫
LPAD(m , n , z)
n1ength(m)z字元數填入m的左邊
LTRIM(n)
去除字串左邊的空格字元
MAX(n)
傳回最大值
MIN(n)
傳回最小值
MOD(m , n)
m/n整數的餘數
MONTHS_BETWEEN(mn)
傳回m - n的值,單位月(日期相減
單位為日)
NEW_TIME(m , n , z)
n時區的日期、時間是m,傳回在
z時區的日期時間
NEXT_DAY(m , n)
下一個星期n(1-7=sun-sat)是那一天
NLS_CHARSET_DECL_LEN(M , N)
傳回所要的字體組對應當前資料庫
的字體組,m=字體數;n=字體組(:'ZHT16BIG5')
NLS_CHARSET_ID(m)
傳回字體組的識別碼,m=字體組
NLS_CHARSET_NAME(n)
傳回字體組,n=字體組的識別碼
NLS_INITCAP(m [,N])
傳回字句一個字為大寫(依照國家
語言不同)
NLS_LOWER
傳回每一字為小寫(依照國家語言
不同)
NLS_UPPER
傳回每一字為大寫(依照國家語言
不同)
NLSSORT
決定排列順序(依照國家語言不同)
NVL(mn)
mNULL則傳回n值,否則傳回
m
NVL2(m , n , z)

POWER(m , n)
傳回mn次方
RAWTOHEX(m)
將原始值(例如A=65)進位轉換為
十六進位
REPLACE(m , n [, z] )
M字串中去除n字串以z字串取代
ROUND(d)
日期四捨五入以中午為中點
ROUND(m [, n])
算數m四捨五入,取到小數點第n
[n default=0]
ROWIDTOCHAR(m)
ROWID型態轉為字元型態
RPAD(m , n , z)
n1ength(m)z字元數填入m的右邊
RTRIM(n)
去除字串右邊的空格字元
SIGN(n)
信號的傳回,n<0 span="">則-1n=00n>0 1
SIN(n)
傳回n的正弦值
SINH(n)
傳回n的雙曲線的正弦值
SOUNDEX(m)
傳回以字串m的聲音(可做文字發音比對)
SQRT(n)
傳回n開平方根的值
STDDEV(n)
傳回標準差
SUBSTR(m , n , z)
m字串中從頭n數位開始取,取z
個字元
SUBSTRB(m , n , z)
byte方式m字串中從頭n數位開始取,取z個字元
SUM(n)
傳回加總
SYS_CONTEXT(m , n)
傳回與某一個context名稱關聯的Package spec定義的變數的值,m=context的名稱,n=變數名稱
SYS_GUID()
傳回全球獨一無二的識別碼
SYSDATE
傳回系統日期
TAN(n)
傳回n的正切值
TANH
傳回n的雙曲線的正切值
TO_CHAR(dt)
將日期格武轉換為文字格式,d=日期,t=日期型態格武
TO_CHAR(n)
將數字格式轉換為文字格式
TO_DATE(m , t)
將文字格式轉換為日期格式,m=字串,t=日期型態格式
TO_LOB(m)
LONG的資料型態轉換成LOB的資料型態
TO_MULTI_BYTE(m)
CHAR的資料型態轉換成多位元的字體
TO_NUMBER(m)
將字串轉成數字
TO_SINGLE_BYTE(m)
將多位元的字體轉換成CHAR的字體
TRANSLATE(m using n)
Char轉咸nchar
TRANSLATE(m , n [,z])
n字串尋找m字串,以z字串取代
TRIM(n)
去除字串左、右邊的空格字元
TRUNC(d [, n])
d截斷到n[n default=NULL()]n='month'截斷到月
TRUNC(m [, n])
m截斷到n[n default=0]n=-1則截斷個位為0
UID(m)
傳回目前的使用者的唯一識別碼
UPPER(n)
傳回每一字為大寫
USER
傳回使用者名稱
USERENV(m)
傳回使用者環境參數的資訊
VARIANCE(n)
傳回變異量
VSIZE(m)
傳回字串的bytes

pl sql 顯示游標、隱示游標 與 bulk collect 的使用說明


以下主要為說明 PL/SQL 中游標的使用以及其優缺點

在PL/SQL裡的游標可以分為顯式和隱式兩種,而隱式有分為select into隱式游標和for .. in 隱式游標兩種。所以,我們可以認為,有3種游標用法:
A. 顯式游標
B. select into隱式游標
C. for .. in 隱式游標
如何正確的選擇使用哪種游標,將對你的程式的性能,可讀性,代碼量等產生重大影響……
--By RollingPig


三種方法在使用上的優劣比較


顯式游標
select into隱式游標B
for .. in 隱式游標
優點
  1. 可以用於Bulk Collect的批量處理句式以提高性能
  2. 可以用於動態SQL的游標處理
  1. 代碼量最少
  2. 可以自動Detect 返回資料超過一行或少於一行的錯誤
  3. 可以使用Bulk Collect 批量處理,但是無法使用Limit 關鍵字
  1. 代碼量遠少於顯式游標
  2. 代碼可讀性優於顯式游標
  3. 代碼的出錯可能性也小於顯式游標
缺點
麻煩,需要定義,打開,Fetch,Close一堆代碼,增加代碼複雜度,從而增加出錯的可能性
  1. 如果不使用Bulk Collect 批量處理,僅僅只能用於返回資料正好一行的情況,無法使用於返回資料超過一行或少於一行的環境
  2. 使用Bulk Collect 批量處理時,無法使用limit 關鍵字,無法處理返回行數太多的情況(不好處理,容易造成PGA過大)
  1. 無法用於動態SQL的游標處理
  2. 在返回行數超過100行的情況下,性能明顯不如使用Bulk Collect的顯式游標
  3. 性能對比方面,除非是使用了Bulk Collect,否則,三種方式沒有明顯性能差距



三種游標形式的簡單例子
A. 顯式游標
普通顯式游標,指的是通過定義獲得游標,並通過open,fetch,close的等方法來操作游標
代碼:

declare
  cursor c is
    select tname from tab;
  l_tname varchar2(64);
begin
  open c;
  loop
    fetch c
      into l_tname;
    exit when c%notfound;
    dbms_output.put_line(l_tname);
  end loop;
  close c;
end;

Bulk Collect 顯式游標
 代碼:

Declare
  cursor c is
    select tname from tab;
  l_tname_array dbms_sql.varchar2_table;
begin
  open c;
  fetch c bulk collect
    into l_tname_array;
  for i in 1 .. l_tname_array.count loop
    dbms_output.put_line(l_tname_array(i));
  end loop;
  close c;

end;

Bulk Collect 顯式游標 + limit
代碼:

Declare
  cursor c is
    select tname from tab;
  l_tname_array dbms_sql.varchar2_table;
begin
  open c;
  loop
    fetch c bulk collect
      into l_tname_array limit 10;
    exit when c%notfound;
    for i in 1 .. l_tname_array.count loop
      dbms_output.put_line(l_tname_array(i));
    end loop;
  end loop;
  close c;
end;

隱式游標相對於顯式游標而言,指的是不需要事先Declare,也無須用open,fetch,close的等方法來操作,而是通過其他的方式來操作游標

B. select into隱式游標
代碼:

Declare
  l_tname varchar2(100);
begin
  select tname into l_tname from tab where rownum = 1;
  dbms_output.put_line(l_tname);
end;


動態SQL select into隱式游標
代碼:

Declare
  TYPE l_tname_array IS TABLE OF VARCHAR2(100);
  p_tname_array l_tname_array;
  l_table_name varchar2(100);
  l_sql        varchar2(200);
begin
  p_tname_array := l_tname_array();
  p_tname_array.extend(1);
  l_table_name := 'TAB';
  l_sql        := 'select tname from ' || l_table_name ||
                  ' where rownum = 1 ';
  execute immediate l_sql
    into p_tname_array(1);
  for i in 1 .. p_tname_array.count loop
    dbms_output.put_line(p_tname_array(i));
  end loop;
end;


動態SQL select into隱式游標 + Bulk Collect
代碼:

Declare
  l_tname_array dbms_sql.varchar2_table;
  l_table_name  varchar2(100);
  l_sql         varchar2(200);

begin
  l_table_name := 'TAB';
  l_sql        := 'select tname from ' || l_table_name;
  execute immediate l_sql bulk collect
    into l_tname_array;
  for i in 1 .. l_tname_array.count loop
    dbms_output.put_line(l_tname_array(i));
  end loop;

end;


C. for .. in 隱式游標
for .. in 隱式游標通過loop的開始於結束來控制cursorOpenClose.
代碼:

Begin
  for c in (select tname from tab) loop
    dbms_output.put_line(c.tname);
  end loop;

end;

使用時機與選擇
  1. 在返回資料為一行的情況下,儘量使用select into 的隱式游標返回0行或者 100, 應選用顯示游標+Bulk collect ,以獲得較高的Fetch 性能,同時不至於使用太大的PGA記憶體
  2. 如果使用動態SQL, 則根據select list (column list) 是否固定,如果固定,仍然可以考慮使用select into 的隱式游標+動態SQL的方式。當然,仍然需要考慮返回行數的問題。
  3. 如果select list (column list) 不固定,則只好使用顯式游標,或者動態語句返回行數太多,必須用limit,那麼也只好用顯式游標了。

pl sql 正則表達式

這裡在正則表達式中用到的^$[0-9]都被稱為元數據(metacharacter),正則表達式都是由多元表達式組成的。在這裡,^表示一個字符串的開頭,$表示一個字符換的結尾,因此^198表示以198開頭的字符串,而[0-9]$則表示以0-9的數字結尾的字符串。因此整體上’^198[0-9]$’就能匹配所有1980-1989的字符串。
正則表達式中常用到的元數據(metacharacter)如下:
1.      匹配字符串的開頭位置。
2.      匹配支付傳的結尾位置。
3.      匹配該字符前面的一個字符0次,1次或者多次出現。例如52*oracle 可以匹配 5oracle,52oracle,522oracle,5222oracle等等。
4.      + 匹配該字符前面的一個字符1次或者多次出現。例如52+oracle 可以匹配 52oracle,522oracle,5222oracle等等
5.      匹配該字符前面的一個字符0次或1次或者多次出現。例如52?oracle 只能匹配5oracle,52oracle等等
6.    {n} 匹配一個字符串n次,n為正整數。例如:hel{2}o 所匹配的是hello
7.      {n,m} 匹配一個字符串至少n次,至多m次。其中nm都是整數。
匹配除了null之外的任何單個字符串
8.      (pattern) 這個是用來匹配指定模式的一個子表達式
9.      x|y  匹配x或者y,其中xy是一個或者多個字符
10. [abc] 匹配括號中的任意一個字符。例如:[ab]bc可以匹配abcbbc
11. [a-z] 匹配指定範圍內的任意字符串。例如[A-G]hi可以匹配AhiGhi
12.   [::]指定一個字符類,可以匹配該類中的任意字符 這裡的字符類包括:
       [:alphanum:] 可以匹配字符0-9A-Za-z
       [:alpha:]可以匹配字符A-Za-z
        [:blank:]可以匹配空格或者tab
       [:digit:]可以匹配數字 0-9
        [:gragh:]可以匹配非空字符
        [:punct:]可以匹配. , ” ‘等標點符號。
       [:upper:]可以匹配字符A-Z
        [:lower:]可以匹配字符a-z

2013年7月30日 星期二

Mac的print screen

相信很多剛轉入mac的人都有windows上的print screen如何用的問題

其實是有快速鍵的喔

方法一:自動capture整個畫面並且自動存檔
使用方法  " ⌘ + Shift + 3"

方法二:以滑鼠框出範圍,並且自動存檔
使用方法  " ⌘ + Shift + 4"

方法三:以滑鼠選取特定視窗,將視窗的內容變成圖檔
使用方法  " ⌘ + Shift + 4" + 空白鍵 (游標會變成相機的圖案)