数据库的设计(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. HttpRunner 探索 HttpRunner 最佳体现形式_安装篇

    基于HttpRunner的一款小而美的测试工具--FasterRunner, 由于还是V1.0初版,很多功能还没来得及实现,已有功能还得拜托大家多多帮忙测试FasterRunner:https://g ...

  2. Pandas——修改DataFrame列名

    #生成一个数据框 import pandas as pd a = pd.DataFrame({'a':[1,2,3], 'b':[4,5,6], 'c':[7,8,9]}) #直接修改:缺点必须写明每 ...

  3. web.xml 有什么用?(Java框架)

      1.每个javaEE工程中都有web.xml文件,那么它的作用是什么呢?它是每个web.xml工程都必须的吗? 一个web中可以没有web.xml文件,也就是说,web.xml文件并不是web工程 ...

  4. jdk 1.6.0_41 下载

    Java SE Development Kit 6u41 Product / File Description File Size Download password Linux x86 65.43 ...

  5. 13.Convert BST to Greater Tree(将树转为更大树)

    Level:   Easy 题目描述: Given a Binary Search Tree (BST), convert it to a Greater Tree such that every k ...

  6. 牛客寒假算法基础集训营5 J 炫酷数学

    链接:https://ac.nowcoder.com/acm/contest/331/J来源:牛客网 小希最近想知道一个东西,就是A+B=A|B(其中|为按位或)的二元组有多少个. 当然,直接做这个式 ...

  7. 勤哲excel服务器WEB网页环境搭建问题解决

    因为客户希望在浏览器上使用勤哲的功能,因此希望大家勤哲excel服务器的web环境. 他们用的是勤哲2010版,需要装到64位环境下.在搭建的时候,遇到2个主要问题. 问题1:编译器错误消息: BC3 ...

  8. 微信小程序传数组(Json字符串)到Java后端

    一:小程序端: wxml中代码: <!--index.wxml--> <view> <view> <button bindtap="onShow&q ...

  9. 【2014年百度之星资格赛1001】Energy Conversion

    Problem Description 魔法师百小度也有遇到难题的时候—— 现在,百小度正在一个古老的石门面前,石门上有一段古老的魔法文字,读懂这种魔法文字需要耗费大量的能量和大量的脑力. 过了许久, ...

  10. [Groovy]Groovy with Ant Task

    平时经常会用Ant来写一写脚本,但最近跨入到Groovy的时代,试着做一些改变.Groovy里集成了AntBuilder能非常方便的调用到Ant的对象模型. 现考察如下 1. Groovy里定义的属性 ...