PL/SQL是ORACLE對標准數據庫語言的擴展
ORACLE公司已經將PL/SQL整合到ORACLE 服務器和其他工具中了
近幾年中更多的開發人員和DBA開始使用PL/SQL
本文將講述PL/SQL基礎語法
結構和組件
以及如何設計並執行一個PL/SQL程序
PL/SQL的優點
從版本
開始PL/SQL就被可靠的整合到ORACLE中了
一旦掌握PL/SQL的優點以及其獨有的數據管理的便利性
那麼你很難想象ORACLE缺了PL/SQL的情形
PL/SQL 不是一個獨立的產品
他是一個整合到ORACLE服務器和ORACLE工具中的技術
可以把PL/SQL看作ORACLE服務器內的一個引擎
sql語句執行者處理單個的sql語句
PL/SQL引擎處理PL/SQL程序塊
當PL/SQL程序塊在PL/SQL引擎處理時
ORACLE服務器中的SQL語句執行器處理pl/sql程序塊中的SQL語句
PL/SQL的優點如下
PL/SQL是一種高性能的基於事務處理的語言
能運行在任何ORACLE環境中
支持所有數據處理命令
通過使用PL/SQL程序單元處理SQL的數據定義和數據控制元素
PL/SQL支持所有SQL數據類型和所有SQL函數
同時支持所有ORACLE對象類型
PL/SQL塊可以被命名和存儲在ORACLE服務器中
同時也能被其他的PL/SQL程序或SQL命令調用
任何客戶/服務器工具都能訪問PL/SQL程序
具有很好的可重用性
可以使用ORACLE數據工具管理存儲在服務器中的PL/SQL程序的安全性
可以授權或撤銷數據庫其他用戶訪問PL/SQL程序的能力
PL/SQL代碼可以使用任何ASCII文本編輯器編寫
所以對任何ORACLE能夠運行的操作系統都是非常便利的
對於SQL
ORACLE必須在同一時間處理每一條SQL語句
在網絡環境下這就意味作每一個獨立的調用都必須被oracle服務器處理
這就占用大量的服務器時間
同時導致網絡擁擠
而PL/SQL是以整個語句塊發給服務器
這就降低了網絡擁擠
PL/SQL塊結構
PL/SQL是一種塊結構的語言
組成PL/SQL程序的單元是邏輯塊
一個PL/SQL 程序包含了一個或多個邏輯塊
每個塊都可以劃分為三個部分
與其他語言相同
變量在使用之前必須聲明
PL/SQL提供了獨立的專門用於處理異常的部分
下面描述了PL/SQL塊的不同部分
聲明部分(Declaration section)
聲明部分包含了變量和常量的數據類型和初始值
這個部分是由關鍵字DECLARE開始
如果不需要聲明變量或常量
那麼可以忽略這一部分
需要說明的是游標的聲明也在這一部分
執行部分(Executable section)
執行部分是PL/SQL塊中的指令部分
由關鍵字BEGIN開始
所有的可執行語句都放在這一部分
其他的PL/SQL塊也可以放在這一部分
異常處理部分(Exception section)
這一部分是可選的
在這一部分中處理異常或錯誤
對異常處理的詳細討論我們在後面進行
PL/SQL塊語法
[DECLARE]
declaration statements
BEGIN
executable statements
[EXCEPTION]
exception statements
END
PL/SQL塊中的每一條語句都必須以分號結束
SQL語句可以使多行的
但分號表示該語句的結束
一行中可以有多條SQL語句
他們之間以分號分隔
每一個PL/SQL塊由BEGIN或DECLARE開始
以END結束
注釋由
標示
PL/SQL塊的命名和匿名
PL/SQL程序塊可以是一個命名的程序塊也可以是一個匿名程序塊
匿名程序塊可以用在服務器端也可以用在客戶端
命名程序塊可以出現在其他PL/SQL程序塊的聲明部分
這方面比較明顯的是子程序
子程序可以在執行部分引用
也可以在異常處理部分引用
PL/SQL程序塊可背獨立編譯並存儲在數據庫中
任何與數據庫相連接的應用程序都可以訪問這些存儲的PL/SQL程序塊
ORACLE提供了四種類型的可存儲的程序
函數
過程
包
觸發器
函數
函數是命名了的
存儲在數據庫中的PL/SQL程序塊
函數接受零個或多個輸入參數
有一個返回值
返回值的數據類型在創建函數時定義
定義函數的語法如下
FUNCTION name [{parameter[
parameter
])] RETURN datatypes IS
[local declarations]
BEGIN
execute statements
[EXCEPTION
exception handlers]
END [name]
過程
存儲過程是一個PL/SQL程序塊
接受零個或多個參數作為輸入(INPUT)或輸出(OUTPUT)
或既作輸入又作輸出(INOUT)
與函數不同
存儲過程沒有返回值
存儲過程不能由SQL語句直接使用
只能通過EXECUT命令或PL/SQL程序塊內部調用
定義存儲過程的語法如下
PROCEDURE name [(parameter[
parameter
])] IS
[local declarations]
BEGIN
execute statements
[EXCEPTION
exception handlers ]
END [name]
包(package)
包其實就是被組合在一起的相關對象的集合
當包中任何函數或存儲過程被調用
包就被加載入內存中
包中的任何函數或存儲過程的子程序訪問速度將大大加快
包由兩個部分組成
規范和包主體(body)
規范描述變量
常量
游標
和子程序
包體完全定義子程序和游標
觸發器(trigger)
觸發器與一個表或數據庫事件聯系在一起的
當一個觸發器事件發生時
定義在表上的觸發器被觸發
變量和常量
變量存放在內存中以獲得值
能被PL/SQL塊引用
你可以把變量想象成一個可儲藏東西的容器
容器內的東西是可以改變的
聲明變量
變量一般都在PL/SQL塊的聲明部分聲明
PL/SQL是一種強壯的類型語言
這就是說在引用變量前必須首先聲明
要在執行或異常處理部分使用變量
那麼變量必須首先在聲明部分進行聲明
聲明變量的語法如下
Variable_name [CONSTANT] databyte [NOT NULL][:=|DEFAULT expression]
注意:可以在聲明變量的同時給變量強制性的加上NOT NULL約束條件
此時變量在初始化時必須賦值
給變量賦值
給變量賦值有兩種方式
直接給變量賦值
X:=
;
Y=Y+(X*
);
通過SQL SELECT INTO 或FETCH INTO給變量賦值
SELECT SUM(SALARY)
SUM(SALARY*
)
INTO TOTAL_SALARY
TATAL_COMMISSION
FROM EMPLOYEE
WHERE DEPT=
;
常量
常量與變量相似
但常量的值在程序內部不能改變
常量的值在定義時賦予
他的聲明方式與變量相似
但必須包括關鍵字CONSTANT
常量和變量都可被定義為SQL和用戶定義的數據類型
ZERO_VALUE CONSTANT NUMBER:=
;
這個語句定了一個名叫ZERO_VALUE
數據類型是NUMBER
值為
的常量
標量(scalar)數據類型
標量(scalar)數據類型沒有內部組件
他們大致可分為以下四類
number
character
date/time
boolean
表
顯示了數字數據類型
表
顯示了字符數據類型
表
顯示了日期和布爾數據類型
表
Scalar Types:Numeric
表
字符數據類型
表
DATE和BOOLEAN
LOB數據類型
LOB(大對象
Large object) 數據類型用於存儲類似圖像
聲音這樣的大型數據對象
LOB數據對象可以是二進制數據也可以是字符數據
其最大長度不超過
G
LOB數據類型支持任意訪問方式
LONG只支持順序訪問方式
LOB存儲在一個單獨的位置上
同時一個
LOB定位符
(LOB locator)存儲在原始的表中
該定位符是一個指向實際數據的指針
在PL/SQL中操作LOB數據對象使用ORACLE提供的包DBMS_LOB
LOB數據類型可分為以下四類
BFILE
BLOB
CLOB
NCLOB
操作符
與其他程序設計語言相同
PL/SQL有一系列操作符
操作符分為下面幾類
算術操作符
關系操作符
比較操作符
邏輯操作符
算術操作符如表
所示
關系操作符主要用於條件判斷語句或用於where子串中
關系操作符檢查條件和結果是否為true或false
表
是PL/SQL中的關系操作符
表
顯示的是比較操作符
表
顯示的是邏輯操作符
[[The No
Picture
]]
執行部分
執行部分包含了所有的語句和表達式
執行部分以關鍵字BEGIN開始
以關鍵字EXCEPTION結束
如果EXCEPTION不存在
那麼將以關鍵字END結束
分號分隔每一條語句
使用賦值操作符:=或SELECT INTO或FETCH INTO給每個變量賦值
執行部分的錯誤將在異常處理部分解決
在執行部分中可以使用另一個PL/SQL程序塊
這種程序塊被稱為嵌套塊
所有的SQL數據操作語句都可以用於執行部分
PL/SQL塊不能再屏幕上顯示SELECT語句的輸出
SELECT語句必須包括一個INTO子串或者是游標的一部分
執行部分使用的變量和常量必須首先在聲明部分聲明
執行部分必須至少包括一條可執行語句
NULL是一條合法的可執行語句
事物控制語句COMMIT和ROLLBACK可以在執行部分使用
數據定義語言(Data Definition language)不能在執行部分中使用
DDL語句與EXECUTE IMMEDIATE一起使用或者是DBMS_SQL調用
執行一個PL/SQL塊
SQL*PLUS中匿名的PL/SQL塊的執行是在PL/SQL塊後輸入/來執行
如下面的例子所示
declare
v_comm_percent constant number:=
;
begin
update emp
set comm=sal*v_comm_percent
From:http://tw.wingwit.com/Article/program/Oracle/201311/18629.html