天天看点

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;