创建存储过程:

存储过程

-- 定义:

    在大型数据库中,存储过程是一组为了完成特定功能的SQL语句集。

    存储在数据库中,经过第一次编译后再次调用,不需要再次编译,用户通过指定存储过程的名字并给出参数来执行它(如果该存储过程有参数)。

    存储过程大大的提高了SQL语句的功能和灵活性。

-- 创建存储过程:

create procedure 过程名(参数 参数数据类型) is/as
    声明变量
begin
    过程体
end 过程名;

-- 修改存储过程:

create or replace procedure 过程名 ……

    在 create 后面加上 or replace

-- 删除存储过程:

drop procedure 过程名;

-- 不带参数的存储过程:

Ex1:创建一个简单的存储过程pro_1,调用该过程时,将emp表中的empno为7369的员工的ename修改为CANDY。

create procedure pro_1 as
begin
  update emp set ename = 'CANDY' where empno = 7369;
end pro_1;

-- 过程创建好后,过程体中的内容并没有执行,仅仅只是被编译,需要调用该过程。

-- 调用过程的两种形式:execute / call

exec pro_1;

或者:

call pro_1();

-- 带参数的存储过程:

-- 过程的参数分为 in参数 和 out参数 和 in out参数

-- in参数,输入参数。在调用的时候要传入一个值。

   如果在定义的时候没有说明参数类型,则默认为in参数

-- out参数,输出参数。调用完之后输出结果。

-- in out参数,同时拥有in参数和out参数的特性,既能接受用户的传值,又允许在过程体中修改其值,并可以将值返回。

   但是它不接受常量值,只能使用变量为其传值。

-- in参数:

Ex2:创建带in参数的存储过程pro_2,为该过程设置两个in参数,分别用于接受用户提供的empno和ename。

         并且调用pro_2,通过该过程将empno为7369的员工的ename修改为ELLA。

create procedure pro_2(emp_no in number,emp_name in VARCHAR2) is
begin
  update emp set ename = emp_name where empno = emp_no;
end pro_2;

-- 赋值的形式主要有以下两种:

-- 不指定参数名:

exec pro_2(6500,'ELLA'); 

-- 指定参数名:

exec pro_2(emp_name => 'ELLA',emp_no => 7369);

-- out参数:

Ex3:创建存储过程pro_3,为该过程设置一个in参数和一个out参数,其中in参数接受用户提供的empno,然后在该过程体中将empno对应的ename值传递给out参数。

         调用存储过程pro_3,为其in参数赋值为7369,并声明变量emp_name接受与输出其out参数的返回值。

create procedure pro_3(emp_no in number,emp_name out VARCHAR2)is
begin
  select ename into emp_name from emp where empno = emp_no;
end pro_3;

 调用存储过程pro_3

VARIABLE emp_name VARCHAR2(10);
exec pro_3(7369,:emp_name);
print emp_name;

-- 注: 调用存储过程,如果需要显示该过程中out参数的返回值,还需要实现使用variable语句声明对应的变量接受返回值,并在调用过程中绑定该变量。

-- 注:在execute语句中绑定变量时,需要在变量名前添加冒号(:)

-- in out参数:

Ex4:创建存储过程pro_4,通过该过程交换两个变量(n1 / n2)中的值。

         调用pro_4过程,调用前声明为in out参数赋值的变量,调用后使用select语句输出交换值后的结果。

create procedure pro_4(n1 in out number,n2 in out number)is
temp1 number;
temp2 number;
begin
  temp1 := n1;
  temp2 := n2;
  n1 := temp2;
  n2 := temp1;
end pro_4;

  调用pro_4过程:

variable n1 number;
variable n2 number;
exec :n1 :=1111;
exec :n2 :=9999;
exec pro_4(:n1,:n2);

-- 注:使用execute命令可以为变量赋值,要在变量名前添加冒号(:)

猜你喜欢

转载自novem.iteye.com/blog/2361297
今日推荐