ORACLE学习12:存储过程procedure

1.概述

存储过程也是一种PL/SQL块,是存入数据库的PL/SQL块
但存储过程不同于已经普通的PL/SQL程序,我们通常把PL/SQL程序称为无名块,而存储过程是以命名的方式存储于数据库中的。
因此,我们可以这样理解,为PLSQL程序块起个名字,不用每次都编译,可以直接调用,就是存储过程。

2.存储过程优点

和PL/SQL程序相比,存储过程有很多优点,具体归纳:
1. 与数据库关联。存储过程的代码保存在数据库中而非本地,用户可在任何登陆的客户机上调用修改该存储过程。
2. 代码复用性。存储过程的信息写入数据字典,因此是一个公用模块,我们可以通过两外的存储过程和函数调用已经存在的存储过程。
但是,存储过程不能调用PLSQL程序块。
3. 存储过程支持传递参数,并支持返回值。
4. 存储过程需要进行编译。编译不通过仍然可以创建,但是通过PLSQL developer等工具会有警告。
5. 安全性。存储过程可由数据库提供安全保证,要想使用存储过程,需要有存储过程和函数的所有者的授权,只有被授权的用户或创建者本身才能执行存储过程或调用函数。

3.创建存储过程

存储过程create or replace procedure p is相当于PLSQL中的declare,其余都和PLSQL基本一致。

CREATE [OR REPLACE] PROCEDURE 存储过程名[(参数[IN|OUT|IN OUT] 数据类型...)]

{AS|IS}

[说明部分]

BEGIN

可执行部分

[EXCEPTION

错误处理部分]

END [过程名];

3.1存储过程三种参数类型

存储过程可以传入参数,支持三种参数类型:

  • 传入参数:in或者不写;
  • 传出参数:out,类似于返回值return。
  • 传入传出参数: in out 既是传入又是传出。
    这里需要理解,存储过程的参数都是存储过程和调用环境的交互。

3.1创建简单存储过程

create or replace procedure p(v_in in number, v_out out number, v_v number, v_io in out number)
is 
begin
    if(v_in>v_v) then 
        v_out := v_in;
    else
        v_out := v_v;
    end if;
    v_io := v_io + 1;
end;
/

这里需要注意的是,如果存储过程中出现语法错误,仍然会创建。

3.2执行存储过程

存储过程有两种执行方式:
方式一:通过exec关键字执行。

exec p;

方式二:通过PLSQL块执行。

begin 
    p; 
end;

因此基于方法二,我们可以通过存储过程调用存储过程,也可以通过PLSQL块调用存储过程,还可以通过JOB周期性调用存储过程。

如下,我们通过PLSQL块调用上述创建的存储过程。

set serveroutput on;

declare
    v_in number := 10;
    v_v number := 20;
    v_io number := 30;
    v_out number;
begin
    p(v_in, v_out, v_v, v_io);
    dbms_output.put_line(v_out);
    dbms_output.put_line(v_io);
end;
/

3.3删除存储过程

直接通过dorp关键字。

drop procedure p;

猜你喜欢

转载自blog.csdn.net/qq_36743482/article/details/79390324