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