2014年5月24日 星期六

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" + 空白鍵 (游標會變成相機的圖案)

2012年10月8日 星期一

氣炸鍋之秋刀魚

這是換到好吃便宜又營養的秋刀魚了
以下幾個步驟
1.切開魚肚,先將魚內臟清出來
2.清洗魚身和魚內部,將魚從中間對切(魚身太長,氣炸鍋放不下)
3.食用鹽抹魚身,在倒點米酒進去醃製一下

4.放到氣炸鍋中整齊排列
5.用200度7分鐘,完成後收工開飯

用氣炸鍋煎魚,就會有魚腥味的問題,建議把氣炸鍋放在抽油煙機附近,
烤的時間順便開抽油煙機,避免魚腥味



2012年10月4日 星期四

[轉載] 全球大吹重整風?3M宣佈事業群縮減求提升競爭力


說真的從沒想過連3M都會採取縮減的策略,對他們的產品和和企業形象都是非常喜歡的,
看來全世界的景氣真的又再度出問題了。
文章:
《MarketWatch》報導,美國 3M(MMM-US)公司計劃縮減六大事業群數目,明年開始將減至 5 個事業群,期望透過重新調整組織結構提升競爭力。3M 也是近期第一個宣佈組織重整的製造業龍頭。
3M 主席暨執行長 Inge Thulin 表示,組織重整是公司順應市場變化必然的結果,藉以提升與客戶的連結並擴大服務的市場占有率。其它大型跨國公司過去幾個月也已提出組織重整計畫,包括可口可樂公司(KO-US)、陶氏化學公司(Dow Chemical)(DOW-US),公司表示此舉主要是為因應國際市場需求的改變。
3M 公司目前擁有六大事業群,以及超過 35 個事業單位的組織,產品與服務相當多元,包括消費暨辦公用品 Scotch 膠帶與 Post-it 便利貼,以及醫療保健用品 Nexcare 繃帶。
公司組織重整將於明年 1 月 1 日生效,兩個新成立的事業群-電子暨能源、安全暨圖像-也在重整名單之列。
醫療保健、消費用品事業群將不受影響。工業事業群不變,但再生能源營運將移至電子產品與能源部門。
3M 在 7 月公佈第 2 季獲利微幅成長 0.6%,不過,由於全球經濟景氣嚴峻加上美元走升,衝擊到消費性與工業產品銷售表現。
--
原文:http://news.cnyes.com/Content/20121003/KFN9AKZKM0JG4.shtml?c=headline_sitehead

2012年10月2日 星期二

氣炸鍋之2012中秋節大餐

因為家中有小龍子報到~~~
跟老婆再也不能像以前一樣想去吃什麼就吃什麼~~
但是還是會想過一下中秋節阿~~
就用氣炸鍋來當鍋具吧

以下是每道菜用的時間(大概算了一下總花費約300NT)

小雞翅、小雞腿
1.先用清水清洗後以醬油醃製,配料有蒜頭、胡椒粉、五香粉
   放下去要攪拌均勻一下
2.醃製約一小時
3.平均放到氣炸鍋中
4.先用180度10分鐘(這時候已經熟了)
5.再用200度2~3分鐘(皮會焦黃比較好吃)

章魚腳
1.清水洗淨切成塊狀
2.丟進氣炸鍋中160度10分鐘(超好吃,鮮)



杏鲍菇
1.清洗過後開始切,厚度約掌握在2cm左右
2.放在大碗中,倒約2茶匙的油,再加些胡椒鹽後均勻攪拌
3.丟進氣炸鍋中180度10分鐘(超甜的啦)



筊白筍
因為失敗了,就不拍近照了,照片中的左上那盤就是了
1.剝殼清洗後,每一片斜切約1.5~2公分厚
2.胡椒鹽拌均勻
3.丟進氣炸鍋中180度10分鐘(失敗)
    只剩下筊白筍的香氣,沒了甜味,下次要試試看8分鐘看看



2012年7月24日 星期二

[轉載] 市場壓力不斷 西班牙已更接近尋求全面紓困


西班牙在周二公債標售中,短期公債殖利率創下歐元成立以來第二高水準,反應投資人越來越相信,西班牙將需要全面紓困,而歐元區則難以應付
--在喊希臘時,擔心的是西班牙,現在喊西班牙了,卻有更大尾的義大利在後面
西班牙極力欲讓財政步上正軌,其結果卻是,借款成本上升到了難以持續的水準。被視為太大無法紓困的意大利亦遭到拖累。
分析師說,這次標售中,西班牙能夠將債券全部售出,最為重要。但3月時,西班牙發行6個月期債券,殖利率低於1%,現在則達3.7%。西班牙財政部標售3個月與6個月期公債,籌得資金30.4億歐元,符合目標。3個月期債券殖利率為2.434%,6月標售時為2.362%。6個月期債券殖利率上升至3.691%,上個月為3.237%。
--發債成本不斷拉升
上周五,西班牙政府說,預期經濟仍將落入衰退,直至明年。自治地區Valencia要求馬德里援助,以償還債務,為第一個要求援助的地區。其他地區預期亦將跟進
馬德里已要求達1000億歐元援助,為其銀行業增資。四年經濟下滑及資產泡沫破滅,重創了西班牙的銀行業。
政府已推動新的650億歐元加稅與削減支出計劃,以降低債務,但也可能讓經濟陷入更深度衰退
在次級市場,西班牙5年期政府公債殖利率上升,並突破10年期公債殖利率。短期利率高於長期利率,通常是市場認為違約或債務重整的風險增加。
原文:http://news.cnyes.com/Content/20120724/KFLLHPW8V71BB.shtml?c=headline_sitehead
--地方債務無法承受,要求中央紓困,問題是中央也是沒錢,到後面會有什麼樣的狀況,持續觀察囉