9/29/2006

Oracle PL/SQL Training



Ho ho ho ... 上週到蠻荒的內湖科學園區參加Oracle PL/SQL 教育訓練課程, 說真的, 學到蠻多東西的.

首先, 就是我對內湖科學園區的印象 ... 真是ooxx的荒涼.
拿咱們小布工作的地方來說, 方圓百尺內, 工地、大樓、馬路, 頂多一家7-11, 好可怕阿~ >_<
我看的都快哭了, 難怪他上次吃摩斯漢堡的時候泛著感激的淚光(有嗎? 我亂說的啦).
想找家餐廳吃午餐, 得慢步+散步個差不多以前我們在南港走出去吃飯的距離一樣遠(只是在內湖得在戶外風吹日曬雨淋)
餐廳不多, 到處都要等等等, 若要找巷子裡的自助餐廳, 你得自己多到巷弄走走才知道有沒有.

這還不打緊, 說到我同學工作的內湖路一段, 那才真神奇.
明明辦公大樓就在Benq附近, Benq是瑞光路, 但他們公司卻是內湖路一段xx巷, 害我在那邊繞圈圈老半天.
方圓百尺內, 工地、大樓、巷弄, 比小布他們公司那更荒涼, 要走更遠的距離才找得到餐廳.
我同學平日填飽肚子的地方就是"全家", 了不起吃個"萊爾富", 要是怕吃一堆防腐劑會變木乃伊, 那就改去吃健康有勁的"冰冰蒟蒻".
這到底是什麼人生啊?

更重要的是, 我在內湖迷路2天 ... >_<


其次, Oracle PL/SQL的課程, 是很概略式的說明PL/SQL是什麼東西、可以做什麼, 說穿了就是寫程式, 只是語法是Oracle PL/SQL (我好像在說廢話).
對我來說還蠻受用的, 以前常常會和同事討論在程式與資料庫面的SQL執行與效能, 多學一點總是好的(工程師的無奈? ^_^)

1. Tool
Tool: PL/SQL Developer : PL/SQL Developer 是一套整合性開發環境, 特別針對Oracle Databases 的 stored program units 的開發. 這比較偏重程式的開發,與TOAD相比較,TOAD 比較適合DBA人員使用

2. PL/SQL is part of Oracle Complete Solution.
It can improved performance with procedural processing.
It is portable over different version of database.(只是有些指令可能不適用)
You can program with procedural language control structures and declare program identifiers in database.
It can handle errors.

3. PL/SQL Block Structure.
不管你是寫function(可回傳值)還是procedure(無回傳值), 一定要有BEGIN與END;
你可以不宣告任何變數, 但BEGIN...END; 一定要有.

4. Types of Varaiables
Scalar (char, date, number, boolean...)
Composite (table, record, record of table, 這段我最弱, 搞不太清楚說)
Reference (ointer)
LOB(large objects) (clob, blob, bfile, nclob). CLOB-> character large objects; BLOB-> binary large objects; NCBLOB-> nation character large objects, 計算字數長度的方式和CBLOB不同. 如varchar2(4)可以放2個中文, 但nvarchar2(4)則可放4個中文.


5. 變數宣告
變數名稱 型態 是否為null := 預設值;
Declare
v_string varchar2(10) not null := 'hello'; --字串用單引號包起來
v_number number(2) := 10;
v_boolean boolean; --可以指定true, false, 或null
v_type emp.ename%TYPE; --指定v_type變數和emp資料表內的ename欄位型態一樣
%TYPE: 可把變數的型態指定和talbe.field資料型態一樣, 如 v_ename emp.ename%TYPE , v_name變數的資料型態和emp.ename一樣.

Non-PL/SQL Variables
可以在SQL command下宣告一個Non-PL/SQL的變數, 讓後面的PL/SQL使用, 或從AP傳variable給stored procedure使用.
SQL> VARIABLE g_monthly_num; , 然後在PL/SQL內用 :g_monthly_num 使用.

可以在SQL command下要求使用者輸入變數值, 讓PL/SQL使用.
SQL> ACCEPT p_num PROMP 'please input p_num'; , 然後在PL/SQL內用 &p_num 使用.

變數的scope, 端賴變數存在的位置.
在block內, 變數名稱不可和資料表內的欄位名稱一樣

6. DBMS_OUTPUT.PUT_LINE
Oracle提供的procedure, 可以把PL/SQL程序與結果印出在sql plus內(需與set serveroutput on搭配, 不然也看不到)

7. 註記: -- 或 /*...*/

8. Not available in procedure statements
- GREATEST
- LEAST
- DECODE
- Group functions

9. Data Type Conversion
- TO_CHAR
- TO_DATE
- TO_NUMBER

幾個測試的小範例
declare v_id number(3) :=10;
begin
DBMS_OUTPUT.put_line(v_id + 123);
end;
/
結果是133


declare v_id number(3) :=10;
begin
DBMS_OUTPUT.put_line(v_id + '123');
end;
也是133

declare v_id number(3) :=10;
begin
DBMS_OUTPUT.put_line(v_id + 'sss');
end;
ORA-06502: PL/SQL: 數字或值錯誤: 字元到數字轉換錯誤
ORA-06512: 在 line 3


declare v_id number(3) :=10;
begin
DBMS_OUTPUT.put_line(v_id || 123);
end;
是10123

declare v_id number(3) :=10;
begin
DBMS_OUTPUT.put_line(v_id || '123');
end;
是10123


10. SQL Statements in PL/SQL
Extract a row of data from the database by using the SELECT command. Only a single set of values can be returned.
Make changes to rows in the database by using DML commands.
Control a transaction with the COMMIT, ROLLBACK, or SAVEPOINT command.
Determine DML outcome with implicit cursors.

11. Manipluting Data Using PL/SQL
Make changes to database tables by using DML command:
INSERT
UPDATE
DELETE

12. SQL Cursors
A cursor is a private SQL work area.
There are 2 types of cursors: 顯式游標(Explicit Cursor)和隱式游標(Implicit Cursor). The Oracle server uses implicit cursors to parse execute your SQL statements. Explicit cursors are explicitly declared by the programmer.
Implicit cursor attributes verify the outcome of DML statements:
SQL%ROWCOUNT 傳回SQL語法影響的資料行數, 一整數值.
SQL%FOUND Boolean, 若SQL語法有影響一至多筆資料, 傳回True.
SQL%NOTFOUND Boolean, 若SQL語法沒有影響到任何行, 傳回True.
SQL%ISOPEN 總是為FALSE, 因為PL/SQL總是執行結束後, 立即關閉Implicit Cursor.
Explicit cursors are defined by the programmer.

Declare
v_empno emp.empno%type;
v_ename emp.ename%type;
cursor c1 is
select empno, ename from emp;
Begin
open c1;
for i in 1..10
loop
fetch c1 into v_empno, v_ename;
end loop;
close c1;
end;


13. Control Structures
IF...THEN...END IF
IF...THEN...ELSE...END IF
IF...THEN...ELSEIF...END IF
在判斷字串內容時, 大小寫有別

LOOP...EXIT [condition]; END LOOP;
FOR counter in [範圍]...LOOP...END LOOP; --沒有condition
WHILE condition LOOP...END LOOP;

14. Composite Data Types
說真的, 這邊我搞不太懂, 後補
PL/SQL Records --
PL/SQL Tables --
%ROWTYPE -- Declare a variable according to a collection of columns in a database table or view. Useful when retrieving a row with the SELECT statement. 如 declare emp_rec emp%ROWTYPE; Begin select * into emp_rec from emp where empno=100; end; 把找到的資料放到emp_rec內.


15. Handling Exception
有2種類型的, 一種是內部異常(Predefined Oracle Server Errors or Non-predefined Oracle Server Errors), 一種是使用者自訂的.
內部異常是執行期間傳回到PL/SQL端的ORACLE錯誤, 或由PL/SQL的操作引起的錯誤, 如除數為0等.
使用者自訂的異常是由Programmer自行定義的, 在PL/SQL中傳遞訊息以控制錯誤處理.

Predefined Oracle Server Errors: Sample predefined exceptions: NO_DATA_FOUND, TOO_MANY_ROWS, INVALID_CURSOR ...
Decalre ...
Begin
....
Exception
when NO_DATA_FOUND then
....
when OTHERS then'
...
End;

Non_Predified Oracle Server Errors: Code the PRAGMA EXCEPTION_INIT.
Declare e_e1 Exception;
PRAGMA EXCEPTION_INIT {e_e1, -2292};
Begin
...
Exception
when e_e1 then ...
END;

User Defined Errors: RAISE.
Declare e_e1 Exception;
Begin
...
If SQL%NOTFOUND then
RAISE e_e1;
end if;
...
Exception
when e_e1 then ...
END;

還有一個raise_application_error: 是為了防止PL/SQL返回不明確的未經處理的異常錯誤消息, 錯誤號碼範圍是-20,000到-20,999, 錯誤訊息最多2048個字.
IF product_not_found THEN
RAISE_APPLICATION_ERROR(-20123,'Invald product code' TRUE);
END IF;


16. Create Package
第一步, 先建立Package框架.
Create or Replace Package xxx is
Procedure p1; -- 這個package內有procedure p1
Procedure p2; -- 這個package內有procedure p2
end;
/

第二步, 建立Package xxx的body.
Create or Replace Package Body xxx is
procedure p1 as
begin ... end;
procedure p2 as
begin ... end;
end;
/


懇請各位大德給點意見, 要是有寫錯, 請賜教 ... Orz




9/27/2006

不負責玩樂講座 -- 紫藤廬半日遊



這一天, 托陳大律師與林大小姐的福, 有幸到充滿古色古香的台北市定古蹟--紫藤廬一遊.

陳大律師可是最近高中95年司法人員, 大家要熱烈給她鼓掌, 給她擁抱, 說不定她會當司法院院長喔.

瞧她多麼專業的審閱"競業禁止條款", 各位員工可千萬別亂簽阿, 有民法效力的.


林大小姐則是高升某大學的高級助理, 年底要訂婚, 明年初要結婚, 大家要給她鼓勵, 喜宴當天給她鬧場...不, 是給她滿滿的祝福啦.


我和王小妹妹, 是專業的攝影師和陪客, 瞧我們多專業



紫藤廬是第一處台北市定古蹟, 以前是日據時代的高等官舍, 獨門獨院設計, 有庭院和和室.
現在則是小幅度的改裝成茶樓(也有簡餐), 有許多外國觀光客(我們那天就看到日本人和中東人士).

小庭院


池子裡的鯉魚


門口的招牌, 還有台北市定古蹟的標誌.


一樓屋頂上的燈籠.


往2F的樓梯, 突然有種思古情懷.


盆栽.


2F的大和室


1F的和室, 王小妹妹指定下次要佔有他.



我很喜歡在這種地方和朋友聊天喝茶 ... 感覺很好喔~
我們一行人吃吃喝喝聊天拍照, 再次恭喜陳大律師與林大小姐 ... 也祝福王小妹妹能朝著自己的理想邁進 ... GOGOGO!


We had a party to celebrate Miss Chen passed the exam of national judicial official, and Miss Lin got a promotion.
"紫藤廬" is the first historic spot of Taipei.


9/18/2006

不負責影評 -- 碧海嬌娃(Blue Crush)






這部片子是述說女子衝浪者的故事, 所有演員都親自上陣, 尤其是女主角賣力的演出(因為是講女子衝浪, 他又是女主角, 當然他的戲份最重最累), 讓我非常感動.
我不會游泳, 更別提衝浪了, 所以看到女主角被浪打、在水中憋氣、趴在衝浪板上划水... 好辛苦, 但看的很過癮.
誰說YA片都很膚淺, 每次看完這部戲我都有著滿腔熱血, 有著想要好好完成些什麼的衝動.

你會由衷的讚嘆夏威夷的陽光與沙灘是多麼的美麗、海水是多麼的清澈無比, 真是衝浪者的天堂.
如果你是陽光、沙灘、水上運動的愛好者, 絕對不要錯過這部電影, 真的很棒.







據說本片是根據「蘭花賊」小說作者蘇珊奧良的一篇雜誌文章拍攝而成.
主角安茉莉(由凱特柏絲沃飾演, 「superman return」), 是一名住在夏威夷的妙齡女子, 從小就熱愛衝浪, 過去幾年一直在接受訓練, 以參加著名的管道(Pipe)衝浪大賽為目標.
安和妹妹潘妮與友人萊娜(莎諾雷克)和伊頓(蜜雪兒羅莉葛茲, 「惡靈古堡」)同住, 她們也都是衝浪同好, 同在飯店當服務生.
然而安有許多心結未解: 她的母親幾年前棄她們而去, 使她必須獨立撫養她的妹妹潘妮. 加上3年前安在茂宜島衝浪時差點溺死, 讓她至今仍無法擺脫這個陰影.
加上認識了一個前途看好的四分衛麥特(馬修戴維斯), 更讓她徘徊於現實、愛情、理想之間.
最後安勇敢的接受的衝浪大賽考驗, 過程十分精采.
演員們(主要還是女主角啦, 但也有真正的女子衝浪選手上場喔)親自挑戰巨浪賣命演出, 導演還能近距離捕捉到水面上的競賽畫面, 將最驚險刺激的衝浪運動全都攝入鏡頭.



好看好看, 真過癮 ... 真是陽光、沙灘、夏威夷(不是比基尼, 我看比基尼幹麻呢)


Blue Crush is a 2002 movie about a group of female surfers in Hawaii. The film was directed by John Stockwell and stars Kate Bosworth, Michelle Rodriguez and Sanoe Lake. It is based on the 1998 Women Outside article "Life's Swell" by Susan Orlean.

9/16/2006

20%啟示錄



有一個老闆對一個員工說 : "因為我缺錢, 從下個月開始, 我要扣你20%的薪水, 但希望你能繼續為我賣命"

員工心裡想 : "現在時機歹歹, 生意不好做, 資訊業圈子這麼小, 就委屈一點, 當個好人, 和老闆共體時艱吧! 說不定沒多久就可以通通補回來"

但是老闆接著說 : "我們接著要擴大大陸市場, 大陸那邊有很多很多案子要run"

員工心裡想 : "原來老闆是大陸那邊缺錢ㄚ...那大陸賺的錢會拿回來吧? 還是拿去包二奶?"

老闆信誓旦旦的說 : "我們還要持續去化庫存, 跟著我打拼, 一定會有美好的前景與未來..."

員工突然想到 : "去化庫存? 這不是從我到職那天就開始在說... 到現在已經好幾年了ㄟ. 老闆大人, 你的去化庫存時程表在哪裡? 何時可以把我的20%還給我? 你要說清楚講明白阿... 我又不是阿扁, 沒那麼多錢ㄚ"

在艾群的夥伴們...好好保重自己

9/07/2006

読み物小舖 -- 4+1 View of UML Diagrams


我的英文沒那麼好... 節錄自別處...

Considering that the UML diagrams can be used in different stages in the life cycle of a system, let us take a look at the "4+1 view" of UML diagrams. The 4+1 view offers a different perspective to classify and apply UML diagrams. The 4+1 view is essentially how a system can be viewed from a software life cycle perspective. Each of these views represents how a system can be modeled. This will enable us to understand where exactly the UML diagrams fit in and their applicability.

These different views are:

Design View: The design view of a system is the structural view of the system. This gives an idea of what a given system is made up of. Class diagrams and object diagrams form the design view of the system.
Process View: The dynamic behavior of a system can be seen using the process view. The different diagrams such as the state diagram, activity diagram, sequence diagram, and collaboration diagram are used in this view.
Component View: Next, you have the component view that shows the grouped modules of a given system modeled using the component diagram.
Deployment View: The deployment diagram of UML is used to identify the deployment modules for a given system. This is the deployment view of the
Use case View: Finally, we have the use case view. Use case diagrams of UML are used to view a system from this perspective as a set of discrete activities or transactions.