过程一般用于执行一个指定的操作,可以将常用的特定操作封装成过程
格式:create or replace procedure 过程名 (argument1 [mode1] datatype1, argument2 [mode2] datatype2, ...)
is[as] 声明部分
begin 执行部分
exception 异常处理部分
end;
对于过程调用有三种方式:
- call 过程名();
- exec 过程名;
- begin
过程名;
end;
对于前两种区别在于:第一可以带参数,第二不可以;
过程分为有参和无参两种;
无参相对比较简单,
例如:创建一个无参过程,将每位员工工资上涨1000元
CREATE or replace procedure pro_emp as
begin
update emp set sal=sal+1000;
end;
调用我们有三种方法
--方法一
call pro_emp;
--方法二
exec pro_emp;
--方法三
begin
pro_emp;
end;
有参相对比较难一点;
- 带有IN参数 :当为过程定义参数时,如果不指定参数模式,则默认为输入参数, in可以省略
- 带有OUT参数 :过程不仅可以用于执行特定操作,还可以用于输出数据
- 带有IN OUT参数 :称为输入输出参数
例如:根据输入的员工编号输出该员工的工资
--1,in输入参数
create or replace procedure pro_empno_sal(v_empno in emp.empno%type)
as v_sal emp.sal%type;
begin
select sal into v_sal from emp where empno=v_empno;
dbms_output.put_line('该员工的工资为:'||v_sal);
exception
when no_data_found then
dbms_output.put_line('没有找到该员工');
end;
/*执行*/
call pro_empno_sal(7369);
--2,out输出参数
create or replace procedure pro_fanhui_sal(v_empno in emp.empno%type , v_sal out emp.sal%type)
is
begin
select sal into v_sal from emp where empno= v_empno;
exception
when no_data_found then
dbms_output.put_line('没有找到该员工');
end;
/*执行*/
declare
v_sal emp.sal%type;
begin
pro_fanhui_sal(&no,v_sal);
dbms_output.put_line('该员工的工资为:'||v_sal);
end;
--3,in out 输入输出参数
create or replace procedure pro_inout_sal(param_num in out number)
as
begin
select sal into param_num from emp where empno=param_num;
dbms_output.put_line('该员工的工资为:'||param_num);
exception
when no_data_found then
dbms_output.put_line('没有找到该员工');
end;
/*执行*/
declare
inout_num number:=&no;
begin
pro_inout_sal(inout_num);
end;
注:&no 是由键盘输入;
最后对于过程还有多参传递
- 位置传递 :按位置传递是指在调用时按参数的排列顺序依次写出实参的名称,将形参与实参关联起来进行传递
Eg: call pro_dept(80,'科研部','郑州'); - 名称传递 :按名称传递是指在调用时按照形参与实参的名称写出实参所对应的形参,将形参与实参关联起来进行传递
Eg:call pro_emp(v_deptno=>80,v_loc=>'郑州',v_dname=>'科研部'); - 组合传递 :可以将按位置传递、按名称传递两种方法在同一调用中混合使用
Eg:call pro_emp(80,v_loc=>'郑州',v_dname=>'科研部');