程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> Oracle數據庫 >> Oracle教程 >> Oracle基礎(四)pl/sql

Oracle基礎(四)pl/sql

編輯:Oracle教程

Oracle基礎(四)pl/sql


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進階的三大控制語句下篇介紹 視圖,觸發器,以及分頁的存儲過程

塊結構示意圖

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)

Pl/sql進階

三種條件分支

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裡面學到的東西更多,學習就這樣從不同的角度看問題,然後全面了解它。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved