ql/sql 循环语句、异常处理、事务处理!
一、ql sql 循环语句?
/*1.loop循环 语法:
声明循环变量
loop
判断循环条件 ,如果循环条件不成立,跳出循if 条件表达式 then
exit;
end if;
语句块;
改变循环变量的值
end loop; 举例:输出1到100以内的自然
*/ declare
--声明循环变量
v_i number(8):=1;
begin
loop
if v_i>100 then-- 判断循环条件,条件成立,跳出循环
exit;
end if;
dbms_output.put_line('输出数字:'||v_i);-- 输出1到100以内的自然数
v_i:=v_i+1; -- 改变循环变量的值
end loop;
end; --需求:输出部门表的所有内容?
--into只能用一个或者一行的方式赋值,我们可以用bulk collect into来给行类型变量整体赋值,也就是说可以一次性
--把所有数据查询出来,为table类型的变量赋值。 declare
-- 声明table类型
type dept_table_type is table of dept%rowtype
index by binary_integer;
-- 声明table类型的变量,用来存储部门表的所有数据
v_dept dept_table_type;
-- 声明循环变量
v_i number(8):=1;
begin
-- 查询所有部门表的内容,放到v_dept变量中
select * bulk collect into v_dept from dept;
loop
if v_i>v_dept.count then --设置条件 结束循环
exit;
end if;
dbms_output.put_line(
'部门编号'||v_dept(v_i).deptno||' 部门名称'||v_dept(v_i).dname||' 部门位置'||v_dept(v_i).loc
);
v_i:=v_i+1; --改变循环变量的值
end loop; end; /**2.while循环 语法:
声明循环变量,给循环变量赋初始值
while 条件表达式
loop
语句块;
改变循环变量的值
end loop; 举例:输出1到100以内的自然 */ declare v_i number(6):=1;-- 声明循环变量
begin
while v_i<101--如果条件成立,执行循环
loop
dbms_output.put_line(v_i);
v_i:=v_i+1;-- 改变循环变量的值
end loop;
end; /**3.for 循环 语法:
for 循环变量 in 循环变量的开始值..循环变量的结束值
loop
语句块;
end loop; 注意:for循环,循环变量可以直接使用,不用声明。in 包含循环变量的开始值和结束值
*/
--举例:输出1到100以内的自然 begin
for v_i in 1..100 -- 循环变量不用声明 真爽!
loop
dbms_output.put_line(v_i);
end loop;
end;
二、异常处理
/**二、异常处理
直接让用户看到程序的信息是不好的,最好以友好的方式输出出来。
*/
--1.内置异常 举例:根据员工编号查询员工姓 declare
--声明员工姓名的变量
v_ename emp.ename%type;
v_num number(5); begin
v_num:=56565;
v_num:=465465465;
select ename into v_ename from emp;
dbms_output.put_line('员工姓名:'||v_ename); exception
-- 当异常发生的时候做什么处理
when no_data_found then
dbms_output.put_line('没有找到该员工编号'); --除数为0的异常
when zero_divide then
dbms_output.put_line('除数不能为0');
when too_many_rows then
dbms_output.put_line('返回行数过多');
when others then
dbms_output.put_line('出现了其他异常'); end; /**2.自定义异常
语法:
declare
--声明异常变量
变量名称 exception;
begin
--抛出异常
raise 变量名称;
exception
-- 处理异常
when 变量名称 then
业务处理
end;
*/
--举例:根据员工编号删除员工信息,如果删除的员工不存在,抛出异常,在控制台打印没有删除成功 declare
-- 声明异常变量
v_myex exception; begin
-- 根据员工编号删除员工
delete from emp where empno=&no;
-- 暂时要用到隐含游标
if sql%notfound then
--抛异常
raise v_myex;
end if;
-- 处理异常
exception
when v_myex then
dbms_output.put_line('要删除的员工不存在'); end;
三、事物处理
/**三、事物处理
事物的acid特性 and 事物的死锁
*/ --1.原子性 数据库增删改操作,要么全部成功,要么全部失败。 /*2.一致性
对于数据库的操作必须符合业务逻辑。
张三给李四转1000元,不能出现张三的钱少了1000 李四就收到800*/ /**3.隔离性
多个数据库操作之间不能产生干扰
张三给李四转1000元,不能出现张三的钱少了1000,结果另外一个人王五的钱多了1000.
*/ /**4.持久性
数据库的操作应该是永久持久化到物理介质(硬盘)上
张三给李四转1000元,不能出现今天张三的钱少了1000. 李四的增加了1000.过了一天张三的钱又回了。
*/ /**5.pl/sql中事物的操作方式
在pl/sql中,可以定义事物的回顾点,可以回顾事物,也可以定义回滚点
savepoint 回滚点名称; 回滚事物
rollback to 回滚点名称; 提交事物
commit; 举例:往部门表中插入多条数据
*/
select * from dept;
begin
-- 定义事物回滚点
savepoint a;
insert into dept values(1,'技术部','郑州');
insert into dept values(2,'公关部','郑州'); -- 回滚事物
rollback to a;
insert into dept values(12,'小卖部','郑州'); -- 提交事物
commit; end; /**6.事物的死锁
数据库中事物如果使用不当,有可能会出现死锁的问题。
爸爸对儿子说,你给我成绩单,我就给你玩具。
儿子对爸爸说,你给我玩具,我就给你成绩单。 7.oracle中锁的概念
oracle中使用锁的机制来实现事物。oracle中分两种常见的锁 排他锁,共享锁。
增删改数据库记录的时候,就会在
操作记录的行上加上排他锁。查询的时候会在查询的记录上加上共享锁。
*/ select * from dept;
insert into dept values(21,'技术部','郑州');
insert into dept values(22,'公关部','郑州'); --模拟两个事物都对 数据库中的部门表1和2 的数据进行更新
update dept set dname='技术部' where deptno=1;
update dept set dname='公关部' where deptno=2;
ql/sql 循环语句、异常处理、事务处理!的更多相关文章
- SQL循环语句 详解
SQL循环语句 declare @i int set @i=1 while @i<30 begin insert into test (userid) values(@i) set @i=@i+ ...
- PL/SQL 循环语句
1.基本 LOOP 循环语句 语法: LOOP 语句序列; END LOOP; 其中,语句序列中需要一个EXIT语句或一个EXIT WHEN语句来中断循环. 实例: DECLARE x ) :; BE ...
- SQL 循环语句几种写法
1.正常循环语句 declare @orderNum varchar(255)create table #ttableName(id int identity(1,1),Orders varchar( ...
- SQL 循环语句 while 介绍 实例
declare @i int begin insert into test (userid) values(@i) end --------------- while 条件 begin 执行操作 en ...
- sql 循环语句几种方式
--第一 declare @orderNum varchar(255) create table #ttableName(id int identity(1,1),Orders varchar(2 ...
- sql 循环语句几种方式(变量循环,游标循环,事务)
--第一 ) ,),Orders )) declare @n int,@rows int --select @rows=count(1) from pe_Orders select @rows = ...
- SQL 循环语句
一.if语句 二.while语句 练习: 三.case when 四.练习 1. 2. 3. 4.
- oracle的控制语句if和循环语句loop while for
pl/sql的控制结构if-then if-then-else if-then-elsif-else 案例1:编写一个过程,可以输入一个雇员名,如果该雇员的工资低于2000,就给该雇员工资增加10% ...
- T——SQL基础语句(定义变量,赋值,取值,分支,循环,存储过程)
T--SQL基础语句 1.定义变量: declare @变量名 数据类型 ; declare @a int ; declare @b nvarchar(10) ; 2.赋值: 法1:set @变量名 ...
随机推荐
- 1046:Square Number
总时间限制: 1000ms 内存限制: 65536kB 描述 给定正整数b,求最大的整数a,满足a*(a+b) 为完全平方数 输入 多组数据,第一行T,表示数据数.对于每组数据,一行一个正整数表示b. ...
- light oj -1245 - Harmonic Number (II)
先举个例子,假如给你的数是100的话,将100/2=50;是不是就是100除100-51之间的数取整为1: 100/3=33;100除50到34之间的数为2,那么这样下去到sqrt(100);就可以求 ...
- 涛思数据 TDengine集群搭建
一.准备 1.设置主机名 hostnamectl set-hostname a.com hostnamectl set-hostname b.com hostnamectl set-hostname ...
- BL8810|USB2.0高速闪存读卡器芯片|BL8810规格书
1.说明 BL8810是一款USB 2.0读卡器控制器,采用高度集成的单芯片解决方案,旨在提供USB2.0和SD.SDHC.mini SD.Micro SD(T-Flash)接口规范之间的高速数据传输 ...
- Capstone CS5265替代龙迅LT8711|设计TYPEC转HDMI2.0投屏方案|替代龙迅LT8711方案
LT8711是一款高性能C型/DP1.2至HDMI2.0转换器,设计用于将USB typec或DP1.2源连接至HDMI2.0接收器.LT8711集成了兼容DP1.2的接收机和兼容HDMI2.0的发射 ...
- CS5210完全替代AG6202|HDMI转VGA不带音频输出的芯片+原理图|替代兼容AG6202
CS5210完全替代AG6202|HDMI转VGA不带音频输出的芯片+原理图|替代兼容AG6202 安格AG6202是一个HDMI转VGA不带音频解决方案,用于实现HDMI1.4高分辨率视频转VGA转 ...
- 编写Java程序,创建一个父类交通工具类(Vehicles),以及两个子类,分别是轿车类(Car)和卡车类(Truck)。
返回本章节 返回作业目录 需求说明: 创建一个父类交通工具类(Vehicles),以及两个子类,分别是轿车类(Car)和卡车类(Truck). 父类有属性品牌(brand)和颜色(color). 在父 ...
- docker学习:docker容器数据卷
是什么 docker的理念 将运用与运行的环境打包形成容器运行,运行可以伴随着容器,但是我们对数据的要求希望是持久化的 容器之间希望有可能共享数据 docker容器产生的数据,如果不通过docker ...
- 在本地开启了代理,postman可以正常发起外部请求,但Java代码却请求失败,已解决
在本地开启了代理,postman可以正常发起外部请求,但Java代码却请求失败,已解决 现象:开了vpn访问公司服务器,postman可以正常发起服务器请求,但是java代码请求失败,连接超时.包括在 ...
- Log4j2进阶使用(按大小时间备份日志)
1.进阶说明 本文介绍Log4j2进阶使用, 基本使用请参考Log4j2基本使用入门. 本文基于上面的基本使用入门, 主要介绍按照日志大小和时间备份日志, 并且限制备份日志的个数, 以及删除过期的备份 ...