一背景介紹 結構化查詢語言(Structured Query Language
簡稱SQL)是用來訪問關系型數據庫一種通用語言
屬於第四代語言(
GL)
其執行特點是非過程化
即不用指明執行的具體方法和途徑
而是簡單地調用相應語句來直接取得結果即可
顯然
這種不關注任何實現細節的語言對於開發者來說有著極大的便利
然而
有些復雜的業務流程要求相應的程序來描述
這種情況下
GL就有些無能為力了
PL/SQL的出現正是為了解決這一問題
PL/SQL是一種過程化語言
屬於第三代語言
它與C
C++
Java等語言一樣關注於處理細節
可以用來實現比較復雜的業務邏輯
本文主要介紹PL/SQL的編程基礎
以使入門者對PL/SQL語言有一個總體認識和基本把握
二編程基礎知識 程序結構
PL/SQL程序都是以塊(block)為基本單位
整個PL/SQL塊分三部分
聲明部分(用declare開頭)
執行部分(以begin開頭)和異常處理部分(以exception開頭)
其中執行部分是必須的
其他兩個部分可選
無論PL/SQL程序段的代碼量有多大
其基本結構就是由這三部分組成
如下所示為一段完整的PL/SQL塊
/*聲明部分
以declare開頭*/
declare v_id integer;
v_name varchar(
);
cursor c_emp is select * from employee where emp_id=
;
/*執行部分
以begin開頭*/
begin open c_emp; //打開游標
loop
fetch c_emp into v_id
v_name; //從游標取數據
exit when c_emp%notfound ;
end loop ;
close c_emp; //關閉游標
dbms_output
PUT_LINE(v_name);
/*異常處理部分
以exception開始*/
exception
when no_data_found then
dbms_output
PUT_LINE(
沒有數據
);
end ;
控制結構
PL/SQL程序段中有三種程序結構
條件結構
循環結構和順序結構
) 條件結構
與其它語言完全類似
語法結構如下
if condition then
statement
else
statement
end if ;
) 循環結構
這一結構與其他語言不太一樣
在PL/SQL程序中有三種循環結構
a
loop … end loop;
b
while condition loop … end loop;
c
for variable in low_bound
upper_bound loop … end loop;
其中的
…
代表循環體
) 順序結構
實際就是goto的運用
不過從程序控制的角度來看
盡量少用goto可以使得程序結構更加的清晰
變量聲明與賦值
PL/SQL主要用於數據庫編程
所以其所有的數據類型跟Oracle數據庫裡的字段類型是一一對應的
大體分為數字型
布爾型
字符型和日期型
這裡簡單介紹兩種常用數據類型
number
varchar
number
用來存儲整數和浮點數
范圍為1e
~
e
其使用語法為
number[(precision
scale)]
其中(precision
scale)是可選的
precision表示所有數字的個數
scale表示小數點右邊數字的個數
varchar
用來存儲變長的字符串
其使用語法為
varchar
[(size)]
其中size為可選
表示該字符串所能存儲的最大長度
在PL/SQL中聲明變量與其他語言不太一樣
它采用從右往左的方式聲明
比如聲明一個number類型的變量v_id
那其形式應為
v_id number;
如果給上面的v_id變量賦值
不能用
=
應該用
:=
即形式為
v_id :=
;
SQL基本命令
PL/SQL使用的數據庫操作語言還是基於SQL的
所以熟悉SQL是進行PL/SQL編程的基礎
SQL語言的分類情況大致如下
) 數據定義語言(DDL)
Create
Drop
Grant
Revoke
…
) 數據操縱語言(DML)
Update
Insert
Delete
…
) 數據控制語言(DCL)
Commit
Rollback
Savapoint
…
) 其他
Alter System
Connect
Allocate
…
具體的語法結構可以參閱其他關於SQL語言的資料
這裡不再贅述
三過程與函數 PL/SQL中的過程和函數與其他語言的過程和函數一樣
都是為了執行一定的任務而組合在一起的語句
過程無返回值
函數有返回值
其語法結構為
過程
Create or replace procedure procname(參數列表) as PL/SQL語句塊
函數
Create or replace function funcname(參數列表) return 返回值 as PL/SQL語句塊
為便於理解
舉例如下
問題
假設有一張表t
有f
和f
兩個字段
f
為number類型
f
為varchar
類型
要往t
裡寫兩條記錄
內容自定
Create or replace procedure test_procedure as
V_f
number :=
; /*聲明變量並賦初值*/
V_f
number :=
;
V_f
varchar
(
) :=
first
;
V_f
varchar
(
) :=
second
;
Begin
Insert into t
values (V_f
V_f
);
Insert into t
values (V_f
V_f
);
End test_procedure; /*test_procedure可以省略*/
至此
test_procedure存儲過程已經完成
經過編譯後就可以在其他PL/SQL塊或者過程中調用了
函數與過程具有很大的相似性
此處不再詳述
四游標 游標的定義為
用游標來指代一個DML SQL操作返回的結果集
即當一個對數據庫的查詢操作返回一組結果集時
用游標來標注這組結果集
以後通過對游標的操作來獲取結果集中的數據信息
這裡特別提出游標的概念
是因為它在PL/SQL的編程中非常的重要
定義游標的語法結構如下
cursor cursor_name is SQL語句;
在本文第一段代碼中有一句話如下
cursor c_emp is select * from employee where emp_id=
;
其含義是定義一個游標c_emp
代表employee表中所有emp_id字段為3的結果集
當需要操作該結果集時
必須完成三步
打開游標
使用fetch語句將游標裡的數據取出
關閉游標
請參照本文第一段代碼的注釋理解游標操作的三步驟
五其他概念 PL/SQL中包的概念很重要
主要是對一組功能相近的過程和函數進行封裝
類似於面向對象中的名字空間的概念
觸發器是一種特殊的存儲過程
其調用者比較特殊
是當發生特定的事件才被調用
主要用於多表之間的消息通知
至此
就介紹了PL/SQL的編程基礎知識
至於實際的應用
以後接著探討
From:http://tw.wingwit.com/Article/program/Oracle/201311/18991.html