天天看點

Oracle資料庫:PL/SQL中的存儲過程與函數

一、存儲過程與函數概述

關于存儲過程與函數概述,包含一下知識點:

1、PL/SQL塊分類

(1)、PL/SQL塊:匿名塊、命名塊

匿名塊:不儲存在資料庫中,沒有名稱,不可以重複調用

命名塊:儲存在資料庫中,有名稱,可以重複調用

命名塊:存儲過程、函數、觸發器、包

2、存儲過程與函數的概念

存儲過程與函數:都是一個子程式,完成一定的功能

存儲過程:沒有傳回值,可以獨立調用

函數:必須包含一個傳回值,隻能作為表達式的一部分使用

寫一個例子,對存儲過程和函數有一個感性的認識

存儲過程:

create procedure proc1(dno number)                   
is                                                   
		cursor c is select * from emp where deptno = dno;
begin                                                
		for r in loop                                    
				dbms_output.put_line(r.name || ':' || r.sal);
		end loop;                                        
end;                                                 

           

存儲過程的調用:

begin          
		prov1(50); 
end;           
           

函數:

create function func(dno number)  
return NUMBER                     
is                                
	v_max number;                   
begin                             
	select max(sal) into v_max      
	from emp                        
	where deptno = dno;             
	return v_max;                   
end;                              
           

函數的調用:

declare                             
		v_maxsal number;                
begin                               
		v_maxsal := func(10);           
		dbms_output.put_line(v_maxsal); 
		                                
		dbms_output.putline(func(20));  
end;                               
           

二、存儲過程與函數的建立

關于存儲過程與函數建立,包含以下知識點。

1、存儲過程的建立

存儲過程的建立格式:

CREATE PROCEDURE PROC[(name [IN|OUT|INOUT] type, ... )]   
AS | IS                                                   
		declare statement;                                    
BEGIN                                                     
		statement;                                            
EXCEPTION                                                 
		exception process;                                    
END;                                                     
           

參數為IN類型(隻可讀取參數的值,是不能把參數值傳遞給外部調用環境的)

create or REPLACE procin(dno in number) 
is                                      
	v_maxsal number;                      
begin                                   
	select max(sal) into v_maxsal         
	from emp                              
	where deptno = dno;                   
	dbms_output.put_line(v_maxsal);       
end;    

調用
begin         
	procin(10); 
end;                                          
           

參數為OUT類型(隻可寫參數的值到外部調用環境,不可讀取外部的參數值)

create or REPLACE procin(dno in number ,maxx out number)               
is                                                                      
	v_maxsal number;                                                       
begin                                                                   
	select max(sal) into v_maxsal                                          
	from emp                                                               
	where deptno = dno;                                                    
	maxx := v_maxsal;                                                      
	dbms_output.put_line(v_maxsal);                                        
end;                                                                    
                                                                        
調用:                                                                  
declare                                                                 
		v_sal number := 0 ;                                                  
begin                                                                   
		procin(10,v_sal);                                                    
		dbms_output.put_line(v_sal);                                         
end;                                                                   
           

2、函數的建立

函數的建立格式

CREATE FUNCTION func[(name [IN|OUT|INTOUT] type, ...)]     
RETURN retutn_type                                         
AS | IS                                                    
			declare statement;                                   
BEGIN                                                      
			statement;                                           
EXCEPTION                                                  
			exception process;                                   
END;                                                       

           

示例

create function addtwonumber(no1 number , no2 number)  
return NUMBER                                          
is                                                     
	v_result NUMBER;                                     
begin                                                  
  v_result := no1 + no2;                               
  return v_result;                                     
end;                                                   
                                                       
執行函數:                                             
begin                                                  
	dbms_output.put_line(addtwonumber(10,20));           
end;                                                  
           

三、存儲過程與函數的調用和删除

關于存儲過程與函數的調用與删除,包含以下知識點

1、存儲過程的調用

1、PL/SQL塊:               
		proc[(arg1,...)];     
2、SQL Plus環境:            
		BEGIN                 
				proc[(arg1,...)]; 
		END;                  
           

2、函數的調用

1、PL/SQL塊:                             
			variable :=func[(arg1,...)];      
			                                  
		  示例:                            
		  		declare                       
		  			v_no number                 
		  		begin                         
		  			v_no := addtwonumber(10,20);
		  			dbms_output.putline(v_no);  
		  		end;                          
		  		                              
2、SQL Plus環境:                         
			使用形式與其他SQL中函數相同       
           

3、删除存儲過程

DROP PROCEDURE proc_name;
           

4、删除函數

DROP FUNCTION func_name;