数据库程序设计5 存储概述

目录

子程序

存储过程

过程

创建过程

过程的参数

参数传递方法

默认参数

异常处理

过程的删除

过程的权限


子程序

命名的PL/SQL块,能够接受传递的参数,能够被调用。

子程序的类型:

  • 过程:用于执行某项操作
  • 函数:用于执行某项操作并返回值

基于标准的PL/ SQL块结构

  • 声明部分
  • 可执行部分
  • 异常部分(可选)

存储过程

  • 命名的PL/SQL块
  • 能够接受参数
  • 能够被重复调用
  • 用于执行某项操作
  • 存储在数据库中

过程

创建过程

语法:

CREATE [OR REPLACE] PROCEDURE procedure name
[(parameter1 [mode1] datatype1,
parameter2 [mode2] datatype2,
...)]
IS|AS
PL/ SQL Block;

参数:和外界打交道的

mode模式有三种:输入,输出,既能输入又能输出(可省略,默认为输入的)

数据类型

过程的参数

IN参数

例子:

CREATE OR REPLACE PROCEDURE raise_ salary
    (p_ jid    IN emp. empno%TYPE)
IS
BEGIN
    UPDATE emp
    SET sal = sal* 1.10
    WHERE empno= P_ jid;
END raise_ salary;

OUT参数

CREATE OR REPLACE PROCEDURE raise_ sal
    (p_ id    IN emp.empno%type,
    P_ name    OUT varchar2,
    p_ _sal    OUT number)
IS
BEGIN
    SELECT sal,ename
    INTO p_ sal,p_ name
    FROM emp
    WHERE empno= p_ _id; 
END raise_ _sal; 

在调用的时候

DECLARE
    V_ sal    emp.sal%type;
    V_ name    emp.ename%type; 
BEGIN
    raise_ sal(7369, V_ name, V_ sal);
    dbms_ output. put line('雇员:'||v_ name || '的薪水是'||v_ sal);
END;

这样在参数中可以接收返回的值。 

IN OUT参数

CREATE OR REPLACE PROCEDURE raise sal
    (p_ id IN    emp. empno%type,
    P_ name OUT    varchar2,
    p_ sal IN OUT number)
IS
BEGIN
    UPDATE emp
    SET sal=sal+p__sal
    WHERE empno=p_ id; 
    SELECT sal,ename into p_ sal,p_ name
    FROM emp
    WHERE empno= p_ id;
END raise_ sal;

调用示例

DECLARE 
    V_ sal    emp.sal%type := 500;
    V_ name emp.ename%type;
BEGIN
    raise_ sal(7369, V_ name, V_ sal);
    dbms_ output.put_ line('雇员:'||v_ name||'的薪水是'||v_ sal);
END;

既然能输入能输出,就应该传一个已经初始化的变量。

参数传递方法

三种参数传递方法:

  • 位置:实际参数与形式参数排列的顺序相同
  • 指定:实际参数联合其相应的形式参数以任意顺序排列
  • 组合:实际参数的排列- -些用位置,一些用指定

位置法:实参与形参顺序相同,顺序不同会报错

指定法:形参名字=>实参名字

get_ annual income(P_ empho=>7369,P_ ann_ sal=>v_ ann_ sal)

这样就可以不考虑顺序了

组合法是两种的综合

get_ annual_ income(P_ empno=>7369,V_ ann sal);//错误
get_ annual_ income(V_ ann sal,P_ empno=>7369) ;//正确

前面有按照名字的位置就已经不准确了,所以要先按照位置再按照名字。

默认参数

可以传递一个默认参数。只有in out类型的才能传默认参数。

p empno in emp.empno %TYPE DEFAULT 7369

在传参时要注意,带默认值的参数只给一个是不行的(例如第一个参数带默认值第二个不带),造成歧义。应该采用=>符号进行赋值。

如果还想用位置法赋值,应该将带默认参数的放在参数列表后面。

异常处理

如上图,过程2出错,进入异常处理,返回程序1的正常流程中(因为有异常处理,程序1理解为程序2正常执行)。

如上图,过程2出错没有进行异常处理,程序1理解为自己的一句语句发生了错误,程序终止。

过程的删除

语法:

DROP PROCEDURE procedure name

例子:

DROP PROCEDURE raise_sal

注意:存储过程的删除无法回滚

过程的权限

授权访问数据:

过程默认所有者权限执行。

所有者权限和调用者权限区别?

调用者权限在创建过程的时候要加一句话:

AUTHID CURRENT USER

简单来说,对于所有者权限,要是在另外一个用户下访问emp表数据,是不可以的;但是如果授权访问存储过程,那么是可以进行访问的。

对于调用者权限,要是在另外一个用户下访问emp表数据,是不可以的;如果授权访问存储过程,也是不可以进行访问的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章