PL/SQL ,存储过程 , 触发器

Oracle PL/SQL:存储过程、函数与触发器实战指南 Oracle数据库是全球范围内广泛使用的关系型数据库管理系统(RDBMS),其SQL语言是数据库操作的标准。PL/SQL是Oracle提供的过程化语言扩展,它在SQL的基础上添加了变量、控制流和编程结构,使得复杂数据操作更为高效和结构化。本章将概述PL/SQL的核心特点,其在数据库开发中的重要性以及如何开始编写简单的PL/SQL程序。我们将通过代码块和解释来展示PL/SQL的基本语法,以及如何利用PL/SQL实现数据的批量处理、事务控制和数据操作封装。 阅读详情

PL/SQL

PL/SQL的基本概念

PL/SQL也是一种程序语言,叫做过程化SQL语言,PL/SQL是Oracle对SQL语言的扩展,在普通的SQL语句的使用上增加了编程语言的特点,所以PL/SQL把数据操作和查询语句组织在PL/SQL代码的过程性单元中,通过逻辑判断,循环等操作实现复杂的功能或者计算.

打印输出:hello world

SET SERVEROUTPUT ON; --开启打印功能
BEGIN --过程开始
	DBMS_OUTPUT.put_line('hello world');--过程代码
END;--过程结束
/

在这里插入图片描述

定义变量

注意:PL/SQL中赋值符号为":=",键盘输入的符号为"&",字符串连接用"||",如果声明了变量但没有赋值默认为空

DECLARE -- 声明
	num NUMBER; --定义变量
BEGIN 
	num:=#--等待键盘输入num的值
	DBMS_OUTPUT.put_line('num的值为:'||num);
END;
/

在这里插入图片描述

定义常量

注意:常量使用CONSTANT修饰,而且必须有初始值且常量不能重新赋值.

DECLARE
	num CONSTANT NUMBER :=120 ; ---常量必须赋初值,
BEGIN 
	DBMS_OUTPUT.put_line('常量num的值为:'||num);
END;
/

在这里插入图片描述

%TYPE与%ROWTYPE定义的变量类型

DECLARE 
	v_no emp.empno%TYPE;   --表示num的类型为emp表中的empno的字段类型
	result emp%ROWTYPE;    --表示这个变量可以接受emp表中的所有字段的数据
BEGIN
	v_no:=&empno;
	SELECT * INTO result
		FROM emp
		 WHERE empno = v_no;
	DBMS_OUTPUT.put_line('姓名:'||result.ename||' , 部门编号:'||result.deptno||' , 薪水:'||result.sal||' , 领导编号:'||result.mgr||' , 职位:'||result.job);
END;
/

在这里插入图片描述

IF的使用

DECLARE
	num NUMBER;
BEGIN
	SELECT COUNT(*) INTO num
		FROM emp;
 	IF num > 10 THEN
 		DBMS_OUTPUT.put_line('数据量大于10');
 	END IF;  --表示if结束
 END;
 /

在这里插入图片描述

IF ELSE

DECLARE
	num NUMBER;
BEGIN
	num:=#
 	IF num > 10 THEN
 		DBMS_OUTPUT.put_line('数据大于10');
 	ELSE
 		DBMS_OUTPUT.put_line('数据小于10');
 	END IF;  --表示if结束
 END;
 /

在这里插入图片描述

ELSIF

DECLARE
	num NUMBER;
BEGIN
	num:=#
 	IF num > 10 THEN
 		DBMS_OUTPUT.put_line('数据大于10');
 	ELSIF num = 10 THEN
 		DBMS_OUTPUT.put_line('数据等于于10');
 	ELSE
 		DBMS_OUTPUT.put_line('数据小于10');
 	END IF;  --表示if结束
 END;
 /

在这里插入图片描述

存储过程

存储过程Procedure是一组为了完成特定功能的SQL语句集合,之前的pl/sql只能编写一次执行一次或多次,但是不能将其保存起来下次使用.如果要让其继续生效则应该将这个过程存储起来,于是就出现了存储过程的概念,经编译后存储在数据库中,用户通过存储过程的名称并给出参数来调用.

调用过程输出 hello world

--创建存储过程
CREATE OR REPLACE PROCEDURE say_hello
AS
BEGIN
	DBMS_OUTPUT.put_line('hello world');
END;
/

在这里插入图片描述

--使用命令执行存储过程
EXEC say_hello()

在这里插入图片描述

有参数参与的存储过程

--创建存储过程
CREATE OR REPLACE PROCEDURE print_add(
	a NUMBER ,
    b NUMBER
)
AS
BEGIN
	DBMS_OUTPUT.put_line('a+b'||(a+b));
END;
/

在这里插入图片描述

--使用命令执行存储过程
EXEC print_add(10,20);

在这里插入图片描述

存储过储的输出和输入参数

如果过程的参数是IN修饰的则表示该参数需要在调用的时候传递进来,如果是OUT修饰的则表示可以被返回,如果不写默认就是IN

--创建存储过程
CREATE OR REPLACE PROCEDURE print_sum(
	a IN NUMBER , --这是一个输入参数,表示调用过程时需要传递进来
    b IN NUMBER , --这是一个输入参数,表示调用过程时需要传递进来
    c OUT NUMBER  --这是一个输出但是,表示这个参数可以被返回
)
AS
	result NUMBER; --这是过程的局部变量
BEGIN
	result := a+b;
	c := result*10;
END;
/
--执行
DECLARE 
	r NUMBER;
BEGIN
	print_sum(10,20,r);
	DBMS_OUTPUT.put_line('返回的r值为:'||r);
END;
/

在这里插入图片描述

触发器

触发器在数据库中是一独立的对象存储的,它与存储过程和函数不同的是:存储过程与函数需要用户调用才会执行,而触发器是由一个事件来触发运行的.即触发器是当某个事件发生时自动运行,并且,触发器不能接收参数.

Oracle的事件是指对数据库的表进行的,INSERT,UPDATE,DELETE操作或对视图进行类似的操作.

语句级触发器(表级触发器)

语句级触发器是对每个DML语句执行一次,如果一条INSERT语句在表中插入500行,那么这个表上的触发器只执行一次.

--创建触发器
CREATE OR REPLACE TRIGGER emp_trigger
	BEFORE INSERT OR DELETE --在增加或删除数据之前触发
ON emp  --表示触发器建立在emp数据表上
DECLARE --声明变量
v_date VARCHAR2(30);
BEGIN
	SELECT TO_CHAR(SYSDATE,'day')  INTO v_date FROM dual; --获得当前是星期几
	IF v_date ='星期六' OR v_date ='星期日' THEN
		--RAISE_APPLICATION_ERROR  抛出错误在 -20999 到 -20000 之间
    	RAISE_APPLICATION_ERROR(-20001,'周末不能办理入职或离职手续!!');
    END IF;
END;
/

在这里插入图片描述

添加数据测试

在这里插入图片描述

行级触发器

对于行级触发器,只要有一条数据被影响就会触发一次

--创建触发器
CREATE OR REPLACE TRIGGER emp_trigger
	BEFORE INSERT --在增加数据之前触发
ON emp  --表示触发器建立在emp数据表上
FOR EACH ROW  --表示是行级的触发器,不写就表示是表级触发器
BEGIN
	IF :new.sal>10000 THEN
		RAISE_APPLICATION_ERROR(-20001,'给的工资太高了,公司要破产的!!!!');
	ELSIF :new.sal<1000 THEN
		RAISE_APPLICATION_ERROR(-20002,'给的工资太低了!!!!!');
	END IF;
END;
/

添加人员触发触发器

在这里插入图片描述

利用触发器实现级联更新

--创建触发器
CREATE OR REPLACE TRIGGER dept_trigger
	BEFORE UPDATE OF deptno --指定了更新demp表中的deptno字段之前会触发触发器
ON dept  
FOR EACH ROW
BEGIN
	UPDATE emp SET deptno = :new.deptno WHERE deptno = :old.deptno;
END;
/

修改了dept表中的deptno字段,emp表中的字段也会跟着变化

在这里插入图片描述

注意: 在INSERT是:new表示新插入的数据,在UPDATE时,:new表示要替换的数据,:old表示原来要被更改的数据,

无人机上下通信信号解析程序和代码 总的来说,无人机上下行信号解析是无人机系统中非常重要的一部分,它关系到无人机的飞行控制和图像传输能力,对于保障无人机的飞行安全和数据传输质量具有重要作用。3. 读取和解析地面控制中心发送的命令和数据:程序还需要能够读取地面控制中心发送给无人机的命令和数据。1. 读取和解析无人机发送的命令和数据:程序需要能够读取无人机发送的信号,并解析其中的命令和数据。4. 将解析结果传递给无人机:解析地面控制中心发送的命令和数据后,程序需要将解析结果传递给无人机。具体的实现方式可以根据无人机的通信协议和硬件设备来确定。 阅读详情

相关推荐

直流有刷电机三环PID控制:从硬件配置到软件调试全解析

本文全面解析了直流有刷电机的三环PID控制技术,涵盖从硬件选型(如驱动板、编码器)到STM32软件配置的全过程。详细阐述了位置环、速度环、电流环的串级协同工作原理与调试方法,并提供了位置式PID算法的C语言实现代码及参数整定技巧,旨在帮助开发者实现精准、稳定的电机运动控制。

weixin_29290963的博客 387

存储过程中将sql语句结果赋值给变量

createprocedureprocnameASdeclare@recountintselect@recount=count(id)fromschool--最关键在这句select@recount=count(id)fromschoolselect@recount=selectcount(id)fromschool--错误:这里就不再需要select了set@...

weixin_30416871的博客 451

告别串口升级!手把手教你为STM32H750的W25Q32制作MDK下载算法(QSPI篇)

本文详细介绍了为STM32H750的W25Q32制作MDK下载算法(QSPI篇)的完整流程,帮助开发者告别低效的串口烧录方式。通过定制下载算法,可实现20倍以上的烧录速度提升,支持完整的调试功能,显著提高开发效率。文章涵盖环境准备、核心算法实现、性能优化及常见问题解决方案,适合嵌入式开发者参考。

weixin_30735745的博客 403

Oracle 中的 PL/SQL

PL/SQL语句在SQL命令语言中增加了过程处理语句(如分支、循环等),使SQL语言具有了过程处理的能力。end;和学其他语言一样,在最开始的时候我们试一试打印hello world!begin-- 设置控制台输出内容可见');end;

KevinChen2019的博客 713

手把手拆解UCIe协议层:从Raw Mode到Flit Mode,数据包到底经历了什么?

本文深入解析UCIe协议层的数据包处理机制,从Raw Mode到Flit Mode的三大变体(Standard 256B、68B-Enhanced、Latency-Optimized),详细揭示数据包在不同模式下的封装与转换过程。通过工程师视角,展示协议层如何实现多模式动态切换、错误恢复及与D2D Adapter的协同设计,为芯片级互连技术提供实践指导。

weixin_28728495的博客 239

数据库和BI工程师面试题

 一.数据库 1.Oracle数据库,视图与表的区别?普通视图与物化视图的区别?物化视图的作用? 2.Oracle数据库,有哪几类索引,分别有什么特点? 3.Union与Union All的区别? 4.对游标的理解?游标的分类?使用方法? 5.如何查找和删除表中的重复数据?给出方法或SQL。 6.不借助第三方工具,怎么查看SQL的执行计划? 7.创建索引有哪些需要注意的要点?

web_go_run的专栏 1万+

Oracle 数据库的PLSQL块,游标、函数,存储过程与触发器的使用方法与案例

Oracle 数据库的PLSQL块,游标、函数,存储过程与触发器的使用方法与案例

头好重好重的博客 5907

C#里使用NModbus来创建一个TCP从站服务

摘要:本文介绍了一个用C#实现的Modbus TCP从站服务器,基于.NET Framework 4.6.1开发。代码使用NModbus库创建TcpListener和ModbusSlaveNetwork,支持设置IP地址、端口号和从站ID。服务器实现了数据存储初始化功能(包括线圈和保持寄存器),并提供了启动/停止操作的UI界面和日志记录功能。该解决方案适用于需要调试Modbus TCP协议的场景,特别适合无法升级到更高版本.NET Framework的环境。

大坡3D软件开发 478

SQL的触发器和存储过程,一文学会!

存储过程的应用场景包括存储过程可以包含复杂的查询语句,进行数据的筛选、排序和分组等操作。存储过程可以进行数据的处理和转换,如数据的格式转换、数据的合并和拆分等操作。存储过程可以用于数据的约束和校验,保证数据的合法性和完整性。

杨荧的优快云博客 1892

【Bug已解决】NCCL timeout for validation 解决方案

训练用多卡 DDP / FSDP 正常,但一到或者进程直接 hang 在 eval 的某个集合通信上。最迷惑的是:训练阶段(有集合通信)完全正常,偏偏 eval 阶段(看起来更轻量)超时。因为 eval 阶段某些 rank 没参与 collective,导致参与的那部分 rank 永远等不到同伴。

一键难忘的博客 142

构建栅格地图matlab代码

1 使用MATLAB实现地图栅格化 效果图如下所示 图1 ...

qq_59747472的博客 4518

pl/sql篇之触发器

触发器是数据库独立编译,存储的对象,是数据库重要的技术。和函数不同,触发器的执行是主动的,它监控着数据库,满足其触发条件自动触发,便于我们对数据库的管理。所以给出了替代触发器。由于触发器的隐蔽性,数据更新失败,难以追溯,逻辑的修改需要修改源码,由于触发器的源码可读性较差,导致这一过程,变得更加麻烦。ORACLE可以在DML(数据更新语句)进行触发,可以在DML操作前或操作后进行触发,并且可以对每个行或语句操作上进行触发。触发器的触发条件在事件发生前或发生后,主要用于DML语句下,触发的,一共有12种类型。

weixin_73368873的博客 2194

RabbitMQ高级特性 - 生产者消息确认机制

为了保证信息 从生产者 发送到 队列,因此引入了生产者的消息确认机制.通过事务机制实现.通过发送确认机制(confirm 和 return)实现.因为事务机制比较消耗性能,在实际工作中用的也不多,因此这里主要介绍confirm 和 return机制来实现发送放的确认.a)confirm 确认模式如上图,confirm 确认模式主要保障于 生产者 到 交换机 的消息可靠性.如果 Exchange成功收到消息,那么 ConfirmCallback 这个回调 ack 参数就为true。

CYK_byte的博客 1886

PL/SQL之存储过程修改学生学号及触发器实现一致性

(1)创建三个表:Student(S#, Sname, age), Course(C#, cname, credit), SC(s#, c#, score),其中SC的S#和C#都是外键,分别引用Student表的S#和Course表的C#。请首先在各自表中插入若干条记录,然后用存储过程实现修改指定学生的学号。(2)创建两个表:系表:Dept(D#, Dname, S_Count) ,其中S_cou

Bonjour~ 4400

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

PL/SQL ,存储过程,函数,触发器

 --PL/SQL --声明变量 a number :=10; a int :10; s varchar2(30) :='你在哪呢'; -- --for 语句 declare a int := 10; i int := 1; j int; begin for j in 1 .. a loop i := i * j; end loop; dbms_output

shixiaoxin1992的博客 431

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Oracle第四章PL/SQL——存储过程,触发器

- 创建存储过程 DepSalary-- 定义游标-- 定义变量BEGIN-- 打开游标-- 循环遍历结果集LOOP-- 从游标中检索数据-- 退出循环条件-- 在屏幕上输出结果END LOOP;-- 关闭游标-- 执行存储过程DECLAREBEGIN-- 获取当前系统日期作为删除日期-- 插入删除记录到 EmployeeBackup 表END;

m0_75103840的博客 803

ORACLE数库之PL/SQL高级篇 存储过程,函数,包,触发器的使用

PL/SQL高级编程部分无名块不存储在数据库中,并且不能从其他的PL/SQL块中调用有名块存储在数据库数据字典中,可以在客户端与服务器端的任何工具和任何应用中运行(1).存储过程 (2).存储函数 (3).包 (4).触发器过程执行某一动作,函数计算一个值,包将相关的过程函数逻辑上捆绑在一起,触发器隐式执行某一动作存储过程和函数是把一个PL/SQL块编译后存进数据库数据字典中,

ALPS 3644

Oracle PL/SQL存储过程,函数,包,触发器的使用

PL/SQL高级编程部分 无名块不存储在数据库中,并且不能从其他的PL/SQL块中调用 有名块存储在数据库数据字典中,可以在客户端与服务器端的任何工具和任何应用中运行 (1).存储过程 (2).存储函数 (3).包 (4).触发器 过程执行某一动作,函数计算一个值,包将相关的过程函数逻辑上捆绑在一起,触发器隐式执行某一动作 存储过程和函数是把一个PL/SQL块编译后存进

木头的专栏 498

【PL/SQL】匿名块、存储过程、函数、触发器

名词解释 子程序:PL/SQL的过程和函数统称为子程序。 匿名块:以DECLARE或BEGIN开始,每次提交都被编译。匿名块因为没有名称,所以不能在数据库中存储并且不能直接从其他PL/SQL块中调用。 命名块:除匿名块之外的其他块。包括过程、函数、包和触发器。可以在数据库中存储并在适当的使用运行。 子程序的优点: 1)具有扩展性 可以自定义PL/SQL语言以满足实际应用 2)高可用和

Just Do IT 3090

【Java EE 学习 29 上】【PL/SQL】【存储过程】【存储函数】【触发器】

一、PL/SQL简介   1.概念:PL/SQL语言是Oracle数据库专用的一种高级程序设计语言,是对标准SQL语言进行了过程化扩展的语言。   2.功能:既能够实现对数据库的操作,也能够通过过程化语言中的复杂逻辑结构完成复杂的业务逻辑。   3.特点     (1)与SQL语言紧密集成,所有的SQL语句在PL/SQL中都能够得到支持。     (2)减小网络流量,提高应用程...

190

oracle PL/SQL程序设计、函数、存储过程、触发器练习

--求圆的面积。Pi为常量,半径可以输入 set serveroutput on declare pi constant number(3,2):=3.14; r number(5,2):=&a; area number(8,2); begin area:=pi*r*r; dbms_output.put_line('圆的面积时'||area); end; --计算某个数字的平方值,使用替代变量来提供这个数字的值。然后在屏幕上显示处理结果。 set serveroutput on declare

Faulen的博客 1129

oracle数据库---PL/SQL、存储函数、存储过程、触发器、定时器job、备份

本文介绍了oracle数据库的PL/SQL、存储函数、存储过程、触发器、定时器job的使用方法,附代码及案例

m0_63845988的博客 2012

使用pl/sql developer开发工具无法编译存储过程,触发器,包等程序文件

转自:http://hi.baidu.com/cc37du/blog/item/f4e083112284a311b9127b36.html OS:RHAS 4EBS:11.5.10.2 问题:使用pl/sql developer开发工具无法编译存储过程

Vic_Wang的专栏 2107

PL/Sql Dev调试Oracle存储过程、触发器、函数

PL/Sql Dev调试Oracle存储过程、触发器、函数 本处以调试函数为例,其他的调试与此相同   1.调试位置   通常情况下,要在pl/sql Dev中调试程序有两个地方:   1).新建->测试窗口:  www.2cto.com          2).在要调试的程序上点击右键->测试      2.调试过程   1).通过调试位置进入测试窗口,如

haiross的专栏 2439
上一篇: Oracle 查询03
下一篇: JDBC与mysql
swop_
博客等级 码龄8年 39粉丝 34原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值