实验报告
实验名称:使用游标、存储过程和触发器
实验课时:2课时
实验地点:E305
实验时间:20##年5月 21日 星期 三 第14 周
实验目的及要求:
(1) 了解游标的概念和工作原理。
(2) 了解存储过程的分类和使用方法。
(3) 了解触发器的概念。
(4) 学习编写和执行自定义过程。
(5) 学习创建和使用触发器。
实验环境:
(1) 硬件设备:PC机一台
(2) 操作系统:Windows XP
(3) 应用工具:Oracle 11g
实验内容:(算法、程序、步骤和方法)
(1) 创建游标mycur,从表employees中读取1号部门的员工姓名,职务。并输出“员工姓名:XXX,职务:XXX。”
程序代码如下:
set serveroutput on;
DECLARE
CURSOR mycur IS
SELECT emp_name, title
FROM employees
where dep_id=1;
BEGIN
FOR yw IN mycur LOOP
dbms_output.put_line('员工姓名:'||yw.emp_Name||'职务:'||yw.title);
END LOOP;
END;
执行结果如下:
(2) 创建存储过程GetGrade,查询指定员工的工资,使用CASE语句输出其工资等级。工资小于等于3000,等级为“低”;工资大于3000,小于5000,等级为”中”;工资大于等于5000,等级为高。并执行该存储过程。
创建存储过程代码如下:
create or replace procedure getgrade
(yw_depid number)
as
yw_wage employees.wage%type;
yw_grade varchar2(5);
begin
select wage into yw_wage
from employees
where emp_id=yw_depid;
yw_grade:=case
when yw_wage<=3000 then '低'
when yw_wage>=3000 and yw_wage<5000 then '中'
when yw_wage>=5000 then '高'
end;
dbms_output.put_line('该员工工资等级为'||yw_grade);
end;
执行存储过程代码如下:
execute getgrade(3);
call getgrade(3);
执行结果如下:
(3) 创建存储过程UpdateWage,查询指定员工的工资,如果工资小于3000,则加200工资,并提示信息“XX号员工工资已更新。”,如果工资大于3000,则提示信息“XX号员工工资为XXX,已达到规定标准。”
创建存储过程代码如下:
create or replace procedure updatewage
(yw_depid number)
as
yw_wage employees.wage%ywpe;
BEGIN
Select wage into yw_wage
From employees
Where employees.emp_id =yw_depid;
If yw_wage <3000 then
Update employees
Set employees.wage= employees.wage+200
Where employees.emp_id= yw_depid;
Commit;
DBMS_OUTPUT.PUT_LINE('5号工资已更新');
Else
DBMS_OUTPUT.PUT_LINE('5号工资为'|| yw_wage ||'已达到规定标准');
END if;
Exception
When no_data_found then
DBMS_OUTPUT.PUT_LINE('不存在该员工');
When others then
DBMS_OUTPUT.PUT_LINE('其他异常');
End;
/执行存储过程代码如下:
Call updatewage(3);
执行结果如下:
(4) 创建触发器MyTrigger,它的作用是当表departments中的记录被删除后,自动删除表employees中的对应的员工记录,从而保证数据的完整性。
程序代码如下:
create or replace trigger mytrigger
after update on departments
for each row
begin
update employees set dep_id = :new.dep_id
where dep_id = :old.dep_id;
end;
执行结果如下:
小结:
通过这次上机实验,我有以下收获:
了解了如何使用游标,触发器和存储过程,知道他们的作用及原理.
但是还上机操作过程中还存在以下几个方面的不足:
无法熟练的使用游标和存储过程的创建,对代码无法正确敲出来.
指导老师评议:
成绩: 指导老师签名:
年 月 日
第二篇:oracle触发器创建格式
数据库定义语言触发器create [or replace] trigger trigger_name{before |after| instead of}ddl_event on {database|schema}[when (logical_expression)][declare]declaration_statements;beginexecution_statements;end [trigger_name];/create sequence audit_seq increment by 1 start with 10000create table audit_creation(audit_creation_id number primary key,audit_owner_name varchar2(30) not null,audit_obj_name varchar2(30) not null,audit_date date not null)create or replace trigger audit_creationbefore create on schemabegininsert into audit_creation values(audit_seq.nextval,ora_dict_obj_owner,ora_dict_obj_name,sysdate);end audit_creation;/数据操作语言触发器create [or replace] trigger trigger_name{before |after}{insert |update|update of column1[,column2[,column(n+1)]] |delete}on table_name[for each row][when (logical_expression)][declare][pragma autonomous_transaction;]declaration_statements;beginexecution_statements;end [trigger_name];/自治事务的理解:pragma autonomous_transaction;自治域加在declare块中,有了这样的预处理,就会使定义的对象为一个单独的事务域,与其他事务无关。复合触发器不支持when子句和pragmacreate [or replace] trigger trigger_namefor {insert |update|update of column1[,column2[,column(n+1)]] |delete}on table_namecompound trigger[before statement is[declaration_statement;]beginexecution_statements;end before statement;][before each row is[declaration_statement;]beginexecution_statements;end before each row;][after each row is[declaration_statement;]beginexecution_statements;end after each row;][after statement is[declaration_statement;]beginexecution_statements;end after statement;]end [trigger_name];/instead-of 触发器create [or replace] trigger trigger_nameinstead of {dml_statement}on {object_name|database|schema}for each row[when (logical_expression)][declare]declaration_statements;beginexecution_statements;end [trigger_name];/判断条件 inserting、updating、deleting在触发器中编写不可更新视图的结构:1.集合运算符2.聚集函数3.case或者decode语句4.connect by、group by、having或者start with子句5.distinct运算符6.连接系统或者数据库事件触发器create [or replace] trigger trigger_name{before |after} database_event on {database|schema}[declare]declaration_statements;beginexecution_statements;end [trigger_name];/例子:create or replace trigger connection_triggerafter logon on databasebegin user_connection.connecting(sys.login_user);end;触发器的限制最大触发器的尺寸 32760 byte非系统触发器主体不能包含ddl语句、dcl、transaction control language