数据库的设计(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. 封闭解(Closed-form solution)、解析解(Analytical solution)、数值解(Numerical solution) 释义

    转俞夕的博客 (侵删) 1 解析解 解析解(Analytical solution) 就是根据严格的公式推导,给出任意的自变量就可以求出其因变量,也就是问题的解,然后可以利用这些公式计算相应的问题.所 ...

  2. Django会话,用户和注册之用户认证

    通过session,我们可以在多次浏览器请求中保持数据, 接下来的部分就是用session来处理用户登录了. 当然,不能仅凭用户的一面之词,我们就相信,所以我们需要认证. 当然了,Django 也提供 ...

  3. 51nod1455(dp)

    题目链接: http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1455 题意: 中文题诶~ 思路: dp 1 <= n, ...

  4. How to grow up as a BA

    简书 https://www.jianshu.com/p/8f62b5c7fe1b Thoughtworks https://mp.weixin.qq.com/s/n1hGAM2nUoLvkE5xuU ...

  5. PHP删除目录下的空目录

    function rm_empty_dir($path){       if(is_dir($path) && ($handle = opendir($path))!==false){ ...

  6. 在生产环境下禁用swagger

    学习目标 快速学会使用注解关闭Swagger2,避免接口重复暴露. 使用教程 禁用方法1:使用注解@Profile({"dev","test"}) 表示在开发或 ...

  7. Django 解答 01 (pycharm创建项目)

    pycharm创建项目 1. 2. 3.Tools --->Deployment--->Options 这一条由always 改为 On explicit save action(Ctrl ...

  8. 小乐乐打游戏(BFS+曼哈顿距离)

    时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32768K,其他语言65536K 64bit IO Format: %lld 题目描述 小乐乐觉得学习太简单了,剩下那么多的时间好无聊 ...

  9. Codeforces 527C Glass Carving (最长连续0变形+线段树)

    Leonid wants to become a glass carver (the person who creates beautiful artworks by cutting the glas ...

  10. 74th LeetCode Weekly Contest Preimage Size of Factorial Zeroes Function

    Let f(x) be the number of zeroes at the end of x!. (Recall that x! = 1 * 2 * 3 * ... * x, and by con ...