码迷,mamicode.com
首页 > 数据库 > 详细

---oracle 数据库的设计,PL/SQL(loop,for,if,case,while)

时间:2017-11-17 23:30:29      阅读:286      评论:0      收藏:0      [点我收藏+]

标签:nextval   sql语句   抛出异常   处理   隐式   没有   i+1   func   有一个   

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)

标签:nextval   sql语句   抛出异常   处理   隐式   没有   i+1   func   有一个   

原文地址:http://www.cnblogs.com/laosunlaiye/p/7853804.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!