zoukankan      html  css  js  c++  java
  • Oracle(PLSQL)入门学习七

    学习视频:https://www.bilibili.com/video/BV1tJ411r7EC?p=74

    设计数据库步骤:

    良好的数据库设计:节省空间,数据完整,方便开发。

    步骤:1、收集信息 2、标识实体 3、标识实体属性 4、标识实体之间的关系 5、画E-R图,编写Sql

    概念了解:

    • 映射基数有一对一、一对多、多对一、多对多。
    • 三大范式:每列是不可再分的数据单元,例如“地址列”内容“中国北京”可以拆分“国家列”和“城市列”;每个表只描述一件事情。列和主键要有直接的关系,不能间接相关。

    PL/SQL:

    是一种过程语言,与结构化SQl结合的编程语言,对SQL语句的扩展。分为三个部分:声明,执行,异常。如果没有东西要声明可以不写declare,不捕获异常可以不写exception。注释分分单行“--”和多行“/**/”,变量标识符最大长度31。

    变量的声明以“变量名 类型 := 值”,注意“:=”是赋值用的,而“=”是判断用的。如果要声明常量,在变量名后加关键字“constant”即“变量名 constant 类型 := 值”,声明常量必须赋值。

    属性类型:

    属性类型有%Type、%RowType。应该了解的常见类型有:number(整型和浮点)、char、varchar2(可变长度)、date、boolean、binary_integer(整型)。“%Type”用于引用表格字段的类型,用法“表名.列名%Type”。

    declare
      name varchar2(20) := '数据库';
      i constant number :=3;
      salary emp.sal%type:=1000;
    begin
      dbms_output.put_line(name || 'hahhah');
    end;

    record类型,就像定义C#中的类

    declare
      type student is record(
      stuid emp.empno%type,
      stuname emp.ename%type
      );
      stu student;
    begin
      stu.stuid:=11;
      stu.stuname:='bibi';
      dbms_output.put_line('学号' || stu.stuid);
    end;

    %rowtype ,就是一种引用表的record类型。

    declare
      stu emp%rowtype; --emp是一个表,使用rowtype获取表的行类型。stu其实就是record类型
    begin
      stu.empno := 5555;
      stu.ename := 'bibi';
      dbms_output.put_line(stu.empno || stu.ename);
      select * into stu from emp where empno=7369;
       dbms_output.put_line(stu.empno || stu.ename);
    end;

     table类型,类似C#的字典类型。

    declare
      type myTable is table of number index by binary_integer;
      tableone myTable;
      x number;
    begin
      tableone(0) := 100;
      tableone(1) := 200;
      tableone(2) := 200;
      tableone(4) := 200;
      tableone(3) := 200;
      dbms_output.put_line(tableone(0) || tableone(1));
      x := tableone.first(); --获取第一个key
      dbms_output.put_line('第一个key' || x);
      x := tableone.next(x); --获取当前key的下一个key
      dbms_output.put_line('第一个key的下一个key' ||  x);
      x := tableone.last(); --获取最后一个key 
      dbms_output.put_line('(自动)排序最后的一个key' || x);
    end;

    变量作用域:

    declare
      i number := 90;
    begin
      declare
      j number :=100;
      begin
        dbms_output.put_line(j); --使用内层变量
        dbms_output.put_line(i); --使用外层变量
        end;
    end;

    if分支:if...elsif..else ;if...;if...else..;if....elsif...elsif...各种组合。

    declare
      i number := 10;
    begin
      if i > 30 then
        dbms_output.put_line('ok啊');
      elsif i > 5 then  -- 注意是 elsif
        dbms_output.put_line('也ok啊');
      else --注意没有then
        dbms_output.put_line('不ok啊');
      end if;
    end;
    /
    
    declare
      i number := 10;
    begin
      if i > 30 then
        dbms_output.put_line('ok啊'); 
      else --注意没有then
        dbms_output.put_line('不ok啊');
      end if;
    end;
    /
    
    declare
      i number := 10;
    begin
      if i > 30 then
        dbms_output.put_line('ok啊');   
      end if;
    end;
    /

    null值不参与比较运算,不会出现运算结果。如果用在if比较判断分支里,只能进else。

    简单循环:loop...exit when;... end loop;要写退出条件,不然会陷入死循环。

    declare
      i number := 0;
    begin
      loop
        dbms_output.put_line(i);
        i := i + 1;
        exit when i = 10; --不写退出条件,会陷入死循环。
        --i := i + 1; 也可以在这里写条件
      end loop;
    end;

    普通循环:使用while,条件前置了。

    declare
      i number := 0;
    begin
      while i < 100 loop
        if mod(i, 2) = 0 then
          dbms_output.put_line(i);
        end if;
        i := i + 1;
      end loop;
    end;

    for循环:for的变量只能自增。但使用reverse,可以反转增长的序列。

    begin
      for i in 1 .. 10 loop
        dbms_output.put_line(i);
      end loop;
    end;
    /
    begin
      for i in reverse 1 .. 10 loop
        dbms_output.put_line(i);
      end loop;
    end;
    /

    多重循环:如果要退出外层循环,应给外层循环起别名,“exit 外层循环”,纯粹的exit只能退出当前循环。

    declare
      x number := 1;
      y number := 1;
    begin
      <<wai>>
      while x <= 10 loop
        dbms_output.put_line('----' || x);
        y := 1;
        while y <= 5 loop
          dbms_output.put_line(y);
          if x = 7 and y = 3 then
            exit wai; --退出外层循环
          end if;
          y := y + 1;
        end loop;
        x := x + 1;
      end loop;
    end;

    goto:跳转,绕道而行。

    begin
      dbms_output.put_line('1');
      dbms_output.put_line('2');
      dbms_output.put_line('3');
      goto hi;
      dbms_output.put_line('4');
      dbms_output.put_line('5');
      <<hi>>
      dbms_output.put_line('6');
      dbms_output.put_line('7');
    end;
    begin
      dbms_output.put_line('1');
      dbms_output.put_line('2');
      dbms_output.put_line('3');
      goto hi;
      dbms_output.put_line('4');
      dbms_output.put_line('5');
      <<hi>>
      null; 
    end;
  • 相关阅读:
    渗透资源大全
    Brute Force(暴力(破解))
    关于Burp Suite不能抓包的解决方法
    新手指南:DVWA-1.9全级别教程之SQL Injection
    mysql里面如何用sql语句让字符串转换为数字
    手把手教你如何搭建自己的渗透测试环境
    php错误提示
    vmware虚拟机三种网络模式详解
    Vmware虚拟机下三种网络模式配置
    cmd开启3389
  • 原文地址:https://www.cnblogs.com/bibi-feiniaoyuan/p/oracle_seven.html
Copyright © 2011-2022 走看看