oracle学习第八章-触发器和内置程序包PPT课件
ORACLE触发器、内置程序包教学
Oracle 第8章触发器、内置程序包1、技术目标∙应用触发器∙使用内置程序包2、什么是触发器∙触发器是当特定事件出现时自动执行的存储过程∙特定事件可以是执行更新的DML语句和DDL语句∙触发器不能被显式调用,存储过程可以显示调用触发器的功能有:∙自动生成数据∙自定义复杂的安全权限∙提供审计和日志记录∙启用复杂的业务逻辑触发器可以与特定的表或视图相关联,用于检查对表/视图所做的数据修改,当执行insert、delete、update语句时,可激活触发器代码3、如何创建触发器创建触发器的语法为:CREATE [OR REPLACE] TRIGGER trigger_name {AFTER | BEFORE | INSTEAD OF}{insert | delete | update [OF column[, column] ...]} [OR {insert | delete | update [OF column[, column] ...] }] ON[schema.]table_or_view_name[REFERENCING [NEW AS new_row_name] [OLD ASold_row_name]][FOR EACH ROW][WHEN (condition)][DECLAREvariable_declation]BEGINstatements;[EXCEPTIONexception_handlers]END [trigger_name];语法说明:AFTER | BEFORE,指在事件发生之前或之后激活触发器INSTEAD OF,表示可以执行触发器代码来代替导致触发器调用的事件insert | delete | update,指定构成触发器事件的数据操纵类型,update可指定列列表REFERENCING,指定新行(即将更新)和旧行(更新前)的其他名称,默认为NEW和OLDtable_or_view_name,指要创建触发器的表或视图的名称FOR EACH ROW,指定是否对受影响的每行都执行触发器,即行级触发器,如不使用此句,则为语句级触发器WHEN,限制执行触发器的条件,该条件可包括新旧数据值的检查DECLARE...END,一个标准的PL/SQL块使用:在Emp表创建触发器,Sql代码1.CREATE OR REPLACE TRIGGER biu_emp_deptno2.--在添加或修改deptNo字段之前触发3.BEFORE INSERT OR UPDATE OF deptNo4.ON Emp5.--行级触发器6.FOR EACH ROW7.--列deptNo的新值不等于408.WHEN (New.deptNo <> 40)9.BEGIN10.--将comm列设置为011.:m := 0;12.END;13./注意:使用SHOW ERRORS命令可查看创建触发器时出现的错误4、触发器的组成部分触发器由以下3个部分组成:触发语句,定义激活触发器的DML 事件和DDL 事件,如:BEFORE INSERT OR UPDATE OF deptNoON Emp--行级触发器FOR EACH ROW这段代码表示,当对Emp表执行insert语句或对Emp表的deptNo列执行update语句时,触发器会在受影响的每一行上执行一次触发限制,执行触发器的条件,该条件必须为真才能激活触发器,如:--列deptNo的新值不等于40,触发器会执行WHEN (New.deptNo <> 40)触发操作,一些SQL 语句和代码,在发出了触发器语句且触发限制的值为真时运行,如:BEGIN--将comm列设置为0:m := 0;END;5、触发器的类型及使用触发器有如下的类型:每种触发器的作用:使用1:应用行级触发器,Sql代码1.--创建表TEST_TRG2.CREATE TABLE TEST_TRG (ID NUMBER, NAME VARCHAR2(20));3.--创建序列SEQ_TEST4.CREATE SEQUENCE SEQ_TEST;5.--为TEST_TRG表创建行级触发器6.CREATE OR REPLACE TRIGGER BI_TEST_TRG7.--在insert(添加)或者update(修改)ID字段时触发8.BEFORE INSERT OR UPDATE OF ID9.ON TEST_TRG --指定TEST_TRG表10.FOR EACH ROW --设置为行级触发器11.--触发器语句部分12.BEGIN13.--判断是不是insert语句14.IF INSERTING THEN15.--如果是insert操作,将序列的值设置给ID列16.SELECT SEQ_TEST.NEXTVAL INTO :NEW.ID FROM DUAL;17.ELSE18.--如果不是insert操作,不能修改ID列的值19.RAISE_APPLICATION_ERROR(-20020, '不允许更新ID值!');20.END IF;21.END;22./注意:如果一个触发器由多种语句触发,可用INSERTING、UPDATING、DELETING这些关键字进行检查,对应语句类型使用2:应用语句级触发器,Sql代码1.CREATE OR REPLACE TRIGGER trgdemo2.AFTER INSERT OR UPDATE OR DELETE3.ON order_master4.BEGIN5.--根据语句类型输出信息6.IF UPDATING THEN7.DBMS_OUTPUT.PUT_LINE('已更新ORDER_MASTER中的数据');8.ELSIF DELETING THEN9.DBMS_OUTPUT.PUT_LINE('已删除ORDER_MASTER中的数据');10.ELSIF INSERTING THEN11.DBMS_OUTPUT.PUT_LINE('已在ORDER_MASTER中插入数据');12.END IF;13.END;14./注意:语句级触发器时CREATE TRIGGER命令所创建触发器的默认类型使用3:应用INSTEAD OF触发器,同时向两个表中插入值,Sql代码1.--创建视图2.CREATE VIEW ord_view AS3.SELECT order_master.orderno, order_master.ostatus,4.order_detail.qty_deld, order_detail.qty_ord5.FROM order_master, order_detail6.WHERE order_master.orderno = order_detail.orderno;7.8.--创建INSTEAD OF触发器9.CREATE OR REPLACE TRIGGER order_mast_insert10.INSTEAD OF UPDATE ON ord_view11.--为NEW关键字取别名n12.REFERENCING NEW AS n13.FOR EACH ROW14.DECLARE15.--定义游标,访问order_master表16.CURSOR ecur IS SELECT * FROM order_master17.WHERE order_master.orderno = :n.orderno;18.--定义游标,访问order_detail表19.CUSEOR dcur IS20.select * from order_detail21.WHERE order_detail.orderno = :n.orderno;22.--定义游标变量23.a ecur%ROWTYPE;24.b dcur%ROWTYPE;25.BEGIN26.--打开游标27.OPEN ecur;28.OPEN dcur;29.--读取行30.FETCH ecur into a;31.FETCH dcur into b;32.--判断是否有行33.IF dur%NOTFOUND THEN --没有34.--添加记录35.INSERT INTO order_master (orderno, ostatus)36.VALUES (:n.orderno, :n.ostatus);37.ELSE --有38.--修改记录39.UPDATE order_master SET order_master.ostatus = :n.ostatus40.WHERE order_master.orderno = :n.orderno;41.END IF;42.43.IF ecur%NOTFOUND THEN44.INSERT INTO order_detail (qty_ord, qty_deld, orderno)45.VALUES(:n.qty_ord, :n.qty_deld, :n.orderno);46.ELSE47.UPDATE order_detail SET48.order_detail.qty_ord = :n.qty_ord,49.order_detail.qty_deld = :n.qty_deld50.WHERE order_detail.orderno = :n.orderno;51.END IF;52.--关闭游标53.CLOSE ecur;54.CLOSE dcur;55.END;56./注意:使用INSTEAD OF触发器有如下的限制,∙只能在行级使用,不能在语句级使用∙只能应用于视图,不能应用于表使用4:应用模式(DDL)触发器,对用户删除的对象进行日志记录,创建模式触发器的语法为:CREATE OR REPLACE TRIGGER trigger_name {BEFORE | AFTER} trigger_eventON [schema.]SCHEMAWHEN (trigger_condition)trigger_body;Sql代码1.--创建日志记录表2.CREATE TABLE dropped_obj3.(4.obj_name VARCHAR2(30),5.obj_type VARCHAR2(20),6.drop_date DATE7.);8.--创建触发器9.CREATE OR REPLACE TRIGGER log_drop_obj10.--在执行drop语句后触发11.AFTER DROP ON SCHEMA12.BEGIN13.--将被删除对象的信息添加到日志记录表中14.INSERT INTO dropped_obj15.VALUES (ORA_DICT_OBJ_NAME, ORA_DICT_OBJ_TYPE, SYSDATE);16.END;17./使用5:应用数据库级触发器,在数据库启动后执行,CREATE OR REPLACE TRIGGER system_startup--系统启动时触发AFTER STARTUP ON DATEBASEBEGIN--加入所需代码END;/6、启动、禁用、删除触发器,查看触发器信息启用和禁用触发器:ALTER TRIGGER 触发器名DISABLE; --禁用ALTER TRIGGER 触发器名ENABLE; --启用删除触发器:DROP TRIGGER 触发器名;查看触发器信息,使用USER_TRIGGERS数据字典:使用1:查看为表EMP设置的触发器名select TRIGGER_NAME from USER_TRIGGERSWHERE TABLE_NAME = 'EMP';使用2:查看触发器BIU_EMP_DEPTNO的类型、触发事件、触发条件,select TRIGGER_TYPE, TRIGGERING_EVENT, WHEN_CLAUSE from USER_TRIGGERSWHERE TRIGGER_NAME = 'BIU_EMP_DEPTNO';7、内置程序包Oracle提供了许多内置程序包,用于扩展数据库功能,数据库用户SYS 拥有所有程序包,程序包被定义为公有同义词,并将执行权限授予了PUBLIC用户组,任何用户都可访问,部分内置程序包如下:8、总结∙触发器是当特定事件出现时自动执行的存储过程∙触发器分为DML 触发器、DDL 触发器和数据库级触发器三种类型∙DML触发器的三种类型为行级触发器、语句级触发器和INSTEAD OF触发器∙了解一些常用的内置程序包。
精品课件-oracle数据库实用技术-第8章
第8章 PL/SQL高级应用
所有信息设置完毕后,单击“显示SQL”按钮,即可显示自 动形成的创建存储过程的CREATE PROCEDURE语句,此语句即为命 令行方式创建存储过程的命令,单击“创建”按钮即可完成新存 储过程的创建。
注意:只有编译通过的存储过程才产生编译代码,并存储到 数据库数据字典中,才能被调用执行。
第8章 PL/SQL高级应用
2.命令行方式 命令行方式创建存储过程的方法是在SQL*Plus或iSQL*Plus 中使用CREATE PROCEDURE命令创建存储过程,创建存储过程的语 法如下: CREATE PROCEDURE [<方案名>.]<存储过程名>
[ (<参数1> IN | OUT | IN OUT <数据类型>, <参数2> IN | OUT | IN OUT <数据类型>,…)] {IS|AS}
通过员工的编号查看某员工的姓名及性别。(改写第7章例7.8为 存储过程)
第8章 PL/SQL高级应用
CREATE PROCEDURE staff1_pro ( c1 IN CHAR ) AS
TYPE staff_record_type IS RECORD ( v_sno staff.sno%TYPE,
第8章 PL/SQL高级应用
第8章 PL/SQL高级应用 8.1 管理存储过程 8.2 管理存储函数 8.3 管理触发器 8.4 小结 习题与思考题 实践8 PL/SQL高级编程
第8章 PL/SQL高级应用
8.1 管理存储过程 存储过程是PL/SQL语言的重要特征,是指为了完成某种特 定功能而编写的命名的PL/SQL程序块,它为创建和存储高度结 构化的、可重用的模块代码提供了一种手段。它存储在数据库 中,属于数据库的一部分。 利用存储过程不仅可以使程序代码简洁、规范,提高代码 重用性的同时还能极大地改善操作性能,提高程序的执行效率。 例如,在前台程序中想多次统计某医保卡的消费金额及等级, 只需要将第7章中例7.1的PL/SQL块命名,修改为存储过程并存 储在数据库中,这样在前台程序中可以随时通过调用这个存储 过程方便地完成相关信息的统计。
Oracle数据库应用课件8
创建表的语法图
语法:
CREATE [GLOBAL TEMPORARY] TABLE [schema.]table [(relational_properties)] [ON COMMIT {DELETE | PRESERVE} ROWS] physical_properties table_properties;
在VALUES子句中使用NULL作为列的值
使用子查询的INSERT语句
➢ 语法:
INSERT INTO <表名> (<列名>,<列名>,...) SELECT <列名>,<列名>,... FROM <表名> WHERE 条件;
➢ SELECT子句中列的数量和列类型应与INTO子句中指定的列数 量和列类型一致
PCTFREE和PCTUSED:对空间利用率有较大影响 INITRANS、MAXTRANS:对系统性能有较大影响 分散存储是Oracle数据库系统物理设计的灵魂 修改的存储参数不会立刻显现出效果 ALTER TABLE … MOVE:将表从一个表空间迁移到另
一个表空间
例:将STU01用户的表stu从USERS表空间迁移到ts1表空间。 conn /@orcl as sysdba alter user stu01 quota unlimited on ts1;
约束的类型
➢ NOT NULL:非空约束 ➢ UNIQUE:唯一性约束,指定某列值不能重复 ➢ PRIMARY KEY:主键约束 ➢ FOREIGN KEY:外键约束,也叫参照完整性约束 ➢ CHECK:检查约束,用于限制该列的取值范围 ➢ REF:定义列对象的参照关系
完整性约束需注意以下几点:
Oracle数据库系统应用开发实用教程电子课件 第8章 存储过程函数程序包与触发器-精选文档
完成了任务7, 请尝试实训7
任务8
任务8.通过触发器在视图中插入数 据。
34
任务8
替代触发器是行级触发器。替代触发器用INSTEAD OF来 规定,它执行一个替代操作来代替对视图的操作,对视图 的操作最终会转换为基本表的操作。 问题:对视图view_emp_dept进行插入数据,结果报错。 这种情况该如何解决?(视图view_emp_dept的数据来 源于emp表的字段empno,ename,job, emp.deptno,条件是emp.deptno=dept.deptno)
③ 远程数据的复制。
语句级触发器
触发器的语句中未使用FOR EACH ROW子句。
语句级触发器与INSERT、DELETE、UPDATE或者组合上 进行关联。
语句触发器都只针对指定语句激活一次。
实训5
① 掌握语句级触发器的原理。 ② 语句级触发器的编写方法。 ③ 测试语句级触发器是否生效。
触发器示例体验
触发器概述
触发器是关系数据库系统提供的一项技术,当特定对 象上特定事件出现时,由系统自动触发执行的代码块。数 据库触发器能够执行的功能包括以下几方面: ① 自动生成派生数据。 ② 实现复杂的数据完整性规则。 ③ 实施更复杂的安全性检查。 ④ 提供审计和日志记录。
⑤ 启用复杂的业务逻辑。
触发器的基本语法规则
CREATE [OR REPLACE] TRIGGER 触发器名 触发时间 触发事件 ON 对象名 [REFERENCING_CLAUSE]
[FOR EACH ROW[WHEN ROW] TRIGGER_CONDITION]] PL/SQL 语句
规则说明
触发时间:指明触发器何时执行,取值有:
CH8_触发器和内置程序包
触发器触发器是当特定事件出现时自动执行的存储过程特定事件可以是执行更新的DML语句和DDL语句触发器不能被显式调用❑触发器的功能:❑自动生成数据❑自定义复杂的安全权限❑提供审计和日志记录❑启用复杂的业务逻辑Oracle触发器类型:行级触发器对DML语句影响的每一行执行一次语句级触发器对每个DML语句只执行一次instead of 触发器用于用户不能直接使用DML 语句修改的视图一般用于连接视图模式级触发器DDL语句触发数据库级触发器在发生打开、关闭、登录和退出数据库等系统事件时执行注意事项:不能有参数不能包含事务控制不能声明long和blob clob变量/********************行级触发器******************/--对DML语句影响的每一行执行一次create [or replace] trigger trigger_namebefore|after--触发时机insert [or delete or update [of column_name,....]] --触发条件insert或update或delete on table_name[referencing NEW as别名OLD as别名 ] –-NEW OLD表示当前行的新值和旧值for each row [when (condition)]-- for each row指定为行级触发器 [declare.....]begin....end [trigger_name];说明::NEW --新行:OLD --旧行before after 在触发事件之前和之后--after insert触发器不允许插入值例1:create or replace trigger trig_onebeforeinsert or update of sal on empreferencing new as mynew old as myoldfor each rowwhen (mynew.sal<0)begin:mynew.sal:=0;dbms_output.put_line('行级触发器触发....');end;--测试触发器update emp set sal=-100where empno in(7369,7499);条件谓词:insertingdeletingupdating例2:create table test_trig(myid number,myname varchar2(20));create sequence seq_trig;create or replace trigger trig_twobeforeinsert or update of myid on test_trigfor each rowbeginif inserting thenselect SEQ_TRIG.Nextval into :new.myid from dual;elseraise_application_error(-20001,'MYID列不允许更新');end if;end;--测试触发器insert into test_trig values(0,'aaa');insert into test_trig values(0,'bbb');insert into test_trig values(0,'ddd');commit;update test_trig set myid=3where myname='aaa';例3:--为test_trig2创建一个用于统计的触发器create table test_trig2(product_id varchar2(20),quantity number(3),price number(6,2),total number(8,2));create or replace trigger trig_threebeforeinsert or update of quantity,price on test_trig2for each rowbegin:new.total:=:new.quantity * :new.price;end;insert into test_trig2(product_id,quantity,price) values(100,5,190.5); commit;--测试触发器update test_trig2set quantity=8where product_id=100;commit;/*******************语句级触发器*****************/对每个DML语句只执行一次create or replace trigger trig_namebefore|afterinsert [or delete or update]on table_namedeclare .....begin ....end [trigger_name];例:create table test_emp_log(mywho varchar2(20),mywhen date,action varchar2(20));create or replace trigger trig_emp_log after insert or delete or updatedeclaremy_action test_emp_log.action%type;beginif inserting thenmy_action:='插入';elsif updating thenmy_action:='更新';elsif deleting thenmy_action:='删除';end if;insert into test_emp_log values(user,sysdate,my_action); end;--测试触发器update emp set sal=1000where empno=7369;/****************模式级触发器*****************/ --主要用于DDL语句(create,alter,drop)--主要用途:阻止DDL操作及为DDL提供安全监控,记录日志等create or replace trigger trigger_namebefore|after DDL...on schema[declare.....]begin....end [trigger_name];例1:create or replace trigger tigg_ddlbefore drop on scott.schemabeginif ora_dict_obj_name='EMP'then --ora_dict_obj_name()事件属性函数返回DDL语句的目标对象名raise_application_error(-20008,'emp不允许删除');end if;end;例2:create table dropped_obj(obj_name varchar2(30),--对象名称obj_type varchar2(20),--对象类型drop_date date --删除时间);create or replace trigger trig_drop_objafter drop on scott.schemabegininsert into dropped_objvalues(ora_dict_obj_name,ora_dict_obj_type,sysdate); end trig_drop_obj;-- ora_dict_obj_name()事件属性函数返回DDL语句的目标对象名-- ora_dict_obj_type()事件属性函数返回DDL语句的目标对象类型--测试触发器create table for_drop(id number);drop table for_drop;select * from dropped_obj;/****************instead of触发器*****************/ instead of 触发器定义在视图上的触发器一般用于不能直接使用DML语句修改数据的连接视图使用限制:只能是行级触发器只应用于视图--连接视图create or replace view v_emp_deptasselect e.empno,e.ename,e.sal,d.deptno,d.dname from emp einner join dept d on e.deptno=d.deptno;--instead of触发器create or replace trigger trig_insteadinstead of insert or update on v_emp_deptfor each rowdeclarecursor c_emp is select * from emp where empno=:new.empno;cursor c_dept is select * from dept where deptno=:new.deptno;v_emp emp%rowtype;v_dept dept%rowtype;beginopen c_dept;fetch c_dept into v_dept;if c_dept%notfound theninsert into dept(deptno,dname) values(:new.deptno,:new.dname);elseupdate dept set dname=:new.dname where deptno=:new.deptno;end if;close c_dept;open c_emp;fetch c_emp into v_emp;if c_emp%notfound theninsert into emp(empno,ename,sal)values(:new.empno,:new.ename,:new.sal);elseupdate emp set ename=:new.ename,sal=:new.sal where empno=:new.empno;end if;close c_emp;end;--测试触发器update v_emp_dept set dname='游戏部'where deptno=20;insert into v_emp_dept(empno,ename,sal,deptno,dname)values(8555,'西门吹雪',8888,80,'游戏部5');commit;/****************数据库级触发器*****************/数据库级触发器定义在整个数据库上,触发事件是数据库事件,如数据库的启动(startup)、关闭(shutdown),对数据库的登录(logon)或退出(logoff)create or replace trigger trigger_namebefore|after数据库级别操作on databasedeclare ....begin ......end [trigger_name];例:--记录退出会话信息表create table logoff(username varchar2(20),logofftime date,info varchar2(50));create or replace trigger trig_serverbefore logoff on databasebegininsert into logoff values(user,sysdate,'退出系统'); end;/****************启用、禁用、删除触发器*****************/ alter trigger trigger_name enable|disablealter table table_name enable|disable all triggers --激活或禁用在表上的所有触发器drop trigger trigger_name --删除/****************触发器信息*****************/desc user_triggers;select trigger_type,triggering_event,when_clausefrom user_triggers where trigger_name='TRIGGER_NAME';内置程序包用户 SYS 拥有所有程序包可以由任何用户访问DBMS_OUTPUT包显示 PL/SQL 块和子程序的调试信息DBMS_RANDOM包可用来生成随机整数dbms_random.random函数返回(+ -)1-10位随机数declarev_num number;begindbms_output.put_line('dbms_random及dbms_output程序包演示:');-- put_line在缓冲区存储一条信息,并接换行符for i in1..10loopv_num:=dbms_random.random; --返回(+ -)1-10位随机数dbms_output.put(' 随机数:'||v_num); --在缓冲区存储一条信息不输出显示dbms_output.put('--->0--100以内:'||abs(mod(v_num,100)));dbms_output.new_line(); --缓冲区添加换行符(刷新缓冲)end loop;end;DBMS_LOB包提供用于处理大型对象的过程和函数DBMS_XMLQUERY包用于将查询结果转换为 XML 格式--由sql查询获取xml形式的clob数据select dbms_xmlquery.getXML('select ename,sal from emp') from dual;declareresultClob clob;xmlStr varchar2(32767);line varchar2(1000);line_num integer:=1;beginresultClob:=dbms_xmlquery.getXML('select ename,sal from emp');xmlStr:=dbms_lob.substr(resultClob,32767); --从clob中获取指定个数的字符串loopexit when xmlStr is null;line:=substr(xmlStr,1,instr(xmlStr,chr(10))-1); --获取xmlStr字符串中的一行 ,chr(10)换行符dbms_output.put_line(line_num||':'||line);xmlStr:=substr(xmlStr,instr(xmlStr,chr(10))+1);--获取余下的行line_num:=line_num+1; --行号自加end loop;end;UTL_FILE 包用于读写操作系统文本文件❑操作文件的一般过程是打开、读或写、关闭❑UTL_FILE 包指定文件路径依赖于 DIRECTORY 对象create directory TEMP_DIR as'F:\temp'; --创建名为TEMP_DIR的目录grant read,write on directory TEMP_DIR to scott; --授予scott用户在TEMP_DIR目录的读写权限--UTL_FILE 保存文件declarexmlResult clob;xmlFile UTL_FILE.file_type; --文件类型变量length integer;buffer varchar2(32767);beginxmlResult:=dbms_xmlquery.getXML('select ename,sal from emp');--由sql查询获取xml形式的clob数据length:=dbms_lob.getlength(xmlResult);--获取clob类型数据长度dbms_lob.read(xmlResult,length,1,buffer); --将clob数据读到缓冲变量buffer中xmlFile:=UTL_FILE.fopen('TEMP_DIR','emp.xml','w');--以可写方式打开目录(如无emp.xml则创建)返回文件类型UTL_FILE.put(xmlFile,buffer); --将buffer中的字符写到xmlFile中UTL_FILE.fclose(xmlFile); --关闭文件end;--UTL_FILE 读取文件declareinput_file UTL_FILE.file_type; --文件类型变量input_buffer varchar2(32767);begininput_file:=UTL_FILE.fopen('TEMP_DIR','emp.xml','r');--以读的方式打开目录下emp.xml,返回文件类型loopUTL_File.get_line(input_file,input_buffer); --获取文件中的一行数据放入input_buffer变量中dbms_output.put_line(input_buffer);end loop;exceptionwhen no_data_found thenUTL_FILE.fclose(input_file); --关闭文件end;。
数据库触发器与内置程序包综述PPT课件( 23页)
查看和查询使用 DBMS_LOGMNR_CDC_PUBLISH 程 序包捕获并发布的更改数据。 从字典检索完整的数据库对象定义(元数据)。
根据用户函数的所用时间返回此函数的 CPU 成本。
19
总结3-1
• 数据库触发器是 PL/SQL 块或存储过程 • 是在对关联表执行 DML 操作时触发的 • 数据库触发器的三个组成部分是:
但不能虚伪;可以平凡,但不能平庸;可以浪漫,但不能浪荡;可以生气,但不能生事。
•
17、人生没有笔直路,当你感到迷茫、失落时,找几部这种充满正能量的电影,坐下来静静欣赏,去发现生命中真正重要的东西。
•
18、在人生的舞台上,当有人愿意在台下陪你度过无数个没有未来的夜时,你就更想展现精彩绝伦的自己。但愿每个被努力支撑的灵魂能吸引更多的人同行。
• DML 触发器组件
– 触发器定时 – 触发器事件 – 表名 – 触发器类型 – WHEN 子句 – 触发器主体
9
数据库触发器10-7
• 变异表
– 当前正由 DML 语句修改 – 声明删除级联(引用完整性约束条件)的影
响
• 约束表
– 对于 SQL 语句,触发语句直接读取 – 对于声明的引用完整性约束条件,间接读取
21
总结3-3
• Oracle 提供了许多内置程序包,它们用 于
– 扩展数据库的功能 – 允许访问 SQL 功能,这些功能在 PL/SQL 中
通常是受到限制的
• 用户必须具有程序包的 EXECUTE 权限, 才能调用过程和函数
22
•
1、不是井里没有水,而是你挖的不够深。不是成功来得慢,而是你努力的不够多。
第八章 触发器和内置程序包
第八章触发器和内置程序包回顾❑子程序是命名的PL/SQL 块,存储在数据库中,可带参数并可在需要时随时调用❑有两种类型的PL/SQL子程序,即过程和函数❑过程用户执行特定的任务,函数用于执行任务并返回值❑程序包是对相关类型、变量、常量、游标、异常、过程和函数等对象的封装❑程序包由两部分组成,即包规范和包主体❑使用程序包的优点是:模块化、更轻松的程序设计、信息隐藏、新增功能以及性能更佳目标❑理解和应用触发器❑了解内置程序包触发器❑触发器是当特定事件出现时自动执行的存储过程(不能带参数)❑特定事件可以是执行更新的DML语句和DDL语句❑触发器不能被显式调用❑触发器的功能:❑自动生成数据❑自定义复杂的安全权限❑提供审计和日志记录❑启用复杂的业务逻辑触发器的组成部分❑触发源:是什么对象触发的?通常是一个表,还可以是视图❑触发事件:触发源的什么事件触发的?如插入、更新、删除等DML操作❑触发时机:前置或后置,即在触发事件前触发还是后触发,还是直接替代触发事件❑触发器限制:用户对触发器的控制,当禁用时触发器无效❑触发动作:触发器被触发时所执行的动作❑触发范围:表级或行级DML触发器的分类:行级触发器语句级触发器(表级)使用触发器模拟日志(分别使用sysdba和scott用户来测试以下代码)--日志表create table mylog(curUser varchar2(100),curDate date,act varchar(6));--触发器定义create or replace trigger触发器名--触发器名after insert or delete or update-- 条件on表–数据源--不写 for each row 是表级触发器begin--触发内容,判断用户操作if inserting theninsert into mylog values(user,sysdate,'insert'); elsif updating theninsert into mylog values(user,sysdate,'update'); elseinsert into mylog values(user,sysdate,'delete'); end if;end;触发器中不能使用COMMIT或ROLLBACK如果要回滚的话,使用RAISE_APPLICA TION_ERROR();触发器建好后是不能修改数据源的使用rollback后再查看效果。
Oracle数据库技术与应用课件:触发器
触发器简介
• 触发器是一种过程,与表关系密切,用于保护表中的数据 • 当一个基表被修改(INSERT、UPDATE或DELETE)时,触发器自
动执行 • 触发器可实现多个表之间数据的一致性和完整性
触发器语法
• 创建触发器的具体语法:
CREATE [OR REPLACE] TRIGGER [schema.]trigger_name {BEFORE | AFTER | INSTEAD OF} /*定义触发器种类*/ {DELETE [OR INSERT] [OR UPDATE[OF column,…n]]} ON [schema.]table_name | view_name /*指定操作对象*/ [FOR EACH ROW [WHEN(condition)]] trigger_body
ALTER TRIGGER log_creations DISABLE ; • 重新启用log_creations触发器
ALTER TRIGGER log_creations ENABLE ;
触发器的修改与删除
• 删除触发器log_creations DROP TRIGGER log_creations ;
器 • DML触发器针对INSERT、UPDATE、DELETE操作,可以在这些操作之
前或之后触发。DML触发器又包括行级触发器和语句级触发器。 • INSTEAD OF触发器主要用于建立在多张基表上的视图。
:new.sal := :old.sal; /*新的工资赋予原来的值,即工资不变*/ end;
INSTEAD OF触发器
• INSTEAD OF触发器用于对视图的DML触发,主要用于多表联接的视图 • 例:在dept和emp表上建有如下视图
ORACLE基础学习培训课件pptx
存储过程概念及作用
存储过程定义
存储在数据库中的一组为了完成特定功能的SQL语 句集,经编译后存储在数据库中,用户通过指定存 储过程的名字并给出参数(如果该存储过程带有参 数)来执行它。
封装逻辑
可将复杂的业务逻辑封装在存储过程中,使得调用 者无需关心具体实现细节,提高代码的可维护性。
高性能
Oracle数据库采用先进的优化器、执行引 擎和存储管理技术,提供卓越的性能和可 扩展性。
可移植性
Oracle数据库支持多种操作系统和硬件平 台,方便用户在不同环境下部署和使用。
安全性
Oracle数据库提供了全面的安全性功能, 包括数据加密、访问控制、审计和合规性 检查等。
ORACLE数据库应用领域
04
当满足触发条件时(如对表进行INSERT/UPDATE/DELETE操作), 数据库系统会自动执行相应的触发器。
06
ORACLE数据库安全性管 理
用户权限管理
用户创建与授权
介绍如何在ORACLE数据库中创建用户并为其分配适当的 权限,以确保数据库的安全性和数据的完整性。
01
权限级别与分类
详细解释ORACLE数据库中的权限级别 和分类,包括系统权限、对象权限和角 色权限等。
创建数据库用户
使用SQL*Plus或其他工具创建数据 库用户,并为其分配相应的权限和角 色。
配置数据库性能参数
根据实际需求调整数据库性能参数, 如SGA大小、PGA大小等。
测试数据库连接
使用测试工具或编写简单的程序测试 与ORACLE数据库的连接是否正常。
03
SQL基础语法与操作
SQL语言概述及基本语法
检查系统要求
第八章上机课触发器和内置程序包
END;
/ (4)向表中插入数据测试触发器。
INSERT INTO order_item(prod_id, quantity, price)
VALUES ('P001', 5, 56.00);
INSERT INTO order_item(prod_id, quantity, price)
VALUES ('P002', 3, 128.00);
老二牛车教育 《Oracle 数据库应用 》上机课
INSERT INTO itemfile_log(who, When, action)
VALUES ( USER, SYSDATE, l_action);
END;
/ (4)测试触发器。 执行以下语句对 itemfile 进行更新。
UPDATE itemfile
提示:使用 UTL-FILE 包。
老二牛车教育 《Oracle 数据库应用 》上机课
触发器和内置程序包
目标: 能够使用触发器 能够使用内置程序包
第一部分 指导 本阶段的重点学习如何编写创建触发器的语句,还将学习编写以使用各种内置程序包的方法。
阶段一:创建语句触发器 需求说明: 公司经理认为 itemfile 表中的数据非常重要,希望所有对该表进行的更新都要有记录,但只记录 所做的操作,不记录用户更新的具体数据,请提出解决方案。 实现思路: 语句级触发器对每个 DML 语句执行一次,通常用于强制实施在表上执行操作的额外安全性措施。 语句级触发器 CREATE TRIGGER 命令创建的触发器的默认类型。可以首先创建一个记录信息 的表,然后在 itemfile 表上创建一个执行 UPDATE、INSERT 和 DELETE 语句都会激活的语句级 触发器。
触发器教学课件PPT
8.2.1 JK触发器的电路组成和逻辑功能
二、逻辑功能 在CP=1期间: (((4312)))翻置保转10持功功功功能能能能 当当当当JJJ=1K0、 1=、、0KK时K,01G13时时、时,,G,GG433与与3与与非非非非门门门门的的的的输输输输出出出出SSSS1Q,1Q、、R、GGG4414,门门门触的的的输,
端。
8.1.1 基本RS触发器
2. 当 = 0, =0时,具有置1功能 由于 =0,无论触发器现态为0态还是1态,与非门输出为1,使 =1;
而 门的两个输入端均为1, 与非门输出为0,使 =0,即触发器完成 置1。 端称为触发器的置1端或置位端。
3. 当 = 1, =1时,具有保持功能 若触发器原为0态,即 =0 =1, 门的两个输入均为1,
在CP=1期间,G3、G4 控制门开门,触发器输出状态由输入端R、S信 号决定,R、S输入高电平有效。触发器具有置0、置1、保持的逻辑功能。
真值表如下表所示
了解JK触发器的电路组成,熟悉JK触发器的电路图形符号; 掌握JK触发器的逻辑功能,能根据输入波形正确画出输出波形; 能识读集成JK触发器的引脚,会使用JK触发器。
C
P = 0 期 间
8.2.2 集成边沿JK触发器
一、边沿触发方式 利用CP脉冲上升沿触发的称为上升沿触发器,利用CP脉冲下降沿触发 的称为下降沿触发器。逻辑符号中下降沿触发器除了用“>”符号外,还在 CP引脚标注小圆圈。
如图所示。
8.2.2 集成边沿JK触发器
二、集成JK触发器
1.引脚排列和逻辑符号 如 图 所 示 为 7
RS 触发器,它有两个输入端 R、S ,字母上面的非号表示低电平有效, 即低电平时表示有输入信号、高电平时表示没有输入信号;Q、Q 是
第八章理论课触发器和内置程序包
《Oracle数据库应用》理论课触发器和内置程序包⏹本章技能目标◆理解和应用触发器◆了解内置程序包1.触发器触发器是特定事件出现的时候,自动执行的代码块。
类似于存储过程,触发器与存储过程的区别在于:存储过程是由用户或应用程序显式调用的,而触发器是不能被直接调用的。
触发器可以用于加载Oracle的默认功能,提供高度可定制的数据库,触发器能够执行的功能有:1、允许/限制对表的修改2、自动生成派生列,比如自增字段3、强制数据一致性4、提供审计和日志记录5、防止无效的事务处理6、启用复杂的业务逻辑触发器与特定的表或视图相关联,用于检查对表或视图所做的数据修改。
无论正在执行操作的用户身份如何,触发器都能够在它们执行操作时生效。
当INSERT,DELETE,UPADTE等事件发生在表或视图中时,就会激活触发器的代码。
before和after:指在事件发生之前或之后激活触发器。
instead of:如果使用此子句,表示可以执行触发器代码来代替导致触发器调用的事件。
insert、delete和update:指定构成触发器事件的数据操纵类型,update还可以制定列的列表。
referencing:指定新行(即将更新)和旧行(更新前)的其他名称,默认为new和old。
table_or_view_name:指要创建触发器的表或视图的名称。
for each row:指定是否对受影响的每行都执行触发器,即行级触发器,如果不使用此子句,则为语句级触发器。
when:限制执行触发器的条件,该条件可以包括新旧数据值得检查。
declare---end:是一个标准的PL/SQL块。
例1演示如何在SCOTT模式的EMP表上创建触发器。
例1:SHOW ERRORS。
1.1触发器的组成部分触发器由三部分组成:●触发器语句(事件)⏹定义激活触发器的DML 事件和DDL 事件●触发器限制⏹执行触发器的条件,该条件必须为真才能激活触发器●触发器操作(主体)⏹包含一些SQL 语句和代码,它们在发出了触发器语句且触发限制的值为真时运行触发器语句触发器语句是那些可以导致触发器的事件,即在表或视图上执行的INSERT,DELETE,UPADTE 之类的DML语句,在模式对象上执行的DDL语句或数据库事件。
数据库触发器和内置程序包
9
视图:
CREATE OR REPLACE VIEW CLASSES_ROOMS AS SELECT r.department, r.building,c.room_id FROM rooms r, class c WHERE r.room_id = c.room_id
CREATE or replace TRIGGER ClassesRoomsInsert INSTEAD OF INSERT ON classes_rooms DECLARE v_roomID rooms.room_id%TYPE; BEGIN
12
创建触发器的通用语法:
13
create table TEMP_TABLE ( NUM_COL NUMBER, CHAR_COL VARCHAR2(100) ) CREATE SEQUENCE trig_seq START WITH 1 INCREMENT BY 1; CREATE OR REPLACE PACKAGE TrigPackage AS
22
数据库触发器10-6
• DML 触发器组件
– – – – – – 触发器定时 触发器事件 表名 触发器类型 WHEN 子句 触发器主体
23
数据库触发器10-7
• 变异表
– 当前正由 DML 语句修改 – 声明删除级联(引用完整性约束条件)的影 响
15
• • • • • • • • • • •
CREATE OR REPLACE TRIGGER ClassesBRow1 BEFORE UPDATE ON class FOR EACH ROW BEGIN INSERT INTO temp_table (num_col, char_col) VALUES (trig_seq.NEXTVAL, 'Before Row 1: counter = ' || TrigPackage.v_Counter); -- Increment for the next trigger. TrigPackage.v_Counter := TrigPackage.v_Counter + 1; END ClassesBRow1; CREATE OR REPLACE TRIGGER ClassesBRow2 BEFORE UPDATE ON class FOR EACH ROW BEGIN INSERT INTO temp_table (num_col, char_col) VALUES (trig_seq.NEXTVAL, 'Before Row 2: counter = ' || TrigPackage.v_Counter); -- Increment for the next trigger. TrigPackage.v_Counter := TrigPackage.v_Counter + 1; END ClassesBRow2;
Oracle触发器课件PPT模板
演讲人
ห้องสมุดไป่ตู้
2 0 2 x - 11 - 11
目录
01. 第1章触发器相关概念及语法 02. 第2章触发器应用
01
第1章触发器相关概念及语法
第1章触发器相关 概念及语法
1-1oracle触发器概述 1-2[oracle]触发器的概念和第一 个触发器 1-3[oracle]触发器的应用场景 1-4[oracle]触发器的语法的类型 1-2[Oracle]触发器的概念和第一 个触发器 1-3[Oracle]触发器的应用场景 1-4[Oracle]触发器的语法的类型
02
第2章触发器应用
第2章触发器应用
2-1[oracle]触发器应用一 2-2[oracle]触发器应用二 2-3[oracle]触发器应用三 2-4[oracle]触发器应用四 2-2[Oracle]触发器应用二 2-3[Oracle]触发器应用三 2-4[Oracle]触发器应用四
感谢聆听
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
在模式中执行 DDL 语句时执行
• 数据库级触发器
在发生打开、关闭、登录和退出数据库等 系统事件时执行
• DML 触发器
在对表或视图执行DML语句时执行
• 语句级触发器
无论受影响的行数是多少,都只执行一次 对DML语句修改的每个行执行一次
• 行级触发器 • INSTEAD OF 触发器
用于用户不能直接使用 DML 语句修改的 视图
表
激保活存更新 触发器
数据库
激活 保存更新
触发器
Oracle 数据库
9
.
创建触发器
CREATE OR REPLACE TRIGGER aiu_itemfile AFTER INSERT ON itemfile FOR EACH ROW BEGIN
IF (:NEW.qty_hand = 0) THEN DBMS_OUTPUT.PUT_LINE('警告:已插入记录,但数量为零');
序设计、信息隐藏、新增功能以及性能更佳
2
.
目标
理解和应用触发器(重点) ----------------------------------- 了解内置程序包
3
专业英语
Trigger Reference
.
引发, 引起, 触发,板机 提及, 涉及, 参考, 参考书目
4
.
触发器
触发器是当特定事件出现时自动执行的存储过 程
6
.
触发器的组成部分 3-1
触发器由三部分组成: 触发器语句(事件)
定义激活触发器的 DML 事件和 DDL 事件
触发器限制
执行触发器的条件,该条件必须为真才能激活触 发器
触发器操作(主体)
包含一些 SQL 语句和代码,它们在发出了触发器 语句且触发限制的值为真时运行
7
.
触发器的组成部分 3-2
只有在WHEN子句中的条 在如足更果,新W将为件eH执smE得a行pNltat到r_rB子irigsgyE满a__-句Gslr足ae列中INlc时之触o的块r,d后发条中s才激器件表的激活得创代活触到建码发满器
8
.
触发器的组成部分 3-3
ABEFTFEORRE触触发发器器的的工工作作原原理理
更新
Oracle
ELSE DBMS_OUTPUT.PUT_LINE(‘已插入记录');
END IF; END; /
10
.
触发器类型 6-1
触发器的类型有:
触发器类型
模式(DDL) 触发器
数据库级 触发器
DML 触发器
行级触发器 语句级触发器 INSTEAD OF触发器
11
.
触发器类型 6-2
• DDL 触发器
12
.
触发器类型 6-3
行级触发器
SQL> CREATE TABLE TEST_TRG (ID NUMBER, NAME VARCHAR2(20));
SQL> CREATE SEQUENCE SEQ_TEST; SQL> CREATE OR REPLACE TRIGGER BI_TEST_TRG BEFORE INSERT OR UPDATE OF IEGIN
特定事件可以是执行更新的DML语句和DDL语句 触发器不能被显式调用 触发器的功能:
自动生成数据 自定义复杂的安全权限 提供审计和日志记录 启用复杂的业务逻辑
5
.
创建触发器的语法
CREATE [OR REPLACE] TRIGGER trigger_name AFTER | BEFORE | INSTEAD OF [INSERT] [[OR] UPDATE [OF column_list]] [[OR] DELETE] ON table_or_view_name [REFERENCING {OLD [AS] old / NEW [AS] new}] [FOR EACH ROW] [WHEN (condition)] pl/sql_block;
.
第八章
触发器和内置程序包
.
回顾
子程序是命名的 PL/SQL 块,存储在数据库中, 可带参数并可在需要时随时调用
有两种类型的PL/SQL子程序,即过程和函数 过程用户执行特定的任务,函数用于执行任
务并返回值 程序包是对相关类型、变量、常量、游标、
异常、过程和函数等对象的封装 程序包由两部分组成,即包规范和包主体 使用程序包的优点是:模块化、更轻松的程
IF INSERTING THEN SELECT SEQ_TEST.NEXTVAL INTO :NEW.ID FROM DUAL;
ELSE RAISE_APPLICATION_ERROR(-20020, '不允许更新ID值!');
END IF; END; /
13
.
触发器类型 6-4
语句级触发器
SQL> CREATE OR REPLACE TRIGGER trgdemo AFTER INSERT OR UPDATE OR DELETE ON order_master
END; /
14
.
触发器类型 6-5
INSTEAD OF 触发器
SQL> CREATE OR REPLACE TRIGGER upd_ord_view INSTEAD OF UPDATE ON ord_view FOR EACH ROW BEGIN UPDATE order_master SET vencode=:NEW.vencode WHERE orderno = :NEW.orderno; DBMS_OUTPUT.PUT_LINE(‘已激活触发器'); END; /
触发器语限操句制作
SSQQLL>> SQL>
C…A……FWDS…BEsDROFaENEHalBTEGCDR_lE_EMAdL;INdENiTRAfSifAfER(f_UNN:C=OEOPUEH:UNRDMWRTEABR.POeWTEEUmEW.RPeTpO;mL.sPAFapUCls>eTaEOm_l-LTLp:ODIsRNaL.IeEGlDmO(G.‘e工pNEms资Rsapals)差tlraaiglr额;y__s:rae’lcosradls_diff);