存储过程、函数、触发器
存储过程
实质性特定任务的子程序
优点
1、模块化
2、可重用性
3、可维护性
4、安全性
创建语法
CREATE [OR REPLACE] PROCEDURE 过程名称
[(参数列表)]
{IS|AS}
[声明变量]
BEGIN
--执行语句
[EXCEPTION]
--异常处理语句
END [过程名称]
//===============================================
CREATE OR REPLACE PROCEDURE find_emp
(emp_no NUMBER)
AS
empname VARCHER2(20)
BEGIN
--执行语句
[EXCEPTION]
--异常处理语句
END find_emp ;
使用储存过程
EXECUTE 过程名称 (参数列表);
存成过程参数模式
IN 输入模式(模式)
OUT 输出模式
IN OUT 输入输出模式
1、IN是默认模式
2、OUT、IN OUT模式在返回到调用环境前赋值
3、在参数列表中不能给OUT、IN OUT赋值
存储过程的授权
执行权、调试权
只授权
GRANT EXECUTE ON 过程名 TO 用户名
授权并授权授权的权限
GRANT EXECUTE ON 过程名 TO 用户名 WITH GRANT OPTION
程序块的跟踪和调试
PL/SQL developor环境下
SHOW ERREORS 查看某个程序块是否有错误
语法SHOW ERREORS [程序块的类型,名称]
类型:FUNCTION | PROCEDURE | PACKEAGE | PACKAGE BODY | TRIGGER | VIEW | TYPE | TYPE BODY | DIMENSION | JAVA SOURCE |JAVA CLASS}
developor环境下的调试
调试窗口
FILE——NEW——TEST WINDOE
窗口页签
Test script 测试代码
DSMS OutPut 打印输出
statistics 统计表
窗口图表
第一个: 调试
第二个: 执行
第三四个: 单步调试
第五六个: 跳出
调试步骤
1、设置断点
2、写入测试代码
3、输入想显示的变量,查看值
4、按执行或逐步进入断点处
自主事务
自主事务是由另一个事务处理启动的独立的事务处理。
解决问题
在调用存储过程时,一个过程的更改对这两个
过程都可见,任何提交或回退都会影响这两个
标记为自主事务
在CREATE之中,写入编译指使PRACMA AUTONOMOUS_TRANSACTION;
函数
用于返回特定数据的PL/SQL程序块,必须有一个返回值
创建语法
CREATE [OR REPLACE] FUNCTION 函数名称
[(参数列表)]
RETURN datatype
IS|AS
BEGIN
语句块(必须含有RERTUN)
END;
//===================实例======================
CREATE OR REPLACE FUNCTION 函数名称
RERTUN VARCHAR2
IS
BEGIN
RETURN ‘asd‘
END;
调用语法
无参的:直接用函数名
有参数:函数名(参数列表)
与过程的区别
存储过程 函数
调用 作为PLSQL语句执行 作为表达是一部分
RETURN 不包含,有也不用于 必须包含
返回
程序包
是一种数据库对象,是对相关PL/SQL、子程序、游标、异常
变量、常量等的封装
构成
程序包规范 声明PL/SQL、子程序、游标、异常
变量、常量
程序包主体 实现规范中定义的PL/SQL、子程序、游标、异常
变量、常量
程序包规范
应用程序的接口
创建语法
CREATE [OR REPLACE] PACKAGE 包名
IS | AS
[声明公共类型、常量、变量、异常、游标等]
[声明PLSQL子程序]
END 包名;
//==================实例================
CREATE OR REPLACE PACKAGE 包名
IS
PROCEDURE emp_proc();
FUNCTION emp_fun () RETURN VARCHER2;
[声明PLSQL子程序]
END 包名;
程序包主体
包含规范中每一个的实现
CREATE [OR REPLACE] PACKAGE BODY 包名
IS | AS
[声明常量、变量、异常、游标等]
[声明PLSQL子程序]
[BEGIN
初始化代码]
END 包名;
//===================实例===============
CREATE OR REPLACE PACKAGE BODY 包名
AS
PROCEDURE emp_proc() IS
--过程
END emp_proc
FUNCTION emp_fun() RETURN VARCHER2 IS
--函数
END emp_fun;
END 包名;
触发器
当特定事物出现时,自动执行的代码块
功能:
限制对表的修改
自动生成派生列
强制数据一致
强制复杂的完整性约束条件
提供审计和日志功能
防止无效的事务逻辑
启用复杂的业务逻辑
语法
CREATE [OR REPLACE] TRIGGER 触发器名
--以上表示之前、之后、代替原操作
{BEFORE | AFTER | INSREAD OF}
--指定构成触发器的数据库操作类型,UPDATE可以指定列
{INSERT | DELETE | UPDATE [OF 修改的列的列表]}
[OR {INSERT | DELETE | UPDATE [OF column[, column]]}]
--创建触发器的表或视图
ON [schema.]
--指定新行和旧行的其他名称,默认NEW和OLD
[PEFERENCINC [NEW AS new_row_name] [OLD AS old_row_name] ]
--是否对每行执行触发
[FOR EACH ROW]
--限制执行条件
[WHEN (condition)]
[DECLARE
定义]
BEGIN
PLSQL块
[EXCEPTION
异常处理]
END 触发器名
//==============实例======================
CREATE OR REPLACE TRIGGER 触发器名
BEFORE
INSERT OR UPDATE OF position
ON 表名
FOR EACH ROW
WHEN ( New.positon <> 5 )
BEGIN
PLSQL块
END 触发器名
分析
触发器语句
是可以导致触发器发生的事件
INSERT OR UPDATE OF position
ON 表名
FOR EACH ROW
触发器限制
当条件值为真才运行触发器
WHEN ( New.positon <> 5 )
触发器操作
触发器中的SQL语句和代码
BEGIN
PLSQL块
END 过程名
类型
行级触发器
对DML语句影响的每一行都执行一次
使用: [FOR EACH ROW]字句
可以使用OLD和NEW访问修改先后的数据
语句级触发器
对每个DML语句执行一次
使用: 是默认类型
INSTEAD OF触发器
在视图上创建的触发器
用于替换所使用的实际语句的触发器
模式触发器
用户事件触发器
DDL语句的触发器
数据库触发器
创建在数据库上的触发器
状态
DISABLED 非启用状态
ENABLED 启用状态
改变方式
ALTER TRIGGER 触发器名 {ENABLE | DISABLE}
删除触发器
DROP TRIGGER 触发器名称
查看
用户字典视图
DESC USER_TRIGGERS