oracle从入门到精通(PDF格式)-第20部分
按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
在 CREATE PROCEDURE 的最后添加。
查看信息:
user_objects;
user_source;
user_errors;
第 91 页,共 106 页
…………………………………………………………Page 92……………………………………………………………
资源来自网络,仅供学习! Oracle 从入门到精通
query_emp;对过程的描述。
6、包(package)
一组相关类型的变量,常量,游标,存储过程,函数的集合。
1。组成:
包头:声明部分;只声明PUBLIC PROCEDURE/VARIABLE;
包体:程序实体,包含 PRIVATE PROCEDURE/VARIABLE 、PUBLIC PROCEDURE/VARIABLE 和 LOCAL
VARIABLE;
包头没有包体是可以独立存在的。
包头:
CREATE 'OR REPLACE' PACKAGE package_name
IS
public_type
PROCEDURE procdeure_name (parameter。。。。 );
END package_name;
包体:
CREATE 'OR REPLACE' PACKAGE BODY package_name
IS
private type and item declarations
subprogram bodies
end package_name;
2。构建没有包头的包:
为了在整个会话中的全局变量设计。
如果其他会话访问的话,和定义时候的回话得到的包的值有可能是不一样的。
包体的部分可以通过 WRAP 程序加密。
只有局部过程和被打包的过程才能 OVERLOAD(重载)。
前项声明:
将过程或函数的名称和参数放在包体的头部声明;
建立一次性的过程:
就是在包体中插入了一个匿名块,在包体执行的时候,该匿名块一定会先执行一次该匿名块,
然后再执行包体中的其他部分。
3。SQL中使用包函数的限制
函数中不能包含影响当前事务的语句;
如果在对表 T 进行DML 语句操作调用函数 F,该函数 F 不能对编辑表 T 进行查询;
包中变量的稳定性:
PUBLIC VARIABLE 发生改变的情况:
第 92 页,共 106 页
…………………………………………………………Page 93……………………………………………………………
资源来自网络,仅供学习! Oracle 从入门到精通
重新建立会话
符合规则
4。与开发相关的系统包:
DBMS_SQL
(1)能过生成动态的 SQL 语句;
(2)能过执行 DDL 语句;
包使用的主要步骤:
OPEN_DURSOR
PARSE
BIND_VARIABLE
EXECUTE
FETCH_ROWS
CLOSE_CURSOR
EXECUTE IMMEDIATE
EXECUTE IMMEDIATE dynamic_string
'INTO {define_variable
'; define_variable' 。。。 | record}'
'USING 'IN|OUT|IN OUT' bind_argument
'; 'IN|OUT|IN OUT' bind_argument' 。。。 ';
DBMS_DDL
ALTER_PILE(object_type;owner;object_name);强制编辑
DBMS_JOB
设置用户的任务;
在某个指定的时刻执行一定的操作;
手动强制执行;
挂起任务;
提交
删除
修改
要执行什么,可以跟语句或过程
下一次的执行时间
任务执行的时间间隔
挂起
手动强制执行
查看:
USER_JOBS;
DBMS_OUTPUT
PUT 输出多行数据
NEW_LINE 起一个新行
PUT_LINE 输出一行数据
GET_LINE 得到一行信息
GET_LINES 得到多行信息
UTL_FILE
对操作系统文件进行操作;
第 93 页,共 106 页
…………………………………………………………Page 94……………………………………………………………
资源来自网络,仅供学习! Oracle 从入门到精通
DBMS_LOB
对 LOB 对象的读和写
UTL_HTTP
可以把指定的网页的内容摘取下来
静态的 SQL语句的执行过程:
分析 PARSE
绑定 BIND
执行 EXECUTE
取操作 FETCH
用户可以通过 DML 语句对 LONG 类型的数据可以直接访问;
7、触发器
触发器:
不能直接调用,必须得事件触发,一般情况下是与对象、数据库和方案有关。
1。 数据库触发器
2。 应用触发器
当一个操作与另一个操作有密切关系的时候;
触发器不要太大,如果代码量大,要把触发器放到一个可执行的存储过程中;
不要在一个对象上建立太多的触发器;
3。 表触发器
BEFORE 做数据校验
AFTER 在操作以后对操作和数据进行记录
4。 视图触发器
INSTEAD OF 对视图的操作替换成对视图的基表的操作
5。 行级触发器
对多行的操作,每操作一行都会触发触发器。
6。 语句级触发器
当一条语句执行的时候触发,执行一次触发一次,与操作的行数无关。
WHEN CLAUSE 触发器执行条件
1。语句级:
CREATE 'OR REPLACE' TRIGGER trigger_name
timing(before/after)
event1 'or event2 or event3' ON table_name
trigger_body
在同一个方案下不允许重名。
CREATE OR REPLACE TRIGGER secure_emp
BEFORE INSERT OR UPDATE OR DELETE ON employees
BEGIN
IF (TO_CHAR (SYSDATE; 'HH24') NOT BETWEEN '08' AND '12') AND DELETING
THEN
RAISE_APPLICATION_ERROR (…20502;'You may delete from EMPLOYEES table
only during business hours。');
第 94 页,共 106 页
…………………………………………………………Page 95……………………………………………………………
资源来自网络,仅供学习! Oracle 从入门到精通
ELSIF (TO_CHAR (SYSDATE; 'HH24') NOT BETWEEN '12' AND '18') AND INSERTING THEN
RAISE_APPLICATION_ERROR (…20500;'You may insert into
EMPLOYEES table only during business hours。');
ELSIF (TO_CHAR (SYSDATE; 'HH24') NOT BETWEEN '8' AND '18') AND UPDATING ('SALARY')
THEN
RAISE_APPLICATION_ERROR (…20503;'You may update
SALARY only during business hours。');
ELSE
RAISE_APPLICATION_ERROR (…20504;'You may update
EMPLOYEES table only during normal hours。');
END IF;
END;
2。行级触发器:
CREATE 'OR REPLACE' TRIGGER trigger_name
timing
event1 'OR event2 OR event3'
ON table_name
'REFERENCING OLD AS old / NEW AS new'
FOR EACH ROW
'WHEN (condition)' //执行条件
trigger_body
:OLD。字段名/:NEW。字段名 引用格式。
例:
CREATE OR REPLACE TRIGGER restrict_salary
BEFORE INSERT OR 'UPDATE OF' salary ON employees
FOR EACH ROW
WHEN (new。salary is not null) //在出发器头里,new。salary 相当与本身的变量
BEGIN
IF :NEW。salary》2*:old。salary //在TRIGGER_BODY 里,:NEW。salary 相当与一个绑
定变量
or :NEW。salary