Oracle是C/S(Client/Server)結構的大型數據庫
主要語言是
GLSQL語言
具有功能強大而簡單易學的優點
C/S結構的工作過程是
當客戶端(C端)輸入並發送一條SQL語句後
便通過網絡送到服務器端(S端)
在那裡被分析執行然後再將結果通過網絡返回到客戶端
此時客戶端可以再發下一條SQL語句
可見
客戶端是一條語句一條語句的發送
服務器端是一條一條的分析執行
結果再一次次的返回
但是
這樣單個的SQL語句引起了頻繁的網絡通信
大大降低了系統性能
PL/SQL是擴展SQL後的語言
PL/SQL塊作為一個單位發送
使用了較少的網絡通信
而且在運行中能根據條件
決定執行或重復執行什麼語句
既保留了SQL的強大性
又彌補了不足
提高程序的運行速度
使用存儲過程
存儲過程是Oracle數據庫的一種對象
是一種帶名的PL/SQL過程程序塊
它在創建後
被數據庫服務器進行語法和句法分析
以編譯了的形式存儲在數據庫中
可以被有權用戶在任何需要的地方調用
當客戶端應用程序調用時
只需發送一條調用命令
數據庫服務器就會執行該過程
與一般的PL/SQL塊主要的不同是
無需在網上傳送大量的源程序代碼
只傳送一條調用命令
這就大大降低了網絡通信的負擔
而且只在剛創建時分析編譯一次
每次調用直接執行編譯了的代碼
因此運行速度較快
在實際開發時
對於具有共同特性的功能模塊最好使用存儲過程
調用時通過使用不同的實際參數值來實現某一具體的處理
如果能充分利用存儲過程來完成應用系統的操作與處理
則可大大提高系統的運行性能
編寫可重用共享池中已有語句的SQL語句
共享內存緩沖區和後台進程合稱為一個Oracle實例
當啟動一個Oracle實例時
會有許多的Oracle後台進程被啟動
每個進程都負責運行數據庫的不同方面的處理
各進程通過共享內存彼此之間進行通信
該塊內存就是系統全局區SGA
SGA被分隔為不同的區域
其中一個稱作共享池(Shared Pool)的區域中包含了發送給數據庫的SQL語句的正文和PL/SQL塊
以及它們經過分析後的表示形式與執行方案
其中執行方案是數據庫實際處理該語句的方法
例如
需要訪問哪些表和索引
是否需要執行排序操作等等
因為要執行一條SQL 語句
數據庫就必須確定其執行方案
當數據庫從客戶應用程序接收到一條SQL語句時
它首先檢查是否該語句在共享池中
若在
那麼不重新對其分析而是重復使用已經在共享池中的形式及執行方案
若不在
則對該語句進行分析
得到新的分析形式與執行方案並進行存儲
覆蓋共享池中以前的內容
由此可以看出
編寫可重用共享池中語句的SQL語句就顯得十分必要
因為避免不必要的重新分析
會很大程度上減小服務器所承擔的工作量
要想重復使用共享池中的語句
就應該編寫與其格式一致的語句
包括字母的大小寫
標點符號
換行的位置等都要一致
下面推薦一種有效實用的方法
SQL語句各部分的格式
一條語句可以一行也可以分多行書寫
但最好換行書寫
每一子句一行
且每行的第一個關鍵字與第一行的關鍵字的尾部對齊
這樣做以確保每次使用同一條語句時分行的位置一致
而不要讓語句在第
列偶然溢出到下一行
例如下面的格式中字母T
M
E
D
P是對齊的
一子句占了一行
SELECT col
col
FROM table—name
WHERE col
> col
AND col
> col
GROUP BY col
;
當剛執行過上述語句後
若又接收到下面的語句
SELECT col
col
FROM table—name
WHERE col
> col
AND col
> col
GROUP BY col
;
則通過檢查認為與共享池中的語句一致
可重復使用共享池中的執行方案
不必重新分析
而下面的的語句被認為是不同的
因為分行的位置不同
需要重新進行分析
SELECT col
col
FROM table—name
WHERE col
> col
AND col
> col
GROUP BY col
;
字母大小寫采用一致約定
關鍵字
保留字大寫
用戶聲明的標識符小寫
請看下面的兩條語句
SELECT xm
FROM student
與
select xm
FROM student
比較的結果是這兩句不匹配或者說不等價
因為第一句中的SELECT是大寫的
而第二句的是小寫的
其它
如運算符兩側各留一個空格等
總之
設計自己的編寫約定並遵守這些約定
使要處理的語句與共享池中的相一致
有助於運行性能的提高
提高可維護性
編寫觸發器
對表中數據進行修改
刪除或插入是非常常見的操作
當表被修改時
應該自動給其他需要執行操作的程序發信號
觸發器可以完成這一功能
在Oracle
中
觸發器是一段程序
但是這段程序是當發生INSERT
UPDATE或DELETE操作時被自動執行的
與過程的調用(是通過調用語句調用執行)不同
因此當某事件的發生引起連環更新或其他的相應操作時
通過自動執行觸發器代碼實現而不用人工干預
大大減輕了維護工作
同時也很好的保證了數據的一致性
觸發器的優點是自動激發
不管什麼引起數據修改(來自程序的或是來自用戶的)
它們都工作
所以常常用於不同數據表中的相關數據的串接修改
采用這種方法實現數據表間接的數據關聯可由數據庫集中維護控制
規則變化時只需修改相應的觸發器即可
這樣系統易於維護
提高了工作效率
使用%TYPE
%ROWTYPE方式聲明變量
程序設計中常常要通過變量來實現程序間的數據傳遞
即將表中數據賦值給變量
或是把變量值插入到表中
而要完成這些操作的前提就是
表中數據與變量類型要一致
然而在實際中
表中數據或類型
或寬度有時要變化
一旦變化
就必須去修改程序中的變量聲明部分
否則程序將不能正常運行
為了減少這部分程序的修改
編程時使用%TYPE
%ROWTYPE方式聲明變量
使變量聲明的類型與表中的保持同步
隨表的變化而變化
這樣的程序在一定程度上具有更強的通用性
提高程序自檢能力
一個好的應用系統不僅要有好的用戶界面
齊全的功能處理模塊
而且要有很強的錯誤處理能力
因此要求編程人員要預測可能的各種情況(聲明異常情態並引發)
並盡可能從錯誤中恢復過來(編寫相應異常情態處理器代碼)
這就是Oracle
中的異常部分的程序設計內容
然而這部分的設計絕非易事
在異常部分的最後設置OTHERS異常情態處理器是個很好的編程習慣
因為它為運行時刻捕捉到的其它錯誤指明了處理去向
從而保證了程序的正常運行
格式如下
BEGIN
…
EXCEPTION
WHEN excep—name
THEN
…
WHEN excep—name
THEN
…
WHEN OTHERS THEN
…
END;
但是對程序中出現的錯誤要做到正確的處理(即正確選擇異常處理器並執行它)
還必須弄清楚異常情態的傳播問題
異常情態的傳播指的是當在程序塊的聲明
執行
異常部分分別出現異常情態時
或在本塊中沒有相應的異常處理器時會將這個異常情態傳播到哪裡
會去激發那個塊中的處理器
傳播規則是這樣的
當一個異常情態是在塊的執行部分引發的(最常見的)
PL/SQL使用下面的規則確定激活哪個異常處理器
(
)若當前塊對該異常情態設置了處理器
則執行它並成功完成該塊的執行
然後控制轉給包含塊
(
)若當前塊沒有該處理器
則通過在包含塊中引發它來傳播異常情態
然後對包含塊執行步驟
另外
無論是在聲明部分引發了一個異常情態
還是在異常處理部分引發
則該異常情態將立即傳播給包含塊
在包含塊引用上述規則進行異常情態的處理
即使在當前塊設置了OTHERS處理器也不會被執行
易於閱讀
對於子程序
觸發器
包等帶名的程序塊
使用結束標識
例如
CREATE OR REPLACE PROCEDURE addstud IS
…
BEGIN
…
END addstud; /* 此處的過程名add是可選的
寫上較好
與塊開始的CREATE相對應 */
采用統一的標識符命名規則
對於諸如變量名
子程序名
觸發器名等數據庫對象命名時
應盡量能表示其功能用途或含義
對於過程性語句與程序塊采用縮進書寫風格
會使得程序結構清晰
層次分明
易閱讀
采用統一的字母大小寫
盡管PL/SQL程序中不區分大小寫
但是采用統一的字母大小寫(如前文敘述的大小寫約定)將在很大程度上提高程序的可閱讀性
加注釋
一條語句分多行書寫
不讓其自動分行
這方面的內容大家都已很熟悉
不再詳述了
總之
良好的程序設計風格
可以在多個方面提高系統的性能
提高開發效率
很值得我們在工作中給以重視
From:http://tw.wingwit.com/Article/program/Oracle/201311/17317.html