PL/SQL塊結構與用途

PL/SQL塊結構與用途
作用:如果不使用PL/SQL語言,oracle一次只能處理一條SQL語句。每條SQL語句都導致客戶(client)向服務器(server)調用,從而在性能上產生很大的開銷,尤其是在網絡操作中。如果使用PL/SQL,一個塊中的語句作爲一個組,導致客戶向服務器的一次調用,減少網絡轉輸

PL/SQL塊結構與用途
一個基本的PL/SQL塊由三部分組成:定義部分、可執行部分以及例外處理部分:
定義部分:
定義將在可執行部分中調用的所有變量、常量、遊標和用戶自定義的例外處理。這部分可以沒有。
可執行部分:
包括對數據庫中進行操作的SQL語句,以及對塊中進行組織、控制的PL/SQL語句。這部分必須存在。
例外處理部分:
對可執行部分中的語句,在執行過程中出錯或出現非正常現象時所做的相應處理。這部分可以沒有。
由基本的PL/SQL塊組成PL/SQL程序,可組成不同的程序形式,它們的用途和適用性各不相同。程序形式大致有以下幾種:
1、無名塊:也就是沒有命名的PL/SQL塊,它可以是嵌入某一個應用之中的一個PL/SQL塊。
2、存儲過程/函數:也就是命名了的PL/SQL塊,它可以接收參數,並且可以重複地被調用。
3、包
命名了的PL/SQL模塊,由一組相關的過程、函數和標識符組成。
4、數據庫觸發器:是一個與具體數據庫表相關聯的存儲PL/SQL程序。每當一個SQL操作影響到該數據庫表時,系統就自動執行相應的數據庫觸發器。每個表最多可以有12個觸發器。
PL/SQL塊的定義部分
變量聲明語法:
標識符 [constant] 數據類型 [not null]
[:=默認值或PL/SQL表達式]
注意的幾點(書p73):
加上關鍵字CONSTANT,則表示所定義的標識符爲一個常量,必須爲它賦初值。
如果定義的標識符不能爲空,則必須加關鍵字NOT NULL,並賦初值。
“:=”爲賦值操作符。
PL/SQL提供了SQL沒有的附加數據類型。除一般的ORACLE SQL數據類型外,PL/SQL還可以使用這些數據類型對變理進行說明
1、BOOLEAN:可用預定義的常量TRUE、FALSE或NULL對一個布爾變量賦值。
2、binary_integer(二進制整數):數值範圍在 -2,147,483,647到2,147,483,647之間。
3、NATURAL(自然數):數值範圍在0到2,147,483,647之間。
4、POSITIVE(正整數):數值範圍在1到2,147,483,647之間。
5、%TYPE:可說明一個變量的數據類型與某一指定列的數據類型相同。
6、%ROWTYPE: 用這種數據類型可以說明一個複合變量,與某一特定有中的一行相同。
變量聲明分標量型變量聲明和組合變量(複合變量)聲明。標量型變量是指其內部沒有成員的變量。
例:
age number(5) not null:=25;
pi constant number(9):=3.1415926;
name char(10) not null:=‘fan’;
today date not null:=sysdate;
sex boolean:=true;
例:聲明一個變量Student_name,其類型基於另一個變量teacher_name。
Teacher_name char(10);
Student_name teacher_name%type;
例: 聲明一個變量No,使其與表emp中EMPNO的類型一致。
no emp.empno%type;
組合型變量內部包含若干個成員,每個成員由標量型變量或組合型變量組成
定義組合型變量的語法如下:
type <類型名> is record
(<域名1> {<標量型數據類型> | <record類型>}[not null],
<域名2> {<標量型數據類型> | <record類型>}[not null],
…….);
<標識符> <類型名>;
例:定義一個變量,存放一個學生的有關信息。
declare
type student is record /*定義組合型變量類型*/
(id number(4) not null:=0,
name char(10) not null:=' ',
sex boolean not null:=true,
birthday date,
physics number(3),chemistry number(3));
stu student; /*定義組合型變量*/
begin
stu.id:=1;
stu.name:='sheng';
stu.sex:=true;
end;
例:聲明一個變量,其結構與表emp的數據結構相一致。
declare
emp_value emp%rowtype;
Begin
select * into empvalue from emp
where empno=7369;
dbms_output.put_line(‘姓名:’||‘ ’||emp_value.ename);
End;
注:在運行些PL/SQL塊前,應先運行
Set serveroutput on /*使dbms_output.put_line可以顯示在屏幕上*/
可執行部分
可執行部分可以包含變量賦值語句、數據查詢、數據操縱和事務控制語句。如select、insert、update、delete、commit、rollback等語句。而不能使用CREATE,ALTER,DROP,GRANT,REVOR等數據定義或數據控制命令。
給標量型變量賦值
teacher_name:=‘liu’;
給record類型變量賦值語法:
<record名.域名>:=<pl/sql表達式>;
例:
stud.name:=‘fan’ student.sex:=true;
%rowtype型變量的賦值與record相同。
例:計算表emp中所有僱員的平均工資。
declare
avg_sal number(7,2);
begin
select avg(sal) into avg_sal from emp;
dbms_output.put_line(‘平均工資爲:’||avg_sal);
End;
在運用select語句查詢時注意查詢的結果只能有一條,如果返回的查詢結果多於一條或沒有找到任何數據,則會產生異常。
事務控制命令
一、事務的概念
事務是一個操作序列。這些操作要麼都做,要麼都不做,是一個不可分割的工作單位。事務通常以BEGIN TRANSACTION開始,以COMMIT或ROLLBACK操作結束,COMMIT即提交,提交事務中所有的操作、事務正常結束。ROLLBACK即撤消已作的所有操作,滾回到事務開始時的狀態。
二、事務提交命令
作用:提交自上次提交以後對數據庫中數據所作的改動。事務提交以後,這些操作就不能再撤消。
事務提交有3種方式:
1、顯式提交:使用commit命令
2、隱式提交:有些命令,如alter、audit、comment、connect、create、disconnect、
drop、exit、grant、noaudit、revoke、rename命令等都隱含有commit操作,而無須指明該操作。
3、自動提交
用戶可以使用set命令來設置自動提交環境。經過設置後,sql/plus會自動提出交用戶的更新工作。一旦設置了自動提交,用戶每次執行insert、update或delete命令,系統就會立即自動進行提交。
命令爲:
set auto on
三、事務回退
作用:尚未提交的UPDATE,INSERT,DELETE操作,可以用事務回退命令回退,回退之後數據庫將回到上次COMMIT後的狀態。
命令: rollback
四、保存點
作用:可以把一個事務劃分成若干部分,每一部分之間用一個保存點分隔。
格式:
savepoint 保存點名;
rollback to 保存點名;

PL/SQL流程控制
主要有三種:
條件控制
循環控制
跳轉控制
有兩種形式:
1、 IF_THEN_ELSE語句
語法格式:
if 條件 then
語句1;
語句2;
…… else
語句n;
語句n+1;
…… end if;
2、IF_THEN_ELSE_IF語句
語法格式:
IF 條件1 THEN
語句1;
語句2;
……Elsif 條件2 THEN
語句3;
語句4;
[ELSIF 條件 n THEN
……]
[ELSE
語句n+1
……]
END IF
1、根據下式計算y值

x+1 x>3
y= X×2 X>=0
X÷3 X<0
PL/SQL實現語句1:
declare
x number(4);
y number(10,2);
begin
x:=&x; /* 實現從鍵盤輸入一個值給X */
if x>=3 then
y:=x+1;
elsif x>=0 then
y:=x*2;
else
y:=x/3;
end if;
dbms_output.put_line(y); /* 輸出Y值 */
end;
PL/SQL實現語句2:declare
x number(4);
y number(10,2);
begin
x:=&x;
if x>=3 then
y:=x+1;
else if x>=0 then
y:=x*2;
else
y:=x/3;
end if;
end if;
dbms_output.put_line(y);
end;
注意:條件語句中可以沒有else 語句如:
declare
x number(4);
y number(10,2);
begin
x:=&x;
if x>=3 then
y:=x+1;
end if;
dbms_output.put_line(y);
end;
循環控制語句
有四種類型:
FOR循環
直到型循環
當型循環
簡單循環
FOR循環
語法格式:
For 計數器 in [reverse] 下界..上界
Loop
語句1;
語句2;
……END LOOP;
注意:
 計數器是有於控制循環資數的變量,它不需顯式地在變量定義部分進行定義。
系統默認時,計數器從下界往上界遞增記數,如果在關鍵字IN後加上REVERSE則表示計數器從上界到下界遞增記數。
計數器變量只能在循環體內部使用,不能在循環體外使用。
例:計算1+2+3+……+100的值
declare
S number(5):=0;
Begin
For I in 1..100
Loop
s:=s+I;
End loop;
Dbms_output.put_line(s);
End;
/
例4.10
從鍵盤接收一個整數,計算它的階乘並在屏幕上打印輸出。
declare
num number(3);
Fac number;
begin
Num:=&num
fac:=1;
if num>0 then
for i in 1..num loop
fac:=fac*i;
end loop;
end if;
end;
直到型循環
特點:先執行循環體,後判斷條件。
語法格式:
Loop
<語句1>
<……>
Exit [when 條件]
<語句 n>
<……>
End loop;
例4.11用直到型循環控制語句求從1-100所有整數的和。
解1: declare
I number(3):=100;
suma number;
begin
suma:=0;
loop
suma:=suma+I;
I:=I-1;
exit when I=0;
end loop;
end;
解2:
declare
I number(3):=1;
suma number;
begin
suma:=0;
loop
suma:=suma+I;
I:=I+1;
exit when I>100;
end loop;
dbms_output.put_line(suma);
end;
當型循環
特點:先判斷條件,後執行循環體。
語法格式:
While <條件> loop
<語句1>
<……>
End loop;
例4.12 採用當型循環控制語句求1-100所有整數的和
解:先申明一個全局變量:
variable suma number
再寫PL/SQL塊:
declare
I number(3):=100;
begin
:suma:=0; /*變量suma前帶有“:”表示爲全局變量*/
While I>0 loop
:suma:=:suma+I;
I:=I-1;
End loop;
End;
跳轉語句
語法格式:
<<標號>>
……Goto 標號
有幾項原則:
可以實現同一塊中語句之間的跳轉
可以從子塊跳至父塊,但不能從父塊跳至子塊
不能從IF語句體外跳入IF語句內。
不能從循環體外跳入循環體內。
不能從子程序外部跳入到子程序內
循環語句的嵌套
即一個循環語句中還可以包括其它的循環語句。
例:求100-200間的全部素數。
declare
fag boolean:=true;
begin
for i in 100..200 loop
for j in 2..i-1 loop
if mod(i,j)=0 then
fag:=false;
end if;
end loop;
if fag then
dbms_output.put_line(i);
end if;
fag:=true;
end loop;
end;
PL/SQL允許在一個塊中包含子塊,下段程序中列出了一個匿名的塊,它包含另一個子塊,該子塊有自己的說明部分。例如:
declare
max_i constant int:=100;
i int:=1;
rec_number int ;
begin
for i in 1..max_i loop
if mod(i,5)=0 then
rec_number:=5;
elsif mod(i,7)=0 then
rec_number:=7;
else
rec_number:=i;
end if;
insert into text_table
(record_number,current_date)
values
(rec_number,sysdate);
declare
max_j constant int :=10;
j int :=1;
begin
for j in 1..max_j loop
rec_number:=rec_number*j;
insert into test_table
(rec_number,current_date)
values
(record_number,sysdate);
end loop;
end;
end loop;
end;
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章