oracle 儲存過程的基本用法

2021-08-31 12:56:06 字數 4601 閱讀 4173

基本結構

create or replace procedure 名稱

引數1 in number,

引數2 out number,

引數3 in out number

) is (as)

變數1 varchar2(50);

變數2 integer :=0;

begin

dosomething...

end 名稱;

一些用法

1.select into statement (返回一條記錄賦值給乙個或多個變數)

將select查詢的結果存入到變數中,可以同時將多個列儲存多個變數中,必須有一條記錄,否則丟擲異常(如果沒有記錄丟擲no_data_found)

例子:begin

select col1,col2 into 變數1,變數2 from typestruct where ***;

exception

when no_data_found then 

dosomething... 

end;

2.if 判斷

例子:if v_test=1 then

begin

do something

end;

end if;

3.while 迴圈

例子:while v_test=1 loop

begin

***x

end;

4.for 迴圈

例子:for i in 1..100 loop

do something.

end loop;

5.變數賦值

v_test :=0;

6.使用游標(返回多條記錄的結果集)

例子1(使用fetch...into...)

begin

open cur for select * from emp;

loop

fetch cur into cur_result ;

do something;

end loop;

close cur;

end;

例子2(使用for...in...)

....

iscursor cur is select * from emp;

v_emp emp%rowtype;

begin

for v_emp in cur loop

do someting;

end loop;

end;

7.有無返回值,看看傳入的引數是否有in,out,無out無返回值,反之,亦然.

8.is 後面定義的不能加入in,out 關鍵字

9.游標屬性,cur%found,cur%notfound,cur%rowcount=>下一行結果集存在,下一行結果集不存在,行數

10.型別屬性,table.field%type,table%rowtype

11.異常(內部異常和使用者異常)

常見的異常:

no_data_found(select into 語句沒有符合條件的記錄返回)

too_many_rows(select into 語句符合條件的記錄有多條返回)

dup_val_on_index(對於資料庫表中的某一列,該列已經被限制為唯一索引,程式試圖儲存兩個重複的值)

value_error(在轉換字元型別,擷取或長度受限時,會發生該異常,如乙個字元分配給乙個變數,而該變數宣告的長度比該字元短,就會引發該異常)

storage_error(記憶體溢位)

zero_divide(除數為零)

case_not_found(對於選擇case語句,沒有與之相匹配的條件,同時,也沒有else語句捕獲其他的條件)

cursor_already_open( 程式試圖開啟乙個已經開啟的游標 )

timeout_on_resource( 系統在等待某一資源,時間超時 )

others (其他未命名的異常)

例子:begin

do something

exception

when not_data_found then null;

when others then exit;

end;

12.丟擲異常

例子:(使用raise語句)

begin

if order_rec.qty>inventory_rec.qty then

raise inventory_too_low;

end if ;

exception

when inventory_too_low then

order_rec.staus:='backordered';

end;

一些對應的例子

-- 儲存過程測試1(賦值變數)

create or replace procedure mytest1(t  in varchar2,

t2 out varchar2,

t3 out varchar2) is

begin

select ename, job into t2, t3 from emp p where p.empno = t;

dbms_output.put_line('ok');

exception

when others then

rollback;

end mytest1;

-- 儲存過程測試2(判斷條件)

create or replace procedure mytest2(x in number, y out number) is

begin

if (x > 0) then

begin

y := 10;

end;

end if; if x = 0 then

begin

y := 5

end;

end if;

end mytest2;

-- 儲存過程測試3(while 迴圈條件)

create or replace procedure mytest3(i in number, j out number) is

begin

while i < 10 loop

begin

i := i + 1; j := i;

end;

end loop;

end mytest3;

-- 儲存過程測試4(for 迴圈條件)

create or replace procedure mytest4() as

cur cursor is

select ename from emp; myname varchar2(100);

begin

for myname in cur loop

begin

dbms_output.put_line(myname);

end;

end loop;

end mytest4;

-- 游標的使用(cursor型游標,sys_refcursor型游標)

create or replace procedure mytest5() is

cur1 cursor is

select ename from emp where empno = ''; --cursor的使用方式1

cur2 cursor;

begin

select ***x into cur2 from tablename where xx = ''; --cursor的使用方式2

end mytest5;

create or replace procedure mytest52(rscursor out sys_refcursor) as

cur sys_refcursor; myname varchar(20);

begin

open cur for select ename from emp where ''; --sys_refcursor只能通過open方法來開啟和賦值

loop fetch cur into myname

--sys_refcursor只能通過fetch into來開啟和遍歷 exit when cursor%notfound; --sys_refcursor中可使用三個狀態屬性:

---%notfound(未找到記錄資訊) %found(找到記錄資訊) ---%rowcount(然後當前游標所指向的行位置)

dbms_output.put_line(myname);

end loop; rscursor := cur;

end mytest52;

MySQL 儲存過程的基本用法

我們大家都知道mysql 儲存過程是從 mysql 5.0 開始逐漸增加新的功能。儲存過程在實際應用中也是優點大於缺點。不過最主要的還是執行效率和sql 封裝。特別是 sql 封裝功能,如果沒有儲存過程。在外部程式訪問資料庫時 例如 php 要組織很多 sql 語句。特別是業務邏輯複雜的時候,一大堆...

MySQL 儲存過程的基本用法

我們大家都知道mysql 儲存過程是從 mysql 5.0 開始逐漸增加新的功能。儲存過程在實際應用中也是優點大於缺點。不過最主要的還是執行效率和sql 封裝。特別是 sql 封裝功能,如果沒有儲存過程。在外部程式訪問資料庫時 例如 php 要組織很多 sql 語句。特別是業務邏輯複雜的時候,一大堆...

MySQL 儲存過程的基本用法

一 mysql 建立儲存過程 pr add 是個簡單的 mysql 儲存過程,這個mysql 儲存過程有兩個 int 型別的輸入引數 a b 返回這兩個引數的和。drop procedure if exists pr add 計算兩個數之和 create procedure pr add a int...