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

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)

时间: 2024-11-07 02:19:09

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

Oracle数据库之开发PL/SQL子程序和包

Oracle数据库之开发PL/SQL子程序和包 PL/SQL块分为匿名块与命名块,命名块又包含子程序.包和触发器. 过程和函数统称为PL/SQL子程序,我们可以将商业逻辑.企业规则写成过程或函数保存到数据库中,以便共享. 过程和函数均存储在数据库中,并通过参数与其调用者交换信息.过程和函数的唯一区别是函数总向调用者返回数据,而过程不返回数据. 1. 存储过程概念 存储过程(Stored Procedure)是在大型数据库系统中,一组为了完成特定功能的SQL语句集,存储在数据库中.经过第一次编译后

ORACLE数据库笔记之PL/SQL

PL/SQL PL/SQL是一种块结构的语言,它是将一组语句放在一个块中,一次性发送给服务器.它是结合Oracle过程语言和结构化查询语言的一种扩展语言 PL/SQL代码块的构成 declare --标记声明部分用来声明一些变量,位于begin之前 begin  --主程序体开始的标志 主程序体块: [exception when 异常名 then 异常处理的方法; when 异常名  then 异常处理的方法; ... when other then 异常处理的方法;] end;  --主程序

数据库复习10——PL/SQL

数据库复习 CH10 PL/SQL 10.1 PL/SQL简介 PL/SQL是Oracle对SQL的过程化的扩展,PL/SQL可以实现SQL相关的过程化程序,并且能够以存储过程和函数的方式让一段SQL业务逻辑驻留在SQL服务器中,以便减少客户机计算任务并减少网络I/O 10.2 PL/SQL编程基础 (1)简介 PL/SQL编程框架为: DECLARE <Variable List> BEGIN <Extented SQL Execution> EXCEPTION <Exce

Oracle学习(十一):PL/SQL

1.知识点:可以对照下面的录屏进行阅读 PL/SQL程序结构 declare 说明部分 (变量说明,光标申明,例外说明 ] begin 语句序列 (DML语句]- exception 例外处理语句 End; / ------------------------------------------------------------------ --第一个PL/SQL程序:HelloWorld set serveroutput on --如果要在屏幕上输出信息,需要将serveroutput开关打

oracle数据库性能影响之Sql parse

1,Sql parse的种类 Sql parse又通常分为硬解析和软解析,当sql第一次执行的时候,会发生硬解析,之后的执行如果在shared pool中能找到就是软解析.因此,为提高数据性能,尽可能的让每次执行的SQL在shared pool找到. 2,SQL在哪些情况下会发送硬解析? 1)统计信息改变  2)Sql中的表上有做ddl操作,包括grant和revoke. 3)执行计划被踢出shared pool 4)开启了trace 5)绑定变量长度变化 6)启用outlin

oracle执行多个pl/sql块

DECLARE    V_SQL_DROP_TABLE   VARCHAR2(50) := 'DROP TABLE MY_TEST2';    V_SQL_CREATE_TABLE VARCHAR2(100) := 'CREATE TABLE MY_TEST2(NOT_NULL VARCHAR2(20) NOT NULL, ONLY_INT INTEGER)';  BEGIN    EXECUTE IMMEDIATE V_SQL_CREATE_TABLE; -- 创建测试表  EXCEPTION

oracle初体验四 PL/SQL Developer 不安装客户端连接远程oracle数据库

PL/SQL Developer是一个集成开发环境,专门面向Oracle数据库存储程序单元的开发.如今,有越来越多的商业逻辑和应用逻辑转向了Oracle Server,因此,PL/SQL编程也成了整个开发过程的一个重要组成部分.PL/SQL Developer侧重于易用性.代码品质和生产力,充分发挥Oracle应用程序开发过程中的主要优势. 下载敏捷客户端 http://eduunix.ccut.edu.cn/index2/database/Oracle%20Instant%20Client/

本机不安装Oracle客户端,使用PL/SQL Developer和 Instant Client 工具包连接oracle 11g远程数据库

一.先到Oracle网站下载Instant Client 下载地址:http://www.oracle.com/technetwork/cn/database/features/instant-client/index-092699-zhs.html 根据你的操作系统选择不同的Instant Client版本.这里下载的是:instantclient-basic-win-x86-64-11.2.0.1.0. 下载后是一个压缩文件,解压之后放在你喜欢的目录即可.如下: 二.配置 Instant C

[Oracle系列整理01]PL/SQL 基本查询与排序

本课重点:    1.写SELECT语句进行数据库查询    2.进行数学运算    3.处理空值    4.使用别名ALIASES    5.连接列    6.在SQL PLUS中编辑缓冲,修改SQL SCRIPTS    7.ORDER BY进行排序输出.    8.使用WHERE 字段. 一.写SQL 命令:      不区分大小写.      SQL 语句用数字分行,在SQL PLUS中被称为缓冲区.      最后以:或 / 结束语句.      也可以用RUN来执行语句 二.例1: