PL/SQL-04

过程、函数与包
过程、函数与包都属于PL/SQL语句块的命名块,过程和函数统称为子程序。
过程和函数非常相似,具有如下特点:
1、都具有名称,可以接收传入或者传出参数
2、都具有声明部分,执行部分,异常处理部分
3、在使用前会被编译并存储到数据库中
4、函数和过程的最大区别在于函数具有返回值,而过程没有


create or replace procedure addempsalary ( p_ratio number , p_empno number )
as
begin
  if p_ratio > 0
  then
 update scott.emp set sal = sal * ( 1 + p_ratio) where empno = p_empno ;
  end if;
  dbms_output.put_line(‘加薪成功!‘);
end ;

包是一个逻辑单位,PL/SQL可以让开发人员把逻辑相关的类型、变量、游标和子程序放在一个包内,这样更加清楚,易于理解

包规范部分:包规范部分定义了应用程序的接口,他声明了变量、常量、类型、异常、游标等。
包体部分:包体部分用于实现包规范部分声明的子程序和游标。
包规范的建立使用 create package 语句 , 包体的建立使用create package body语句。

 

/* 包规范定义 */
create or replace package empsalary
as
--执行实际的加薪动作
procedure addempsalary (p_ratio number , p_empno number ) ;
--使用if-elsif 语句得到加薪比例
function change_sal (p_job varchar2) return number ;
--使用case 语句得到加薪比率
function getaddsalaryratiocase (p_job varchar2) return number ;
end empsalary ;

/* 包体定义 */

create or replace package body empsalary
as
 --过程加薪
 procedure addempsalary ( p_ratio number , p_empno number )
 as
 begin
   if p_ratio > 0
   then
  update scott.emp set sal = sal * ( 1 + p_ratio) where empno = p_empno ;
   end if;
   dbms_output.put_line(‘加薪成功!‘);
 end ;
 --使用if-elsif 语句得到加薪比例
 function change_sal (p_job varchar2)
 return number
 as v_result number(7,2) ;
 begin
 if  p_job = ‘CLERK‘ then v_result := 0.1 ;
 elsif p_job = ‘SALESMAN‘ then v_result := 0.15 ;
 elsif p_job = ‘MANAGER‘ then v_result := 0.2 ;
 end if;
 return v_result ;
 end;

 --使用case 语句得到加薪比率

 function getaddsalaryratiocase ( p_job varchar2 ) return number
 as v_result number (7,2) ;
 begin
  case p_job
   when ‘CLERK‘ then v_result := 0.10 ;
   when ‘SALESMAN‘ then v_result := 0.15 ;
   when ‘MANAGER‘ then v_result := 0.20 ;
  end case ;
  return v_result;
  exception when others
  then dbms_output.put_line(‘产生异常:‘);
  
 end ;
end empsalary;

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。