快速学习Oracle触发器和游标


Posted in Oracle onJune 30, 2021
目录
  • 触发器:
    • 1、 创建一个用于记录用户操作的触发器
    • 2、创建一个当删除部门时,删除该部门下的所有雇员的触发器
    • 3、创建一个在account表插入记录之后,更新myevent数据表的触发器
    • 4、创建一个用于记录登录 DBA 身份用户的用户名和时间的触发器
  • 游标:
    • 1、使用隐式游标和 for 语句检索出职务是销售员(salesman)的雇员信息并输出
    • 2、员工工资上调20%,使用隐式游标输出上调工资的员工数量
    • 3、用显示游标和for语句检索出部门编号是30的雇员信息并输出
    • 4、声明游标检索员工信息,并使用%FOUND属性来判断
    • 5、创建游标完成数据转移,将fruit表中单价大于10的记录放到fruitage表中

 

触发器:

 

1、 创建一个用于记录用户操作的触发器

  创建一个dept_log数据表,并在其中定义两个字段(operate_tag varchar2(10),operate_time date),分别用来存储操作种类(插入,修改,删除)信息和操作日期。然后一个关于dept表的语句级触发器tri_dept,将用户对 dept 表的操作信息保存到dept_tag表中。

当任何时候从dept表中删除某个部门时,该触发器将从emp表中删除该部门的所有雇员。

-- 创建表
create table dept_log(
	operate_tag varchar2(10),
	operate_time date
);
create table dept(
	dname varchar2(20),
	dno number
);

-- 创建触发器
create or replace trigger tri_dept
before insert or update or delete
on dept
declare
	v_tag varchar2(10);
begin
	if inserting then
		v_tag:='插入';
	elsif updating then
		v_tag:='修改';
	elsif deleting then
		v_tag:='删除';
	end if;
	insert into dept_log values(v_tag, sysdate);
end tri_dept;
/

快速学习Oracle触发器和游标

 

2、创建一个当删除部门时,删除该部门下的所有雇员的触发器

当任何时候从dept表中删除某个部门时,该触发器将从emp表中删除该部门的所有雇员。

注意:所有的以sysdba登录的账户都不能创建触发器,因此需要在创建的用户下面创建触发器

-- 创建部门表
create table dept(
    deptno number not null,
    dname varchar(20) not null
);

-- 创建员工表
create table emp(
    emp_no number not null,
    emp_name varchar(20) not null,
    job varchar(20) not null,
    sal number  not null,
    deptno number not null
);

--插入数据
insert into dept values(10, '部门1');
insert into dept values(20, '部门2');
insert into emp values(1001, '员工1', '工作1', 5000, 10);
insert into emp values(1002, '员工2', '工作2', 7200, 10);
insert into emp values(1003, '员工3', '工作3', 6000, 10);
insert into emp values(1004, '员工4', '工作4', 5000, 20);
insert into emp values(1005, '员工5', '工作5', 7000, 20);
-- 创建触发器
create or replace trigger del_dept
before delete on dept
for each row
begin
	delete from emp where deptno = :old.deptno;
end;
/

快速学习Oracle触发器和游标


 

3、创建一个在account表插入记录之后,更新myevent数据表的触发器

创建了一个TRIG_INSERT的触发器,在向表account插入数据之后会向表myevent插入一组数据(表结构就不创建了…)

create or replace trigger trig_insert
after insert
on account
begin
	if inserting then
		insert into myevent values(1, 'after insert');
	end if;
end;
/

 

4、创建一个用于记录登录 DBA 身份用户的用户名和时间的触发器

以DBA 身份登录数据库,并创建一个名为db_log的数据表,用于记录登录用户的用户名和时间。
接着分别创建数据库启动和数据库关闭触发器,并向db_log数据表中插入记录,存储登录用户的用户名和操作时间。

--创建表
create table db_log(
	name varchar2(20),
	rtime timestamp
);

-- 创建触发器,用于记录用户登录
create or replace trigger trigger_startup
after startup
on database
begin
	insert into db_log values('user', sysdate);
end;
/

-- 创建触发器,用于记录用户退出
create or replace trigger trigger_shutdown
before shutdown
on database
begin
	insert into db_log values('xiuyan', sysdate);
end;
/

 

游标:

以下题目基于部门表和员工表:

-- 创建表
create table emp(
	empno number,
	ename varchar2(20),
	job varchar2(20),
	sal number,
	deptno number);
create table dept(
	deptno number,
	dname varchar2(20),
	loc varchar2(20));
	
-- 插入数据
insert into dept values(10,'account','new york');
insert into dept values(20,'salesman','chicago');
insert into dept values(30,'research','dallas');
insert into dept values(40,'operations','boston');
insert into emp values(1001,'mary','account',5000,10);
insert into emp values(2001,'smith','salesman',6000,20);
insert into emp values(3001,'kate','research',7000,30);

 

1、使用隐式游标和 for 语句检索出职务是销售员(salesman)的雇员信息并输出

begin
	for emp_record in(select empno, ename, sal from emp where job='salesman')
	loop
		dbms_output.put('雇员编号:'||emp_record.empno);
		dbms_output.put('; 雇员名称:'||emp_record.ename);
		dbms_output.put_line('; 雇员编号:'||emp_record.sal);
	end loop;
end;
/

快速学习Oracle触发器和游标


 

2、员工工资上调20%,使用隐式游标输出上调工资的员工数量

把 emp 表中销售员(即salesman)的工资上调20%,然后使用隐式游标 SQL 的 %ROWCOUNT 属性输出上调工资的员工数量。

begin
	update emp set sal=sal*(1+0.2) where job='salesman';
	if sql%notfound then
		dbms_output.put_line('没有雇员需要上调工资');
	else
		dbms_output.put_line('有'|| sql%rowcount ||'个雇员需要上调工资');
	end if;
end;
/

快速学习Oracle触发器和游标


 

3、用显示游标和for语句检索出部门编号是30的雇员信息并输出

declare
	cursor cur_emp is
	select * from emp where deptno = 30;
begin	
	for emp_record in cur_emp
	loop
		dbms_output.put('雇员编号:'||emp_record.empno);
		dbms_output.put('; 雇员名称:'||emp_record.ename);
		dbms_output.put_line('; 雇员职务:'||emp_record.job);
	end loop;
end;
/

快速学习Oracle触发器和游标


 

4、声明游标检索员工信息,并使用%FOUND属性来判断

声明一个游标,用于检索指定员工编号的雇员信息,然后使用游标的%FOUND属性来判断是否检索到指定员工编号的雇员信息。

declare
	v_ename varchar2(50);
	v_job varchar2(50);
	cursor cur_emp is
	select ename, job from emp where empno = &empno;
begin
	open cur_emp;
	fetch cur_emp into v_ename, v_job;
	if cur_emp%found then
		dbms_output.put('雇员编号:'||v_ename ||',职务是:'||v_job );
	else
		dbms_output.put('无数据记录');
	end if;
end;
/

快速学习Oracle触发器和游标


 

5、创建游标完成数据转移,将fruit表中单价大于10的记录放到fruitage表中

创建 fruit 表并插入数据

-- 创建水果表
create table fruit(
	f_id    varchar2(10)    not null,
	f_name  varchar2(255)  	not null,
	f_price  number (8,2)  	not null
);

--插入数据
insert into fruit values  ('a1', 'apple',5.2);
insert into fruit values ('b1','blackberry', 10.2);
insert into fruit values ('bs1','orange', 11.2);
insert into fruit values('bs2','melon',8.2);
insert into fruit values ('t1','banana', 10.3);
insert into fruit values ('t2','grape', 5.3);
insert into fruit values ('o2','coconut', 9.2);

创建表fruitage,表fruitage和表fruit的字段一致,利用以下语句创建:

create table fruitage as select * from fruit where 2=3;
-- 如果WHERE后面的条件为真,则复制表时把数据也一起复制。
-- 不加默认会复制数据。

创建游标,完成数据转移,将fruit表中,单价大于10的记录放到fruitage表中。

declare 
	v_id fruit.f_id %TYPE;
	v_name fruit.f_name %TYPE;
	v_price fruit.f_price %TYPE;
	cursor frt_cur is
	select f_id, f_name, f_price from fruit where f_price>10;
begin
	open frt_cur;
	loop
		fetch frt_cur into v_id, v_name, v_price;
			if frt_cur%found then
				insert into fruitage values(v_id, v_name, v_price);
			else
				dbms_output.put_line('已取出所有数据,共有'||frt_cur%ROWCOUNT||'条记录');
			exit;
			end if;
	end loop;
	close frt_cur;
end;
/

快速学习Oracle触发器和游标

到此这篇关于Oracle触发器和游标练习题的文章就介绍到这了,更多相关Oracle触发器和游标内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Oracle 相关文章推荐
Oracle 数据仓库ETL技术之多表插入语句的示例详解
Apr 12 Oracle
oracle表分区的概念及操作
Apr 24 Oracle
Oracle设置DB、监听和EM开机启动的方法
Apr 25 Oracle
mybatis使用oracle进行添加数据的方法
Apr 27 Oracle
Oracle更换为MySQL遇到的问题及解决
May 21 Oracle
Oracle以逗号分隔的字符串拆分为多行数据实例详解
Jul 16 Oracle
oracle连接ODBC sqlserver数据源的详细步骤
Jul 25 Oracle
Oracle安装TNS_ADMIN环境变量设置参考
Nov 01 Oracle
分析SQL窗口函数之聚合窗口函数
Apr 21 Oracle
Oracle锁表解决方法的详细记录
Jun 05 Oracle
Oracle删除归档日志及添加定时任务
Jun 28 Oracle
Oracle查看表空间使用率以及爆满解决方案详解
Jul 23 Oracle
使用Oracle跟踪文件的问题详解
SQL模糊查询报:ORA-00909:参数个数无效问题的解决
ORACLE查看当前账号的相关信息
DBCA命令行搭建Oracle ADG的流程
ORACLE数据库应用开发的三十个注意事项
Jun 07 #Oracle
Oracle创建只读账号的详细步骤
Oracle11g R2 安装教程完整版
You might like
PHP中的类-什么叫类
2006/11/20 PHP
优化使用mysql存储session的php代码
2008/01/10 PHP
php mysql索引问题
2008/06/07 PHP
Destoon旺旺无法正常显示,点击提示“会员名不存在”的解决办法
2014/06/21 PHP
php魔术变量用法实例详解
2014/11/13 PHP
一个简单安全的PHP验证码类、PHP验证码
2016/09/24 PHP
PHP使用PDO访问oracle数据库的步骤详解
2017/09/29 PHP
laravel config文件配置全局变量的例子
2019/10/13 PHP
让插入到 innerHTML 中的 script 跑起来的实现代码
2006/07/01 Javascript
javascript 写类方式之二
2009/07/05 Javascript
腾讯的ip接口 方便获取当前用户的ip地理位置
2010/11/25 Javascript
javascript抖动元素的小例子
2013/10/28 Javascript
node.js中watch机制详解
2014/11/17 Javascript
AngularJS入门教程之静态模板详解
2016/08/18 Javascript
angular基于路由控制ui-router实现系统权限控制
2016/09/27 Javascript
jQuery EasyUI右键菜单实现关闭标签/选项卡
2016/10/10 Javascript
详解jQuery的表单验证插件--Validation
2016/12/21 Javascript
纯jQuery实现前端分页功能
2017/03/23 jQuery
Vue.js 插件开发详解
2017/03/29 Javascript
ES6新特性之数组、Math和扩展操作符用法示例
2017/04/01 Javascript
vue中for循环更改数据的实例代码(数据变化但页面数据未变)
2017/09/15 Javascript
浅谈node的事件机制
2017/10/09 Javascript
js中innerText/textContent和innerHTML与target和currentTarget的区别
2019/01/21 Javascript
ES6中的class是如何实现的(附Babel编译的ES5代码详解)
2019/05/17 Javascript
JS基础之逻辑结构与循环操作示例
2020/01/19 Javascript
[01:12]DOTA2 2015年秋季互动指南
2015/11/10 DOTA
Python简单获取二维数组行列数的方法示例
2018/12/21 Python
详解python的argpare和click模块小结
2019/03/31 Python
Python基于机器学习方法实现的电影推荐系统实例详解
2019/06/25 Python
Python 使用folium绘制leaflet地图的实现方法
2019/07/05 Python
菲律宾优惠券网站:MetroDeal
2019/04/12 全球购物
医学专业个人求职自荐信格式
2013/09/23 职场文书
节水倡议书范文
2014/04/15 职场文书
小学生运动会报道稿
2014/09/12 职场文书
2014年单位法制宣传日活动总结
2014/11/01 职场文书
java实现对Hadoop的操作
2021/07/01 Java/Android