1、数据库的设计(DataBase Design):
针对用户特定的需求,然后我们创建出来一个最实用而且性能高的数据库!
数据库设计的步骤:
01.需求分析
02.概念结构设计
03.逻辑结构设计
04.物理机构设计
05.数据库的实施
06.数据库的运行和维护
数据库的3大范式:
1.确保每列的原子性!每一列都是一个不可再分的数据!
2.确保每列都和主键相关!
3.确保每列都和主键有直接的关系,而不是间接依赖(传递依赖)!
--------------------------------------------------------------------------------------------------------------------------------------
PL/SQL:(Procedural Language) 过程化sql语言!
在我们之前的sql语句中增加了选择或者是逻辑判断!
数据库再执行PL/SQL语句的时候,PL和SQL是分别执行的!
oracle || 拼接字符串 。
:= 赋值运算符 。
= 相等于java中的==
.. 范围运算符。如:1..10 就是1到10 之间
!= <> ~= ^= 不等于
and 逻辑与
or 逻辑或
not 取反
PL/SQL语法:
1.declare 可选部分 ===》声明
2.begin 必须有 ===》书写sql和pl/sql
3.exception 可选部分===》异常
4.end 必须有 ==》pl/sql代码块结束
案例1;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选择结构
(1)。if选择结构
declare
t_name teacher.tname%type;
t_sal teacher.sal%type;
begin
select tname, sal into t_name, t_sal from teacher where tno=1002;
if t_sal>5000 and t_sal<10000 then
dbms_output.put_line(‘一级‘);
elsif t_sal>=10000 and t_sal <20000 then
dbms_output.put_line(‘二级‘);
else
dbms_output.put_line(‘高级‘);
end if;
end;
(2)case 选择结构
declare
t_name teacher.tname%type;
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
t_result:=‘一级‘;
elsif t_sal>=10000 and t_sal <20000 then
t_result:=‘二级‘;
else
t_result:=‘高级‘;
end if;
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 : 创建
replace :修改
create or replace :没有就创建 有就修改
fn_teacher_tid: 函数名称规范
f_tid : 参数名称
varchar2: 参数类型
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(‘身份格式正确!‘);
-- 如果输入的格式正确,把输入的年月日用*代替
f_result:=substr(f_tid,1,6)||‘********‘||substr(f_tid,15);
end if;
return f_result;
end fn_teacher_tid; --函数结束
--调用函数
select fn_teacher_tid(‘1111111111111111111‘) 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 999999999
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(1112,‘小白白‘,‘1122222222222222222‘);
9设置字段的类型:%type %rowtype
name teacher.tname%type :会根据表中字段的类型,自动改变!
teacherRow teacher%rowtype: 一整行的记录,包括很多字段,自动改变!想要单个字段可以用它直接点出来就好了(teacherRow.name)
---oracle 数据库的设计,PL/SQL(loop,for,if,case,while)
原文:http://www.cnblogs.com/laosunlaiye/p/7853804.html