返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >快速学习Oracle触发器和游标
  • 438
分享到

快速学习Oracle触发器和游标

2024-04-02 19:04:59 438人浏览 薄情痞子
摘要

目录触发器:1、 创建一个用于记录用户操作的触发器2、创建一个当删除部门时,删除该部门下的所有雇员的触发器3、创建一个在account表插入记录之后,更新myevent数据表的触发器

触发器:

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;
/

在这里插入图片描述

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;
/

在这里插入图片描述


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;
/

在这里插入图片描述


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;
/

在这里插入图片描述


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;
/

在这里插入图片描述


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;
/

在这里插入图片描述


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触发器和游标内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 快速学习Oracle触发器和游标

本文链接: https://lsjlt.com/news/129514.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • 快速学习Oracle触发器和游标
    目录触发器:1、 创建一个用于记录用户操作的触发器2、创建一个当删除部门时,删除该部门下的所有雇员的触发器3、创建一个在account表插入记录之后,更新myevent数据表的触发器...
    99+
    2024-04-02
  • 游标和触发器
    第八章  游标和触发器   初识游标 在PL/SQL块中执行SELECT、INSERT、DELETE和UPDATE语句时,ORACLE会在内存中为其分配上下文区(Context Area),即缓冲区。游标是指向该区的一个指...
    99+
    2021-03-07
    游标和触发器
  • Oracle触发器和游标的示例分析
    小编给大家分享一下Oracle触发器和游标的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!触发器:1、 创建一个用于记录用户操作的触发器  创建一个dep...
    99+
    2023-06-20
  • Oracle学习(七) --- PL/SQL(二) 游标、储存过程、自定义函数、触发器
    1、PL/SQL -- 游标 1.1、什么是游标 当在PL/SQL中使用SQL语句时,Oracle会为其分配上下文区域,这是一段私有的内存区域,用于暂时保存SQL语句影响到的数据。游标是指向这段内存区域的指针。游标并不是一个数据库对象,只是...
    99+
    2022-02-04
    Oracle学习(七) --- PL/SQL(二) 游标 储存过程 自定义函数 触发器
  • sqlserver中怎么实现触发器和游标
    本篇文章为大家展示了sqlserver中怎么实现触发器和游标,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。代码如下: Create trigger tri_wk_...
    99+
    2024-04-02
  • MySQL学习笔记(12):触发器
    本文更新于2019-06-23,使用MySQL 5.7,操作系统为Deepin 15.4。 目录SQL语句示例 SQL语句 为了便于描述,此处将创建触发器的DDL复述一次,其已于“SQL”章节描述。 CREATE TRIGGER ...
    99+
    2021-06-20
    MySQL学习笔记(12):触发器
  • Oracle 学习之性能优化(二)游标
      游标是cursor的中文翻译,那么到底什么是cursor呢?Oracle Concept中是这样描述的:  When an application issues a SQL stat...
    99+
    2024-04-02
  • MySQL中触发器和游标的介绍与使用
    触发器简介 触发器是和表关联的特殊的存储过程,可以在插入,删除或修改表中的数据时触发执行,比数据库本身标准的功能有更精细和更复杂的数据控制能力。 触发器的优点: 安全性:可以...
    99+
    2024-04-02
  • Go语言开发快速学习CGO编程
    目录快速上手 CGO 程序基于 C 标准库实现最简单的 CGO 程序基于自己写的 C 函数构建 CGO 程序模块化以上例子用 Go 实现 C 函数并导出用 C 接口的方式实现 Go ...
    99+
    2023-05-14
    Go语言开发CGO编程 CGO编程
  • 如何快速学习PHP CMS系统开发
    PHP CMS系统开发是网站开发的一种重要形式,也是一个开发者必须掌握的技能之一。通过学习PHP CMS系统开发,可以轻松快速搭建起一个完整、高效的网站。并且,通过CMS系统开发,我们...
    99+
    2024-04-02
  • 如何快速学习PHP CMS系统开发
    PHP CMS系统开发是网站开发的一种重要形式,也是一个开发者必须掌握的技能之一。通过学习PHP CMS系统开发,可以轻松快速搭建起一个完整、高效的网站。并且,通过CMS系统开发,我们...
    99+
    2024-04-02
  • 对比索引、视图、游标、存储过程和触发器
    1、索引        1-1、索引的概述                 我们把一个表中的一列或者多列和列中元素所在表中记录的物理地址组合成一个新的表。这个表的记录大致为列的内容和该列所在记录的物理地址。        1-2、...
    99+
    2020-01-22
    对比索引 视图 游标 存储过程和触发器
  • 没有基础如何快速学习HTML5开发
    这篇文章主要介绍“没有基础如何快速学习HTML5开发”,在日常操作中,相信很多人在没有基础如何快速学习HTML5开发问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法...
    99+
    2024-04-02
  • Oracle DML触发器和DDL触发器实例详解
    目录一、概念二、DML触发器2.1、语句触发器2.2、行级触发器2.3、DML触发器语法:2.4、触发器谓词:2.5、实例说明三、DDL 触发器3.1、DDL触发器语法3.2、DDL 事件3.3、可用属性3.4、实例说明...
    99+
    2023-03-13
    oracle 触发器 oracle触发器语句 oracle创建触发器语句
  • Oracle DML触发器和DDL触发器实例详解
    目录一、概念二、DML触发器2.1、语句触发器2.2、行级触发器2.3、DML触发器语法:2.4、触发器谓词:2.5、实例说明三、DDL 触发器3.1、DDL触发器语法3.2、DDL...
    99+
    2023-03-13
    oracle 触发器 oracle触发器语句 oracle创建触发器语句
  • Oracle DML触发器和DDL触发器怎么使用
    今天小编给大家分享一下Oracle DML触发器和DDL触发器怎么使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧...
    99+
    2023-07-05
  • Linux 开发技术和 Go 学习笔记:如何快速入门?
    随着互联网行业的飞速发展,Linux 开发技术和 Go 编程语言成为了越来越多开发者的必备技能。本文将为大家介绍如何快速入门 Linux 开发技术和 Go 编程语言,并穿插演示代码,帮助大家更好地理解和掌握相关知识。 一、Linux 开发...
    99+
    2023-11-02
    学习笔记 linux 开发技术
  • 【机器学习】Python 快速入门笔记
    Python 快速入门笔记Xu An   2018-3-7 1、Python print#在Python3.X中使用print()进行输出,而2.x中使用()会报错 print("hello world")  print('I\'m app...
    99+
    2023-01-31
    入门 机器 快速
  • PHP和Git一起学习,如何快速入门?
    随着互联网技术的快速发展,PHP和Git已经成为了很多Web开发人员必须学习的技能。PHP是一种开源的脚本语言,它可以被嵌入到HTML中,用于Web开发。而Git则是一种分布式版本控制系统,可以用于管理代码库。本文将介绍如何快速入门PHP...
    99+
    2023-10-24
    git 教程 numpy
  • 机器学习教程,Python3天快速入门机
    人工智能,现今已经是好多程序员都想学习的技能,毕竟人工智能这么火,对不对?你是否也想学习呢?今天就分享一个机器学习教程,Python3天快速入门机器学习! 该课程是机器学习的入门课程,主要介绍一些经典的传统机器学习算法,如分类算法:KNN算...
    99+
    2023-01-31
    入门 机器 快速
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作