PL/SQL学习笔记-6

PL/SQL学习笔记-6

第11-12章

[@more@]


第11章 数据库触发器
11.1 触发器的类型
1. DML触发器
2. Instead-Of触发器 只可以定义为视图(关系型或是对象的)的触发器。
3. 系统触发器

11.2 创建触发器
CREATE [OR REPLACE] TRIGGER trigger_name
{BEFORE | AFTER | INSTEAD OF} triggering_event
[referencing_clause]
[WHEN trigger_condition]
[FOR EACH ROW]
trigger_body;

触发器体不能超过32K。
触发器总共有12种可能的类型,即:3个语句*2个计时*2个级别

伪代码
触发语句 :old :new
INSERT NULL 当语句完成时,将要被插入的值
UPDATE 更新前的原始值 当语句完成时,将要被插入的值
DELETE 行被删除前的原始值 NULL

REFERENCING [OLD AS old_name] [NEW AS new_name]
可以用REFERENCING子句来为:old和:new指定不同的名称。
WHEN子句只对行级别有效。
在触发器里面有INSERT、UPDATE和DELETE三个布尔函数可以用来确定操作是什么。

Instead-of触发器
该触发器用于以下两种情况:
1. 允许修改一个本来不可修改的视图。
2. 修改视图中某嵌套表列的列。
所有的Instead-of触发器都是针对行级别的。

创建系统触发器
CREATE [OR REPLACE] TRIGGER [schema.]trigger_name
{BEFORE |AFTER}
{ddl_event_list|database_event_list}
ON {DATABASE | [schema.]SCHEMA}
[when_clause]
trigger_body;
ddl_event_list是一个或者多个DDL事件(用OR分开)
database_event_list是一个或者多个数据库事件(用OR分开)
系统触发器没有instead-of触发器。truncate没有数据库事件。
STARTUP AFTER
SHUTDOWN BEFORE
SERVERERROR AFTER
LOGON AFTER
LOGOFF BEFORE
CREATE BEFORE,AFTER
DROP BEFORE,AFTER
ALTER BEFORE,AFTER
系统触发器可以在数据库级别或模式级别进行定义。
STARTUP和SHUTDOWN触发器只在数据库级别上市相关的。
在系统触发器中可以使用的属性函数
SYSEVENT、INSTANCE_NUM、DATABASE_NAME、SERVER_ERROR、IS_SERVERERROR、LOGIN_USER、DICTIONARY_OBJ_TYPE、
DICTIONARY_OBJ_NAME、DICTIONARY_OBJ_OWNERDES_ENCRYPTED_PASSWORD

触发器的限制:
* 触发器不可以发出任何事务控制语句:COMMIT、ROLLBACK、SAVEPOINT或SETTRANSACTION。
* 触发器调用的存储过程也都不能发出任何事务控制语句。(除非它们被声明为自治的)
* 触发器不能声明所有LONG或LONG RAW变量。
* 在Oralce8以上版本中,触发器可以引用和使用LOB和对象列,但是不能修改。

触发器的源代码存储在user_triggers中。
DROP TRIGGER triggername;
ALTER TRIGGER triggername {DISABLE|ENABLE};
可以使用ENABLE ALL TRIGGERS或DISABLE ALL TRIGGERS子句,禁用或启用指定表的所有触发器。

11.3 变异表
触发器体中的SQL语句不可以:
* 读取或修改任何触发语句的变异表。
* 读取或修改触发表的一个约束表的primary、unique或foreign关键字的列。
这些限制适合用于所有行级别的触发器。

第12章 高级特性
12.1 语言特性
1.外部例程
C外部例程
(1)编写C函数,编译进文件系统中的共享库。例如写了一个函数sendMail编译到 /libs/libmail.so
(2)创建库对象 create or replace library SendMailLibrary as '/libs/libmail.so'
(3)创建过程能 create or replace procedure SendMailC(p_subject IN VARCHAR2,p_message IN VARCHAR2)
AS EXTERNAL
LIBRARY SendMailLibrary
NAME "sendMail"
PARAMETERS(p_subject STRING,p_message STRING)
服务器会调用一个extproc的进程来执行。
Java外部例程
(1) 编写一个java类
(2) create or replace procedure SendMailJava(p_subject IN VARCHAR2,p_message IN VARCHAR2)
AS LANGUAGE JAVA
NAME 'sendMail.send(java.lang.String,java.lang.String)';
2.动态SQL
execute immediate 可以执行 DDL、DML和匿名PL/SQL语句块。
execute immediate 还可以用来执行带有绑定变量的语句。
execute immediate 'insert into test values(:id)' USING 1;
3.成批绑定
FORALL v_Count IN 1..100 [SAVE EXCEPTION]
....
当碰到错误的时候,立即会返回,而当前的SQL会被回滚,但是之前的SQL全部执行成功。
SAVE EXCEPTION 可以让程序在碰到错误的时候保存错误信息,然后继续往后执行。
SQL%BULK_EXCEPTIONS.COUNT 错误的个数
SQL%BULK_EXCEPTIONS(v_count).error_index 出错的索引数
SQL%BULK_EXCEPTIONS(v_count).error_code 出错的错误号
SQLERRM(0-SQL%BULK_EXCEPTIONS(v_count).error_code) 显示错误信息

BULK COLLECT子句
SELECT num_col,char_col BULK COLLECT INTO v_Numbers,v_Strings FROM temp_tarble
OPEN c_char; FETCH c_char BULK COLLECT INTO v_String2; CLOSE c_char;
DELETE FROM temp_table WHERE num_col=v_number RETURNING char_col BULK COLLECT INTO v_Strings;

4.对象类型
CREATE OR REPLACE TYPE Point AS OBJECT{
x NUMBER,
y NUMBER,
MEMBER FUNCTION ToString RETURN VARCHAR2,
MEMBER FUNCTION Distance(p IN Point DEFAULT Point(0,0)) RETURN NUMBER
}

CREATE TABLE point_object_tabl OF Point;
CREATE TABLE point_column_tab ( key VARCHAR2(20),value Point);
将返回结果作为一个对象(而不是单个列),你必须使用VALUE操作符。

5.大对象
CLOB CNLOB BLOB BFILE
当大对象不超过4000个字节的时候,可以直接操作,否则必须要使用专用的接口来操作了。

6.管道化表函数
CREATE OR REPLACE FUNCTION PipelineMe RETURN MyTypeList PIPELINED AS
v_MyType MyType;
BEGIN
FOR v_count IN 1..20 LOOP
v_MyType := ...
PIPE ROW(v_MyType);
END LOOP;
END PipelineMe;

12.2 高级包
DBMS_SQL
DBMS_PIPE
DBMS_ALERT
UTL_FILE
UTL_TCP
UTL_SMTP
UTL_HTTP
UTL_INADDR
DBMS_JOB
DBMS_LOB

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/133835/viewspace-923337/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/133835/viewspace-923337/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。 经导师精心指导并认可、获 98 分的毕业设计项目!【项目资源】:微信小程序。【项目说明】:聚焦计算机相关专业毕设及实战操练,可作课程设计与期末大作业,含全部源码,能直用于毕设,经严格调试,运行有保障!【项目服务】:有任何使用上的问题,欢迎随时与博主沟通,博主会及时解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值