PL/SQL也是一種程序語言,叫做過程化SQL語言(Procedural Language/SQL)。PL/SQL是Oracle數據庫對SQL語句的擴展。在普通SQL語句的使用上增加了編程語言的特點,所以PL/SQL就是把數據操作和查詢語句組織在PL/SQL代碼的過程性單元中,通過邏輯判斷、循環等操作實現復雜的功能或者計算的程序語言。
總結下來就是是sql語言的擴展,sql語句+ 變量和常量+條件語句+循環語句+例外處理各種錯誤!
PL/SQL的作用
使用PL/SQL可以編寫具有很多高級功能的程序,雖然通過多個SQL語句可能也能實現同樣的功能,但是相比而言,PL/SQL具有更為明顯的一些優點:
⒈能夠使一組SQL語句的功能更具模塊化程序特點;
⒉采用了過程性語言控制程序的結構;
⒊可以對程序中的錯誤進行自動處理,使程序能夠在遇到錯誤的時候不會被中斷;
⒋具有較好的可移植性,可以移植到另一個Oracle數據庫中;
⒌集成在數據庫中,調用更快;
⒍減少了網絡的交互,有助於提高程序性能。
通過多條SQL語句實現功能時,每條語句都需要在客戶端和服務端傳遞,而且每條語句的執行結果也需要在網絡中進行交互,占用了大量的網絡帶寬,消耗了大量網絡傳遞的時間,而在網絡中傳輸的那些結果,往往都是中間結果,而不是我們所關心的。
而使用PL/SQL程序是因為程序代碼存儲在數據庫中,程序的分析和執行完全在數據庫內部進行,用戶所需要做的就是在客戶端發出調用PL/SQL的執行命令,數據庫接收到執行命令後,在數據庫內部完成整個PL/SQL程序的執行,並將最終的執行結果返饋給用戶。在整個過程中網絡裡只傳輸了很少的數據,減少了網絡傳輸占用的時間,所以整體程序的執行性能會有明顯的提高。
接下來主要介紹下用pl/sql編寫的在塊的基礎上編寫過程,函數,包以及pl/sql進階的三大控制語句下篇介紹 視圖,觸發器,以及分頁的存儲過程
塊結構示意圖
Pl/sql塊由定義,執行,例外處理部分組成
Declear 定義常量,變,游標,例外,復雜數據類型
Begin 執行
Exception 例外處理
End;
例如:
Declare
V_ename varchar2(5);定義字符串變量
V_sal number(7,2);
Begin
Select ename ,sal into v_ename ,v_sal from emp where empno=&no;
Dbms_output.put_line(‘雇員名:’||v_ename ||’工資:’|| v_sal);
--異常處理
Exception
When no_date_found thendbms_output.put_line(‘朋友,輸入錯誤’);
End
使用Sqlplus開發工具:Pl/sql develper獨立工具
(一)1、創建一個簡單的表
Createtable mytest(name varchar2(30),passwd varchar2(30));
2、創建過程
Create or replace procedure sp_prol is
Begin
--執行部分
Insert into mytest values(‘韓順平’,‘m1234’);
End;
3、調用
Exec 過程名(參數)
Call過程名(參數)
無返回值的存儲過程
Create procedure sp_pro3(spnamevarchar2,newSal number)is
Begin
--執行部分,根據用戶名去修改工資
Updateemp set sal= newsal where ename=spName;
End;
(二) 函數
Createfunction sp_fun2(spName varchar2) return
Number isyearSal number(7,2);
Begin
--執行部分
Selectsal*12+nvl(comm,0)*12 into yearSal from emp where ename =spName;
ReturnyearSal;
End;
調用函數
Sql varincome number
call annual_income(‘scott’) from into:income;
Sql>printincome
Java程序中通過rs.getInt(1)得到返回的結果
Sql>showerorr--顯示錯誤
(三)包
--創建包
--創建一個包sp_package
__聲明了該包裡有一個過程update_sal
---聲明一個函數
Createpackage sp_packge is
procedureupdate_sal(name varchar2,newsal number);
Functionannual_income(name varchar2) reture number;
End ;
創建包體
Createpackage body sp_package is
Procedure
Function
Begin
Select
Return
End
End
調用
Sql>call sp_package.function (procedule)
三種條件分支
If then
Create or replace procedure sp_pro6(spName varchar2) is
--定義
v_sal smp.sal%type;
Begin
--執行
Select sal into v_sal from empwhere ename=spName;
--判斷
If v_sal<2000 then
Update empset sal=sal-sal*10% where ename =spName;
End if;
End;
調用
Sql> execsp_pro6('scott') scott為用戶名
二重條件分支 if- then -else
Create or replace proceduresp_pro6(spName varchar2) is
- -定義
v_sal smp.sal%type;
Begin
--執行
Select sal into v_sal from empwhere ename=spName;
--判斷
If v_com<>0 then
Update empset comm=comm+100 where ename =spName;
Else
Update empset comm=comm+200 where ename=spName;
End if;
End;
調用
Sql> execsp_pro6('scott') scott為用戶名
多重條件分支 if-then-elseif --else
如果該員工的職位是president,就給他的工資增加1000,如果該員工的職位是manager就給他的工資增加500 ,其他職位的員工增加200
Create orreplace procedure sp_pro6(spNo number) is
--定義
v_job emp.job%type;
Begin
--執行
Selectjob into v_job from emp where empno=spNo;
If v_job='president' then
Update emp set sal=sal + 1000 where empno=spNo;
Elseif v_job='manager ' then
Update empset sal=sal+500 where empno-spNo;
Else
Update empset sal =sal+200 where empno=spNo;
End if ;
End;
調用 sql>Execsp_pro6(7839)
循環語句
Loop End loop 至少執行一次,先循環再判斷
create or replace proceduresp_pro6 (spName varchar2) is
--定義 := 表示賦值
v_num number:=1;
Begin
Loop
insert into users values (v_num,spName);
--判斷是否要退出循環
exit when v_num=10;
--自增
v_num :=v_num+1
End loop;
End;
循環語句 while循環
先判斷後循環
create or replace proceduresp_pro6 (spName varchar2) is
--定義 := 表示賦值
v_num number:=11;
Begin
While v_num <=20 loop
--執行
insert into users values (v_num,spName);
--自增
v_num :=v_num+1
End loop;
End;
for循環
Begin
For I inreverse 1….10 loop
Insert into users values(I,'順平');
End loop;
End;不建議使用
順序控制語句
Goto 建議不用 循環嵌套不要超過三層
用於跳轉到特定標號去執行 語句,注意用於使用go to增加復雜性,可讀性差
Declare
i int :=1;
Begin
Loop
dbms_output.put_line('輸出i=' || i);
if I =10 then
got end_loop;
end if;
i:=i+1;
end loop;
<
--<<>>goto 標號
Dbms_output.put_line('循環結束');
End;
Null
不會執行任何操作,將控制傳遞下一句
提高可讀性
Declare
v_salemp.sal%type;
v_enameemp.ename%type;
Begin
Select ename,sal into v_ename,v_val
From empwhere empno=%no;
If v_sal<3000 then
Update empsel comm =sal*0.1 where ename=v_ename;
Else
Null;
End if ;
End;
pl/sql出於sql,所以很大一部分沿襲了sql,之前sql server的學習中沒有這麼深入的接觸,這次在pl/sql裡面學到的東西更多,學習就這樣從不同的角度看問題,然後全面了解它。