企業級N Tier體系結構解決方案討論
NT+Oracle
Oracle可以說是現在業界內最為常見也是最為成功的關系數據庫(DBMs)產品
說它成功
一是因為它的性能優越
二是它的平台支持最為廣泛
三是它為常見的前台開發工具提供了應用的接口
在這裡
我還要談一個問題
那就是我在這篇討論方案的文章中
對於前台的解決方法
只討論ASP和JSP
為什麼不討論現在很流行的PHP呢?因為我覺得
作為一種SCRIPT語言
上述的三種方案沒有太大的差別
這裡的差別主要是指功能上的差別
而不去關心性能上的微小差異
有人專門測試了幾種方案毫秒級的數值差異
我個人覺得這裡的性能主要取決於第三層(數據庫)上的性能
這時的差異是我們可以深刻體會到的(笑)
其實更為重要的是每種解決方案所支持的元件模型
ASP支持ActiveX
而JSP支持JavaBean
這兩種元件都有巨大的支持
例如標准的ASP不支持文件上傳的功能
我們就可以開發一個文件上傳的組件
同樣的情況在JSP中也能實現
PHP呢?可以是可以的
但需要做的工作就不僅僅是開發組件那麼簡單了
所以前面的兩種方案明顯有很大的優勢
本篇討論的是使用ADO模型
通過ODBC的方法與Oracle相連
當然我們也可以使用Oracle使用的專用模型(OO
O)
我們會在後面討論
既然使用的是ADO模型
所以我們可以很快的從前面的SQL Server中過渡過來
語法都是相同的
對象當然也是相同的
所以我就只需要指出不同的地方
和它特別的地方就可以了
其實
我們更應該關注的兩種DBMs之間的差別
也正是DBMs之間的差別才造成了方案之間的差別
兩種DBMs都支持Standerd SQL
但它們又都各自擴展了標准SQL的功能
形成了自己獨特的SQL——SQL Server的Transaction SQL和Oracle的PL/SQL
它們都提供了例如StoredProcedure
Trigger等等對象
這些也是我們要重點討論的地方
Oracle的PL/SQL在語法上更容易理解
下面我來舉一個例子
這個例子若用常規的方法要使用多次的數據庫連接
很是麻煩
下面看問題的描述
這是一個修改密碼的例子
要求我們先輸入以前的密碼
只有在輸入與以前的密碼吻合時才更新新的密碼
程序有三個輸入
舊的密碼
新的密碼
以及確認的密碼
新密碼與確認密碼的吻合我們不用數據庫來驗證
但舊密碼是必須從數據庫中讀出的
用傳統的方法
起碼要用到兩個SQL語句
但寫成一個Oracle的Procedure就可以象下面所示的那樣
Create or Replace Procedure proc_pass_change
( member_id in varchar
org_pass in varchar
new_pass in varchar
status out number
status是一個標志量
當為
時表示成功
1代表舊密碼不符
其它的值代表過程出錯
)is
tmp_pass varchar
(
);
begin
select mem_pass into tmp_pass from personal_beadroll
where mem_id=member_id;
if tmp_pass=org_pass then
update mem_pass=new_pass from personal_beadroll
where mem_id=member_id;
status:=
;
else
status:=
;
end if;
commit;
exception
when others then
rollback;
status:=
;
raise;
end;
上面的這個Procedure中定義了一個中間的變量tmp_pass
使用這個中間變量來保存第一個Select into語句選出的數據庫中的舊有密碼
然後用它和用戶的輸入做比較
如果是正確的就執行更新的過程
否則返回一個用於判斷的過程值
為什麼要用Select into呢?這是因為在Procedure中不支持選出一個記錄集
而Select into其實是一個隱含的Cursor
所以我們還可以這樣來實現剛才的這個Procedure
Create or Replace Procedure proc_pass_change
( member_id in varchar
org_pass in varchar
new_pass in varchar
status out number
status是一個標志量
當為
時表示成功
1代表舊密碼不符
其它的值代表過程出錯
)is
Cursor csr_pass is
Select mem_pass from personal_beadroll
Where mem_id=member_id and mem_pass=org_pass;
begin
open csr_pass;
if csr_pass%FOUND then
update mem_pass=new_pass from personal_beadroll
where mem_id=member_id;
status:=
;
else
status:=
;
end if;
commit;
close csr_pass;
exception
when others then
rollback;
status:=
;
raise;
end;
它的實現思想是
首先我們產生一個密碼和ID都符合的記錄集
若這個記錄集存在的話
就證明了該用戶輸入的原始密碼有效
此時csr_pass%FOUND條件為真
於是我們就可以進行密碼的更新工作了
從上面的例子我們可以看到
當我們的事務是復雜的SQL語句時
我們使用Procedure的優越性是明顯的
From:http://tw.wingwit.com/Article/program/Oracle/201311/17546.html