文章详情

短信预约信息系统项目管理师 报名、考试、查分时间动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Oracle学习(七) --- PL/SQL(二) 游标、储存过程、自定义函数、触发器

2022-02-04 12:04

关注

Oracle学习(七) --- PL/SQL(二) 游标、储存过程、自定义函数、触发器

1、PL/SQL -- 游标

1.1、什么是游标

当在PL/SQL中使用SQL语句时,Oracle会为其分配上下文区域,这是一段私有的内存区域,用于暂时保存SQL语句影响到的数据。游标是指向这段内存区域的指针。游标并不是一个数据库对象,只是留存在内存中。

1.2、语法

declare
	--声明游标
	cursor 游标名称 is 查询语句;
begin
	open 游标名称;
	loop;
		-- 给游标指向当前行进行命名,方便获得当前行的数据
		fetch 游标名称 into 变量;
		-- 使用当前行数据
		-- 结束信息
		exit when 游标名称%notfound;
	end loop;
	close 游标名称;
end;

1.3、使用

---需求:打印业主类型为1的价格表
-- 方式1:游标基本操作
declare
   --声明游标
   cursor cur_pricetable is select * from t_pricetable where ownertypeid = 1;
   --声明变量,可以存放一条记录
   v_pricetable t_pricetable%rowtype;
begin
   --开启
   open cur_pricetable;
   
   loop
     -- 游标指向有数据,打印价格
     fetch cur_pricetable into v_pricetable;
     -- 没有数据,退出
     exit when cur_pricetable%notfound;
     -- 打印
     dbms_output.put_line(v_pricetable.price);
     
   end loop;
   
   --关闭
   close cur_pricetable;
end;
-- 方式2:for循环
declare
   -- 声明游标
   cursor cur_pricetable is select * from t_pricetable where ownertypeid = 2;
   -- 变量
   v_pricetable t_pricetable%rowtype;
begin
   -- for遍历
   for v_pricetable in cur_pricetable
     loop
       dbms_output.put_line(v_pricetable.price);
     end loop;
end;

1.4、有参数游标

--- 具有参数的游标
declare
   -- 声明游标
   cursor cur_pricetable(v_ownertypeid number) is select * from t_pricetable where ownertypeid = v_ownertypeid;
   -- 变量
   v_pricetable t_pricetable%rowtype;
begin
   -- for遍历
   for v_pricetable in cur_pricetable(3)
     loop
       dbms_output.put_line(v_pricetable.price);
     end loop;
end;

2、储存过程

储存过程是Oracle开发者在数据转换或查询报表时,最经常用的方式之一。储存过程是一种命名 PL/SQL 程序块,它将一些相关的 SQL 语句、流程控制语句组合在一起,用于执行某些特定的操作或任务,可以将经常需要执行的特定的操作写成过程。通过过程名,就可以多次调用过程,从而实现程序的模块化设计,这种方式极大地节省了用户的时间,也提高了程序的效率。

2.1、概述

在 Oracle 中,可以在数据库中定义子程序,在子程序中将一些固定的操作集中起来,由Oracle数据库服务器完成,以完成某个特定的功能。这种子程序称为储存过程(Proce-Dure)。存储过程可以通俗地理解为是储存在数据库服务器中的封装了一段或多段SQL语句的PL/SQL代码块。在数据库中有一些是系统默认的储存过程,那么可以直接通过储存过程的名称进行调用。

使用储存过程具有如下一些优点:

2.2、语法

create [or replace] procedure 存储过程名称
(参数名 参数模式 类型,参数名2 参数模式 类型,....)
is|as
  --变量声明
begin
  --逻辑代码
end;
--参数模式:in、out、 in out

2.3、创建存放过程排错

3、自定义函数

3.1、概述

3.2、语法

-- 语法
create function 函数名
(参数名 参数类型, ....)
	--注意:return 没有分号
	return 返回值类型
is
	--变量
begin
	--代码
	return 返回值;
end;
--需求: 创建函数,根据地址ID查询地址名称。
create or replace function getaddressname
(v_id number)
    return varchar2
is
  v_name t_address.name%type;  
begin
  -- 查询
  select name into v_name from t_address where id = v_id;
  -- 返回
  return v_name;
end;

-- 测试
select getaddressname(1) from dual;

4、触发器

触发器是一种在发生数据库事件时能够自动运行的PL/SQL代码块,它与特定表或视图上的操作相关联。注意储存过程是由用户直接调用的,而对于触发器的执行用户则不能直接调用,Oracle会在相应的事件发生时,自动调用触发器。触发器是许多关系数据库系统都提供的一项技术。

4.1、触发器概述

触发器是一种特殊的储存过程,它与数据表紧密联系,用于保护表中的数据,当一个定义了特定类型触发器的基表执行插入、修改或删除表中数据的操作时,讲自动触发触发器中定义的操作,以实现数据的一致性和完整性。

4.2、触发器的作用

4.3、触发器的分类

按照触发事件的不同,触发器可以分为不同的类型。

(1) 触发事件不同,可分为:

(2) 按触发时间(根据指定的事件和触发器执行的先后次序)不同,可分为:

(3) 按触发级别不同,可分为:

在Oracle系统里,触发器类似过程和函数,它们都有声明、执行逻辑处理部分和异常处理部分,并且被存储在数据库中。

4.4、触发器的执行顺序

触发器的执行,是由触发事件激活的,并由数据库服务器自动执行的。一个数据表上可能定义了多个触发器,比如多个BEFORE 触发器,多个AFTER 触发器等。同一个表上的多个触发器激活时遵循如下的执行顺序:

对于同一个表上的多个 BEFORE(AFTER)触发器,遵循【谁先创建谁先执行】的原则,即按照触发器创建的时间先后顺序执行。

4.5、创建触发器的语法

create trigger 触发器名称
before | after 			--前置触发器、后置触发器
update of 列名			--更新时触发,取值:insert/update/delete
on 表					--触发器检测的表
for each row			 -- 检测表中的每一行数据
declare
	--声明
begin
	--可以通过规定的关键字,获得对应数据
		-- :old 之前的数据(一行)
		-- :new 现在的数据(一行)
end;
---需求:当用户输入本月累计表数后,自动计算出本月使用数 。
---  当 t_account 表 num1 发生更新时,将自动更新 usenum列
create or replace trigger tri_account_usenum
  before
  update of num1
  on t_account
  for each row
declare
  -- 声明
begin
  -- 获得最新的数据 num1 - num0 结果赋值 usenum
  :new.usenum  :=  :new.num1 - :new.num0 ;
end;

--测试
update t_account set num1 = 13000 where id = 43;
commit;
-- 查看 usenum 是否自动更新
select * from t_account where id = 43;

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯