PL/SQL簡介
PL/SQL也是一種程式語言,叫做過程化SQL語言(Procedural Language/SQL)。PL/SQL是Oracle資料庫對
SQL語句的擴充。在普通SQL語句的使用上增加了程式設計語言的特點,所以PL/SQL就是把資料操作和查詢語句組織在
PL/SQL代碼的過程性單元中,通過邏輯判斷、迴圈等操作實現複雜的功能或者計算的程式語言 -- 百度百科。
PL/SQL是Oracle系統的核心語言,現在Oracle的許多組件都是由PL/SQL寫成。可以使用的SQL語句有:
INSERT ,UPDATE ,DELETE ,SELECT ...INTO ... ,COMMIT , ROLLBACK ,SAVEPOINT 。
塊結構
構成PL/SQL 程式的基本單元是語句塊,所有的PL/SQL程式都是由語句塊構成的。由三部分組成,即聲明部分,
執行部分,異常處理部分。
具體結構如下:
DECLARE
-- 聲明部分,聲明函數用到的,常量,變數,類型,遊標,異常處理的名稱等。
BEGIN
-- 執行部分,程式的執行程式
EXCEPTION
--異常部分,對出現的異常進行處理
END ;
PL/SQL塊可以分為三類:
1. 無名塊:動態構造,只能執行一次。
2.子程式:在資料庫中建立好之後,可以再其他的程式中調用他們。
3.觸發器:當資料庫發生操作時,會觸發一些時間,自動的執行某些程式。
標示符
1.字元長度不能超過30.
2.必須用字母開頭。
3.由字母A-Z ,a-z ,0-9 ,底線(_) , 貨幣符號($),井號(#)組成。
4.不能使用sql保留字和關鍵字。
注釋
單行注釋:放置在一行上的注釋文本,使用符號“--” 開頭,一直到該行的末尾都被注釋掉。
多行注釋:以符號“/*” 開始 ,以符號“*/” 結束,在這兩個符號中間的語句,都被注釋掉。
例:程式設計語言的學習,都是從helloworld開始,下面開始書寫第一個pl/sql程式
SQL> set serveroutput on ;
BEGIN
dbms_output.put_line('hello world ');
END ;
hello world
PL/SQL procedure successfully completed
觀察發現省略了 declare 和exception這兩個部分,這是可以的,當沒有變數聲明的時候可省略declare
部分,沒有異常捕獲也可以省略exception部分。dbms_output.put_line()的作用和JAVA中的
system.out.println()類似,需要說明的是在執行pl/sql語句之前壓先運行set serveroutput on ;
語句,負責是看不到執行結果的。
例:使用select...into ...查詢emp表中員工號為7934的工資,姓名
declare
v_sal number(20);
v_ename varchar2(20);
BEGIN
select sal , ename into v_sal , v_ename from emp where empno = 7934 ;
dbms_output.put_line(v_ename || ',' || v_sal);
END ;
MILLER,1300
上面定義了兩個變數,v_sal 和 v_ename,分別定義了變數的類型。定義變數類型還有一種方式,就是使
用“%type”,即:v_sal emp.sal%type ; v_ename emp.ename%type ; 語句的意思是,與表emp中列sal的資料類
型相同。藉助已經定義的某個資料變數或者是資料庫表中列的資料類型,來定義變數的類型。
變數類型
char:定長字串。
varchar2:可變字串。
number:可以儲存浮點值或整數值。
date : 日期型。
boolean:布爾型。
記錄類型
記錄類型是把邏輯相關的資料作為一個單中繼存放區起來。作用是儲存互補相同但邏輯相關的資訊。有點類似JAVA
中類的概念。
declare
type emp_record is record(
v_sal emp.sal%type ,
v_ename emp.ename%type
);
e_r emp_record ; --聲明一個記錄類型的變數
BEGIN
select sal , ename into e_r from emp where empno = 7934 ;
dbms_output.put_line(e_r.v_sal || ',' || e_r.v_ename);
END ;
記錄類型中變數的使用使用"."調用。如:上面中要使用v_sal變數,e_r.v_sal 。
例:定義一個與emp表中所有的列都相同的記錄類型
declare
emp_record emp%rowtype;
BEGIN
select * into emp_record from emp where empno = 7934 ;
dbms_output.put_line('工資'||emp_record.sal || ',' ||'姓名'|| emp_record.ename);
END ;
工資1300,姓名MILLER
PL/SQL procedure successfully completed
記錄類型中的變數要和表中所有的列相對應,雖然一行行的定義也是可以的,但是還是比較麻煩的,可以使
用%rowtype 實現上面的要求,但是如果調用相應列的值得時候,則需要使用表表中真實的列名。
運算子
特別說明一下 := 的作用是賦值。 v_sal int := 2000 ; 定義v_sal變數並賦值。
流程式控制制
條件陳述式
① if 布林運算式 then
pl/sql 和sql語句;
end if ;
② if 布林運算式 then
pl/sql 和sql語句;
else
其它語句;
end if ;
③ if 布林運算式 then
pl/sql 和sql語句;
elsif布林運算式 then
其它語句;
elsif 布林運算式 then
其它語句;
else
其它語句;
end if ;
case運算式
case 運算式
when 值1 then 語句1;
when 值2 then 語句2 ;
...
else
statment_else ;
end case ;
迴圈結構
迴圈結構有3種形式,分別為LOOP循壞,WHILE迴圈和FOR循壞。
LOOP循壞
LOOP
執行語句;
EXIT WHEN 條件陳述式 ;
END LOOP ;
使用LOOP循壞至少要執行一次迴圈語句。
例:使用LOOP循壞,求出1-10 的值。
declare
v_i int := 1 ;
v_sum int := 0 ;
BEGIN
Loop
v_sum := v_sum + v_i ;
exit when v_i = 10 ;
v_i := v_i + 1 ;
end loop ;
dbms_output.put_line(v_sum);
END ;
WHILE 循壞
先判斷循壞的條件,只有滿足迴圈條件的才能進入循壞體進行循壞操作。
while 布林運算式 loop
執行的語句(循壞體);
end loop ;
使用while迴圈時,要執行的語句可能一次也不執行,這是與Loop迴圈的區別。
例:使用while循壞,求1-10相加的和。
declare
v_i int := 1 ;
v_sum int := 0 ;
BEGIN
while v_i <= 10 loop
v_sum := v_sum + v_i ;
v_i := v_i + 1 ;
end loop ;
dbms_output.put_line(v_sum);
END ;
FOR迴圈
for 迴圈變數 in[reverse] 下限...上限 loop
要執行的語句(循壞體);
end loop;
每迴圈一次,迴圈變數自動加1 ,使用reverse關鍵字,迴圈變數自動減1 ,
例:使用for-in-loop迴圈,求1-10的階乘。
declare
v_i int := 1 ;
v_sum int := 1 ;
BEGIN
for v_i in 1..10 loop
v_sum := v_sum*v_i ;
end loop ;
dbms_output.put_line(v_sum);
END ;
執行過程為,首先v_i判斷是否在1..10的範圍內,如果在執行迴圈體,end loop ,之後v_i自增1,在進行範圍判
斷,執行迴圈體,知道v_i不在範圍內,迴圈終止。
GOTO語句
goto語句表示無條件跳轉到指定的標號。goto lebel_name ;<<label>> .../*標號要使用<<>> 括起來*/
declare
v_i int := 1 ;
v_sum int := 1 ;
BEGIN
for v_i in 1..10 loop
v_sum := v_sum*v_i ;
if v_i = 8 then
goto at1 ;
end if ;
end loop ;
<<at1>>
dbms_output.put_line('at');
dbms_output.put_line(v_sum);
END ;
當v_i=8時,會跳轉到<<at1>>的位置,並結束迴圈。
NULL語句
null語句被稱為空白語句,它表示不執行任何操作。