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 @变量名 ...
随机推荐
- 实现golang io.Writer支持按照天为单位分割日志
golang中的日志不支持按照天分割,很多开源的日志包都是只支持按照文件大小分割日志,不太利于生产环境中的使用.因此我实现了timewriter,支持: 实现按照天为单位分割日志,可以完美支持gola ...
- 前端项目 node8升级到node16,代码升级汇总
背景 公司的项目是vue项目,环境是node@8x版本的,最近我创建react hook的项目,发现至少需要node14才支持,打开官网才发现node都已经到16版本了.失策啊,失策.于是直接升级到最 ...
- IM2603资料 Type-C 扩展坞电源管理芯片
用于带有集成降压转换器的 Type-C 外围应用的电源管理 IC IM2603 是一款主要用于 Type-C 外围应用的电源管理 IC. 它集成了一个带有内置高侧 MOSFET 的同步降压转换器和一个 ...
- 编写Java程序,利用List实现报数游戏的实现思路
返回本章节 返回作业目录 需求说明: 利用List实现报数游戏 在控制台输入一个大于3的正整数,该整数表示有多少人,如在控制台输入10,表示有10个人,10个人围成一个圆圈,从序号1开始为这些人依次编 ...
- Python之路 - Day4 - Python基础4 (新版)
本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 1.列表生成式,迭代器&生成器 列表生成式 孩子,我现在有个需 ...
- VC 2010 Express 学生版(中文版)
Microsoft Visual C++ 2010 Express 学生版 下载传送门(提取码:r7sm) 如何安装 拿到压缩文件后,解压到桌面(别怕,安装完后这个文件夹是可以删除的). 在 &quo ...
- vue备用
handleCheck (item) { if (item.isChecked) { this.checkData.push(item.id) this.checkData = _.uniqWith( ...
- GeoServer介绍
GeoServer本质上是一个地图服务器,它是遵循OpenGIS Web 服务器规范的J2EE实现,通过它可以方便的将地图数据发布为地图服务,实现地理空间数据在用户之间的共享.另外,它也提供了相应的接 ...
- 【Android】安卓四大组件之Activity(一)
[Android]安卓四大组件之Activity(一) 前言 Activity是Android学习中的一个重要组件,想要对其进行系统的了解可以分为几块内容,这一大章节的内容是有关于activity之间 ...
- Three.js之绘制物体的边框及修改lineWidth
本博文主要记录如何使用three.js绘制物体的边框及修改其lineWidth.three.js是个技术点比较多,查询资料又比较少的框架,单单就这个修改lineWidth就是一个坑.先放一个动态的效果 ...