数据库的设计(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选择、更改读取数据、游标、触发器、存储过程的更多相关文章

  1. 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 ...

  2. Oracle LOOP循环控制语句

    在PL/SQL中可以使用LOOP语句对数据进行循环处理,利用该语句可以循环执行指定的语句序列.常用的LOOP循环语句包含3种形式:基本的LOOP.WHILE...LOOP和FOR...LOOP. LO ...

  3. Oracle PL/SQL中的循环处理(sql for循环)

    今天来说下Oracle中的循环迭代处理,因为从自己的博客统计中看到,不少网友都搜索了关键字"SQL FOR循环",所以打算在这里说下个人的理解. PL/SQL也和我们常用的编程语言 ...

  4. oracle pl/sql 控制结构(分支,循环,控制)

    一.pl/sql的进阶--控制结构在任何计算机语言(c,java,pascal)都有各种控制语句(条件语句,循环结构,顺序控制结构...),在pl/sql中也存在这样的控制结构.在本部分学习完成后,希 ...

  5. 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 ...

  6. 循环语句:LOOP,WHILE和数字式循环

    一 简单循环 1 语法: LOOP      要执行的语句;      EXIT WHEN <条件语句> --条件满足,退出循环语句  END LOOP; 2 例子: DECLARE    ...

  7. 第四章:条件语句(if)和循环结构(while)

    1.流程控制 含义与作用 Python程序执行,一定按照某种规律在执行 a.宏观一定是自上而下(逻辑上方代码一定比逻辑下方代码先执行):顺序结构b.遇到需要条件判断选择不同执行路线的执行方式:分支结构 ...

  8. §12 循环101-while循环

    §12   循环101-while循环 While和for具有一定的可替换性.语法如下: while test body continue终止当次循环,break退出整个循环. 注意while之后要用 ...

  9. JavaScript循环之for/in循环

    今天学到了JavaScript的语句篇.同其他常见编程语言如C.Java等一样,JavaScript中的语句包含:①表达式语句②复合语句和空语句③声明语句④条件语句⑤循环语句⑥跳转语句,当然JavaS ...

随机推荐

  1. eclipse jdk安装

    在Ubuntu16.04.4安装jdk 转载自:http://www.cnblogs.com/zyrblog/p/8510132.html 一.在Ubuntu16.04.4上安装jdk  1.下载jd ...

  2. Kubernetes 集群部署(1) -- 自签 TLS 证书

    集群功能各模块功能描述: Master节点:主要由四个模块组成,APIServer,schedule, controller-manager, etcd APIServer: APIServer负责对 ...

  3. Easyui-交互式消息弹出框

    由于项目在优化的时候需要用到弹出框,按自己的想法是傻傻的用一些alert直接弹出得了,但是这样用户体验度不是特别好,影响界面美观,所以自己还是用了封装好的easyui给的消息框,怎么用呢,这个里面很有 ...

  4. js中的DOM对象 和 jQuery对象 比较

    一,二者的区别 通过 jQuery 获取的元素是一个数组,数组中包含着原生JS中的DOM对象. 总结:jQuery 就是把 DOM 对象重新包装了一下,让其具有了 jQuery 方法. 二,二者的相互 ...

  5. Necklace of Beads POJ - 1286

    \(\color{#0066ff}{ 题目描述 }\) 一个圈上有n个珠子,有三种颜色可以染,问本质不同的方案数(通过旋转和翻转重合的算一种) \(\color{#0066ff}{输入格式}\) 多组 ...

  6. MySQL数据查询结果导出生成文件

    select url from news where url like "%美女%"  into outfile  "/导出的文件路径" : 在这里有个坑,对于 ...

  7. zabbix+telegram的API接口(告警)

    首先在telegram里创建一个有API接口的用户,创建是在   @BotFather 选择/start——————/newbot 输入机器人的用户名,根据提示操作.获得bot的API接口和群ID 通 ...

  8. Jira的安装使用

    1.什么是JIRA JIRA是目前比较流行的基于Java架构的管理系统,由于Atlassian公司对很多开源项目实行免费提供缺陷跟踪服务,因此在开源领域,其认知度比其他的产品要高得多,而且易用性也好一 ...

  9. kvm重新命名

    1.停止虚拟机 virsh shutdown wcltest3 2.导出虚拟机的配置文件 cd /etc/libvirt/qemu virsh dumpxml wcltest3 > vnc.xm ...

  10. Mybatis学习笔记(二) —— mybatis入门程序

    一.mybatis下载 mybaits的代码由github.com管理,下载地址:https://github.com/mybatis/mybatis-3/releases 下载完后的目录结构: 二. ...