儲存過程+呼叫儲存過程+無/帶參的儲存過程+in引數+out引數+int out引數+為引數設定預設值
儲存過程
1儲存過程是一組為了完成特定功能的SQL語句集
2儲存過程編譯後儲存在資料庫中
3執行儲存過程比執行儲存過程封裝的SQl語句集更有效率
4不能指定declare關鍵字
5: OUT 和 IN OUT 的形參不能有預設表示式,只有in引數可以設定預設值
語法
create 【or replace】procedure procedure_name
【(parameter 【in | out | int out】data_type 【default value】)【,….】】
{is | as }
【declaration_section;】
begin
procedure _body;
end【procedure_name】;
解釋
default value:為引數設定預設值,只適用於in引數
or replace:替換已經存在的儲存過程
procedure_name:儲存過程名稱
parameter :引數名
in :傳遞引數
out:返回一個引數
int out:傳遞和返回一個引數
data_type:引數的資料型別,用於過程體重
is | as:用於宣告變數
declaration_section:變數名稱
呼叫儲存過程
1建立儲存過程後,過程體中的內容沒有被執行,僅僅只是被編譯。要想執行過程體中的內容,還需呼叫儲存過程。
語法
call procedure_name(【parameter 【,….】】);
或者
exec【UTE】 procedure_name(【parameter 【,….】】);
舉例
無參的簡單儲存過程
create or replace procedure insert_student2
as
begin
insert into student2 values(‘2’,’lilib’,18,’1’);
end insert_student2;
檢視前後資料的變化
in引數
1in引數是指輸入引數,由呼叫者為其賦值,也可以使用預設值,如果不為引數指定模式,預設in.
2在呼叫in引數的儲存過程時,為引數引數賦值的形式有2種
1)不指定引數名,只提供引數值,oracle會按儲存過程中引數的先後順序為引數賦值,需要保證值的個數與型別和引數的個數與型別相匹配。
2)指定引數名:這種情況可以不考慮引數的順序。procedure_name=>value.
儲存過程程式碼
create or replace procedure update_student2(no in varchar2,name in varchar2)
as
begin
update student2 set sname=name where sno=no;
end update_student2;
不指定引數名的儲存過程
call update_student2(‘1’,’aaa’);
指定引數名的儲存過程
call update_student2(name=>’bbb’,no=>’2’);
out引數
1out引數是指輸出引數,由儲存過程的語句為其賦值,返回給使用者
2如果使用者需要獲取儲存過程out引數的返回值,需要使用variable語句宣告變數接收返回值,並在呼叫過程的時候繫結變數.
variable語法
variable variable_name datatype;–宣告變數
【,….】
exec【ute】 procedure_name(:variable_name 【,….】);–呼叫過程的時候繫結變數
案例
create or replace procedure select_student2(no in varchar2,name out varchar2)
as
begin
select sname into name from student2 where sno=no;
end select_student2;
variable stu_name varchar2(20)
exec select_student2(‘1’,:stu_name);
print stu_name;
int out引數
1同時擁有int和out的特性
2既可以接收使用者的值,有允許儲存過程中修改其值,並將值放回
3不接收常量值,只能使用變數為其傳值
4為int out引數賦值:exec[ute] :變數名:=值
舉例
實現2個變數交換資料
/定義一個2變數交換資料的儲存過程/
create or replace procedure exchange(a in out number,b in out number)
as
temp number;–定義一個變數
begin
temp:=a;
a:=b;
b:=temp;
end exchange;
/定義變數/
variable a NUMBER;
variable b NUMBER;
/為變數賦值/
exec :a :=1;
exec :b :=2;
/執行儲存過程/
exec exchange(:a,:b);
/檢視/
select :a,:b from dual;
為引數設定預設值
舉例
create or replace procedure pri(a in number default 1,b in number default 1)
as
begin
dbms_output.put_line(‘a:’||a||’—-b:’||b);
end pri;
begin
pri;
pri(3);
pri(4,5);
end;