四、Oracle loop循环、while循环、for循环、if选择和case选择、更改读取数据、游标、触发器、存储过程
数据库的设计(DataBase Design):
针对于用户特定的需求,然后我们创建出来一个最使用而且性能高的数据库!
数据库设计的步骤:
01.需求分析
02.概念结构设计
03.逻辑结构设计
04.物理结构设计
05.数据库的实施
06.数据库的运行和维护
数据库的3大范式:
1.确保每列的原子性!每一列都是一个不可再分的数据!
2.确保每列都和主键相关!
3.确保每列都和主键有直接的管理,而不是间接依赖(传递依赖)!
PL/SQL: (Procedural Language) 过程化sql语言!
在我们之前的sql语句中增加了选择或者是逻辑判断!
数据库在执行PL/SQL语句的时候,PL和SQL是分别执行的!
|| 拼接字符串
:= 赋值运算符
= 比较运算符 类似与java中的==
.. 范围运算符
!= <> ~= ^= 不等于
and 逻辑与
or 逻辑或
not 取反
PL/SQL语法:
1.declare 可选部分 ==》声明
2.begin 必须有 ==》书写sql 和 pl/sql
3.exception 可选部分 ==》异常
4.end 必须有 ==》pl/sql代码块结束
案例1: loop循环语法:
loop
执行的语句;
exit when 条件;
end loop;
declare
--声明部分
i number;
begin
--代码开始 i := 1;
loop
--循环开始
dbms_output.put_line(i); --输出语句
i := i + 1;
exit when i = 10;
end loop; --循环结束 end; --结束部分
案例2:while循环语法:
while 条件 loop
执行的语句;
end loop;
declare
--声明部分
i number; begin
--代码开始 i := 1;
while i < 20 loop
--循环开始
dbms_output.put_line(i); --输出语句
i := i + 1;
end loop; --循环结束 end; --结束部分
案例3:for循环语法:
for 变量 in 范围 loop
执行的语句;
end loop;
declare
--声明部分
i number; begin
--代码开始 for i in 1 .. 30 loop
--循环开始
dbms_output.put_line(i); --输出语句
end loop; --循环结束 end; --结束部分
案例4:根据老师的薪水输出不同的语句!
if选择结构 和 case选择结构
-- 根据teacher表中的sal 来输出不同的语句
declare
t_name teacher.tname%type; --说t_name的类型根据teacher表中tname的类型来决定
t_sal teacher.sal%type;
t_result varchar2(50);
begin
--开始
select tname, sal into t_name, t_sal from teacher where tno = 1002; --查询指定老师的薪水 if t_sal > 5000 and t_sal < 10000 then
-- 多重if
t_result := '一级';
elsif t_sal >= 10000 and t_sal < 20000 then
t_result := '二级';
else
t_result := '高级';
end if;
--根据t_result的值来判断输入语句 switch
case t_result
when '一级' then
dbms_output.put_line('哈哈....');
when '二级' then
dbms_output.put_line('一般般....');
when '高级' then
dbms_output.put_line('可以啊....');
end case;
end; --结束
案例5: 函数 ==》把身份证号中的出生年月日隐藏!
create or replace function fn_teacher_tid(f_tid varchar2)
return varchar2 --创建一个函数 传递一个varchar2类型的值 返回一个varchar2类型的值
is f_result varchar2(50); --声明变量
begin
--开始书写函数内容
if length(f_tid) != 18 then
dbms_output.put_line('身份证格式不正确');
else
dbms_output.put_line('身份证格式正确');
end if;
f_result := substr(f_tid, 1, 6) || '********' || substr(f_tid, 15);
return f_result; end fn_teacher_tid; --函数结束
--调用函数
select fn_teacher_tid('') from dual;
案例6: 游标 :
01.是oracle系统给我们用户开设的一个数据缓冲区!
02.存放的是sql语句执行的结果集!
03.每个游标区都有一个名称,用户通过游标逐行获取需要的数据!
分类:
01.隐式游标: 非查询语句
只要我们使用pl/sql,程序在执行sql语句的时候 自动创建! 游标区===》sql
02.显示游标: 返回多行记录
03.REF游标(动态游标): 处理运行时才能确定的动态sql查询结果
游标的常用属性:
01.sql%found 影响了一行或者多行数据 返回true
02.sql%notfound 没有影响行 返回true
03.sql%rowcount 返回true影响行数
04.sql%isopen 游标是否打开!始终是false
使用游标的步骤:
01.声明游标
02.打开游标
03.使用游标获取记录
04.关闭游标
01.隐式游标
begin
-- 隐式游标 自动创建
update teacher set tname = '大家辛苦了' where tno = 1002; --修改
if sql%found then
dbms_output.put_line('教师的信息已经更改' || sql%rowcount);
else
dbms_output.put_line('更改失败');
end if;
end;
02.显示游标
declare
--声明 显示游标
c_tname teacher.tname%type;
c_sal teacher.sal%type;
cursor teacher_cursor is
select tname, sal from teacher where tno < 1005; --游标数据来源
begin
open teacher_cursor; --打开游标
fetch teacher_cursor
into c_tname, c_sal; --使用游标
while teacher_cursor%found loop
dbms_output.put_line('教师的姓名是==》' || c_tname);
dbms_output.put_line('教师的薪水是==》' || c_sal);
fetch teacher_cursor
into c_tname, c_sal; --逐行读取
end loop;
close teacher_cursor; --关闭游标
end;
案例7:触发器
触发器是针对于增删改!
update :old :new
insert :new
delete :old
:old 代表修改之前的值
:new 代表修改之后的值
select * from teacher t for update
-- 创建一个用于保存teacher操作记录的表
create table teacher_log(logid number not null, old_value varchar2(150), create_date date, log_type number, t_no number);
--创建主键
alter table teacher_log add constraint pk_teacher_logid primary key(logid);
-- 创建序列
create sequence sq_teacherLog_logid minvalue 1 maxvalue 99999999999 start
with 1 increment by 1;
-- 创建触发器
create or replace trigger tr_teacher after insert or update or delete --会在增删改之后 触发
on teacher for each row --作用在teacher表中的每一行
declare --声明变量
old_value teacher_log.old_value%type;
log_type teacher_log.log_type%type;
t_no teacher_log.t_no%type;
begin
if inserting then
log_type := 1; --新增
t_no := :new.tno;
old_value := :new.tname || '*****' || :new.sal;
elsif deleting then
log_type := 2; --删除
t_no := :old.tno;
old_value := :old.tname || '*****' || :old.sal;
else
log_type := 3; --修改
t_no := :old.tno;
old_value := :old.tname || '*****' || :old.sal || '现在的薪水:' || :new.sal;
end if; --把用户修改的数据 放入 teacher_log
insert into teacher_log
values
(sq_teacherLog_logid.nextval, old_value, sysdate, log_type, t_no);
end tr_teacher; --结束
案例8:存储过程
为了完成一个特定的功能而实现编写一组sql语句的集合!
新增教室时,如果身份证号码不足18位,报错!
create or replace procedure pro_addTeacher --存储过程
(p_no teacher.tno%type, p_name teacher.tname%type, p_tid teacher.tid%type) is ex_tidException exception; --异常类型 begin
if length(p_tid) != 18 then
raise ex_tidException; --抛出异常
end if; --新增
insert into teacher (tno, tname, tid) values (p_no, p_name, p_tid);
commit; --- 自动提交 exception
-- 异常处理部分
when ex_tidException then
dbms_output.put_line('身份证号不正确');
when others then
dbms_output.put_line('其他异常'); end pro_addTeacher; --结束
--调用存储过程
call pro_addTeacher(1111, '小白白', '');
name teacher.tname%type :会根据表中字段的类型,自动改变!
teacherRow teacher%rowtype: 一整行的记录,包括很多字段!
teacherRow.name
四、Oracle loop循环、while循环、for循环、if选择和case选择、更改读取数据、游标、触发器、存储过程的更多相关文章
- Oracle loop、while、for循环
Loop循环 Declare p_sum ; p_i number; Begin p_i :; Loop p_sum := p_sum + p_i; p_i :; ) then SYS.Dbms_Ou ...
- Oracle LOOP循环控制语句
在PL/SQL中可以使用LOOP语句对数据进行循环处理,利用该语句可以循环执行指定的语句序列.常用的LOOP循环语句包含3种形式:基本的LOOP.WHILE...LOOP和FOR...LOOP. LO ...
- Oracle PL/SQL中的循环处理(sql for循环)
今天来说下Oracle中的循环迭代处理,因为从自己的博客统计中看到,不少网友都搜索了关键字"SQL FOR循环",所以打算在这里说下个人的理解. PL/SQL也和我们常用的编程语言 ...
- oracle pl/sql 控制结构(分支,循环,控制)
一.pl/sql的进阶--控制结构在任何计算机语言(c,java,pascal)都有各种控制语句(条件语句,循环结构,顺序控制结构...),在pl/sql中也存在这样的控制结构.在本部分学习完成后,希 ...
- Oracle中的for和while循环
实例: beginfor i in 51..500 loop delete from test t where t.date=to_date('2016-07-01', 'yyyy-MM-dd') a ...
- 循环语句:LOOP,WHILE和数字式循环
一 简单循环 1 语法: LOOP 要执行的语句; EXIT WHEN <条件语句> --条件满足,退出循环语句 END LOOP; 2 例子: DECLARE ...
- 第四章:条件语句(if)和循环结构(while)
1.流程控制 含义与作用 Python程序执行,一定按照某种规律在执行 a.宏观一定是自上而下(逻辑上方代码一定比逻辑下方代码先执行):顺序结构b.遇到需要条件判断选择不同执行路线的执行方式:分支结构 ...
- §12 循环101-while循环
§12 循环101-while循环 While和for具有一定的可替换性.语法如下: while test body continue终止当次循环,break退出整个循环. 注意while之后要用 ...
- JavaScript循环之for/in循环
今天学到了JavaScript的语句篇.同其他常见编程语言如C.Java等一样,JavaScript中的语句包含:①表达式语句②复合语句和空语句③声明语句④条件语句⑤循环语句⑥跳转语句,当然JavaS ...
随机推荐
- TensorFlow实现卷积神经网络
1 卷积神经网络简介 在介绍卷积神经网络(CNN)之前,我们需要了解全连接神经网络与卷积神经网络的区别,下面先看一下两者的结构,如下所示: 图1 全连接神经网络与卷积神经网络结构 虽然上图中显示的全连 ...
- 使用pip安装离线包
为了方便以后查看,特总结于此: 下载离线安装包并放到你想放的文件目录下 使用anaconda prompt安装离线文件 如果没有安装anaconda,则参照下边链接里边的操作!!! 离线环境通过pip ...
- 自定义等高 Cell
1.介绍 1.1 代码自定义 cell(使用 frame) 创建一个继承自 UITableViewCell 的子类,比如 BookCell1. 在 initWithStyle:reuseIdentif ...
- kuangbin专题16B(kmp模板)
题目链接: https://vjudge.net/contest/70325#problem/B 题意: 输出模式串在主串中出现的次数 思路: kmp模板 在 kmp 函数中匹配成功计数加一, 再令 ...
- Linux定时任务(crond)
1.Crond定义 crond是Linux系统中用来定期执行命令或指定程序的一种服务或软件. (1)linux系统自身定期执行的任务(轮询系统日志.备份数据等) (2)用户执行的任务(定时更新同步时间 ...
- 实现织梦dedecms百度主动推送(实时)网页抓取
做百度推广的时候,如何让百度快速收录呢,下面提供了三种方式,今天我们主要讲的是第一种. 如何选择链接提交方式 1.主动推送:最为快速的提交方式,推荐您将站点当天新产出链接立即通过此方式推送给百度,以保 ...
- linux 远程连接ssh提示 IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY解决
Linux ssh 远程登录到其他机器上时,有时会出现登不进去,并弹出如下类似提示的情况: @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ ...
- Eclipse 创建Maven 项目
https://www.cnblogs.com/noteless/p/5213075.html
- Halum UVA - 11478 差分约束
输入输出格式 输入格式: 输出格式: 输入输出样例 输入样例#1: 复制 2 1 1 2 10 2 1 1 2 -10 3 3 1 2 4 2 3 2 3 1 5 4 5 2 3 4 4 2 5 3 ...
- linux下虚拟主机配置
<VirtualHost *:80>ServerAdmin admin@localhostServerName www.baidu.org DocumentRoot "/d ...