儲存過程基礎

2021-08-31 02:38:42 字數 3898 閱讀 9555

-- 儲存過程基礎語法

1.1 基本結構

create or replace procedure 儲存過程名字

(引數1 in number,

引數2 in number

) as

變數1 integer :=0;

變數2 date;

begin

end;

1.2 select into statement

將select查詢的結果存入到變數中,可以同時將多個列儲存多個變數中,必須有一條

記錄,否則丟擲異常(如果沒有記錄丟擲no_data_found)

例子:

begin

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

exception

when no_data_found then

***x;

end;

...1.3 if 判斷

if v_test=1 then

begin

do something

end;

end if;

練習:create or replace procedure usp_lu_fac_prc_repymt_bill_d

(id_in in tbl_lu_fac.id%type,

result_cursor out types.cursor_type)as

v_prc_id tbl_lu_fac_prc.id%type;

v_repymt_id tbl_lu_fac_repymt.id%type;

begin

select

tbl_lu_fac_prc.id,

tbl_lu_fac_repymt.id

into v_prc_id,v_repymt_id

from tbl_lu_fac

left join tbl_lu_fac_prc on tbl_lu_fac_prc.lu_fac_id = tbl_lu_fac.id

left join tbl_lu_fac_repymt on tbl_lu_fac_repymt.lu_fac_id = tbl_lu_fac.id

where tbl_lu_fac.id = id_in

for update nowait;

if(v_prc_id is not null) then

begin

delete from tbl_lu_fac_prc where tbl_lu_fac_prc.id = v_prc_id;

end;

end if;

if(v_repymt_id is not null) then

begin

delete from tbl_lu_fac_repymt where tbl_lu_fac_repymt.id = v_repymt_id;

end;

end if;

delete from tbl_lu_fac where tbl_lu_fac.id = id_in;

open result_cursor for

select 'success' as status from dual;

exception

when no_data_found then

err.raise_err(err.deleted_by_other_user);

when err.record_is_locked then

err.raise_err(err.updated_by_other_user);

when others then

raise;

end;

————————————————————————————————

1.4 while 迴圈

while v_test=1 loop

begin

***x

end;

end loop;

1.5.變數賦值

v_test := 123;

1.6.用for in 使用cursor

...is

cursor cur is select * from ***;

begin

for cur_result in cur loop

begin

v_sum :=cur_result.列名1+cur_result.列名2

end;

end loop;

end;

注:有三種迴圈

1、loop

exit when 條件;

.............

end loop;

2、 while 條件 loop

..............

end loop;

3、for i in 1..100 loop

..........

end loop;

還有一種是用隱式游標來實現的:

for idx in (select a, b from tablea) loop

................

end loop;

1.7、陣列

首先明確乙個概念:oracle中本是沒有陣列的概念的,陣列其實就是一張表(table),每個陣列元素就是表中的乙個記錄。

使用陣列時,使用者可以使用oracle已經定義好的陣列型別,或可根據自己的需要定義陣列型別。

(1)使用oracle自帶的陣列型別

x array; --使用時需要需要進行初始化

e.g:

create or replace procedure test(y out array) is

x array;

begin

x := new array();

y := x;

end test;

(2)自定義的陣列型別 (自定義資料型別時,建議通過建立package的方式實現,以便於管理)

e.g (自定義使用參見標題4.2)

create or replace package mypackage is

-- public type declarations type info is record( name varchar(20), y number);

type testarray is table of info index by binary_integer; --此處宣告了乙個testarray的型別資料,其實其為一張儲存info資料型別的table而已,及testarray 就是一張表,有兩個字段,乙個是

name,乙個是y。需要注意的是此處使用了index by binary_integer 編制該table的索引項,也可以不寫,直接寫成:type testarray is

table of info,如果不寫的話使用陣列時就需要進行初始化:vararray mypackage.testarray; vararray := new mypackage.testarray();

end testarray;

1.8.帶引數的cursor

cursor c_user(c_id number) is select name from user where typeid=c_id;

open c_user(變數值);

loop

fetch c_user into v_name;

exit fetch c_user%notfound;

do something

end loop;

close c_user;

1.9.用pl/sql developer debug

連線資料庫後建立乙個test window

在視窗輸入呼叫sp的**,f9開始debug,ctrl+n單步除錯

儲存過程基礎

建立輸入引數儲存過程 create or replace procedure lyr3 name varchar2,age number is begin insert into student values sys guid name,age end 建立輸出儲存過程 create procedu...

基礎 儲存過程

github mysql 5.0開始支援儲存過程,儲存過程是存在資料庫中的一段sql集合,呼叫儲存過程可以減少很多任務作量,減少資料在資料庫和應用伺服器上的傳輸,對於提高資料處理的效率,同時注意,儲存過程沒有or replace的關鍵字,mysql的儲存過程引數包括 in,out,inout 三種模...

儲存過程基礎

這一篇要總結的是儲存過程,包括儲存過程有哪幾種,如何建立,以及最後如何呼叫儲存過程。所以分為以下幾個方面進行總結。1,不帶引數的儲存過程 2,帶輸入引數的儲存過程 3,帶輸入和輸出引數的儲存過程 4,帶返回值的儲存過程 例如,以下儲存過程返回employees表中所有職員的記錄。儲存過程 use t...