– 待编辑版
本文参考:
- Oracle Database concepts guide(11g2) By Thomas Kyte
- Stored Procedure Wiki
闲言:开始实习的时候才发现,虽然大学上过了数据库的课程,也算是系统的学习了数据库知识,但是偏偏就对常常听到的名词存储过程不是那么熟悉。 百度上搜索“存储过程”的教程, 虽然官方文档和书籍是最好的学习材料, 但是如果能有入门博文快速地带领新手快速建立一些大致的概念与学习思路,想来还是有益处的。
先修知识:
什么是存储过程(Stored Procedure):
存储过程的好处:
- 性能提升
- 开发维护的效率提升
- 数据完整性与一致性
- 安全性
- 存储过程可以以定义者的权限执行,而不是使用者的权限执行。为普通用户执行敏感操作提供了一种有效的方法。
- 举例: 假如某个应用程序要向用户提供修改密码的功能,而不同用户的用户名和密码都存储在一张User表中。
- 如果,如果不使用存储过程, 该应用程序在访问数据库时, 必须已具有操作“User”表权限的用户身份去连接数据库。此时如果程序员编写的代码出错,或者程序员想恶意修改别人的password,则数据库User表的安全无法保证。
- 如果使用存储过程,则可以定义一个具有修改User表权限的存储过程changePassword(username,oldPassword,newPassword),该存储过程实现了严格的校验逻辑,即首先检查useranme,oldpassword是否匹配, 如果匹配, 则仅仅修改username所对应的password。
- 存储也可以以调用者的权限执行,而不是定义者的权限执行,为不同权限的用户,在调用同一个存储过程时,依旧能区分权限提供了可能。
- 存储过程可以以定义者的权限执行,而不是使用者的权限执行。为普通用户执行敏感操作提供了一种有效的方法。
- 性能提升
存储过程的缺点:
以PL/sql为例的存储过程编写
- PL/sql Subprogram(子程序)的创建
CREATE PROCEDURE hire_employees (p_last_name VARCHAR2,p_job_id VARCHAR2,p_manager_id NUMBER,p_hire_date DATE,p_salary NUMBER,p_commission_pct NUMBER,p_department_id NUMBER) IS BEGIN . INSERT INTO employees (employee_id,last_name,job_id,manager_id,hire_date,salary,commission_pct,department_id) VALUES (emp_sequence.NEXTVAL,p_last_name,p_job_id,p_manager_id,p_hire_date,p_salary,p_commission_pct,p_department_id);
.
.
END;
图中的PL/sql engine 是用来定义,编译,执行PL/sql语句集的组件单元。 当数据库调用存储过程时, 数据库会将经过编译的PL/sql语句集加载到系统全局区(system global area,SGA) 共享池(shared pool)中 。 (这里不对该概念作赘述,可暂且简单理解为一片内存区域)。 然后PL/sql engine会和语句执行器(statement executor)一同工作,来处理存储过程中的语句。
总结: 存储过程思想上很简单,就是数据库sql语言层面的代码封装与重用。 所以广义上来说, 只要是被存储在数据库,可供外部直接调用以修改数据的子程序(包括函数和过程)都可以被看做是存储过程。