数据库的设计(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. 注解和注释以及Spring和SpringMVC常用的注解

    1.两者区别 注解 :参与代码编译,以@开头的.它是给应用程序看的,单独使用注解毫无意义,一定要跟工具一起使用,这个所谓的工具实际就是能读懂注解的应用程序 注释 :对代码没有影响.对代码起到解释.说明 ...

  2. 老男孩Day3作业:工资管理系统

    作业需求: 1.从info.txt文件中读取员工及其工资信息,最后将修改或增加的员工工资信息也写入原info.txt文件. 2.能增查改员工工资 3.增.改员工工资用空格分隔 4.实现退出功能 1)编 ...

  3. 树链剖分【洛谷P1505】 [国家集训队]旅游

    P1505 [国家集训队]旅游 题目描述 Ray 乐忠于旅游,这次他来到了T 城.T 城是一个水上城市,一共有 N 个景点,有些景点之间会用一座桥连接.为了方便游客到达每个景点但又为了节约成本,T 城 ...

  4. 内核启动后,lcd显示logo失败

    针对-s5pv210,但对其他平台也使用 lcd显示logo失败,若显示成功默认的logo是一只企鹅,但是串口打印“Start display and show logo”,但是LCD屏没有显示    ...

  5. linux 基本概念

    Linux把物理内存分为了固定统一大小的块,称为page(页框),一般为4KB. Linux采用4KB页框大小作为标准的物理内存分配单元,内核用数据结构page描述一个页框的状态信息,其实页是进程的概 ...

  6. CF1101E Polycarp's New Job

    #include<iostream> #include<cstdio> #include<algorithm> #include<cstdlib> #i ...

  7. 直播点赞,上升的动画-- CAKeyFrameAnimation

    // //  ViewController.m //  DMHeartFlyAnimation // //  Created by Rick on 16/3/9. //  Copyright © 20 ...

  8. 在生产环境下禁用swagger

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

  9. mac os x忘记了root密码怎么办,忘记登录密码(普通帐号密码)也是一样的

    有时候我们给mac设置了root密码,一段时间不用,却忘记了密码,怎么办?下面的办法帮你解决: 步骤1:先关闭你的mac系统 步骤2:开机,按住Command和s两个按键不松手直到出现下面的界面: 步 ...

  10. Django 的 model form 组件

    Django 的 model form 组件 Model Form 组件的由来 之前介绍过 Django 的 Form 组件(Django的Form表单)使用方法,Form 组件能够帮我们做三件事: ...