• Oracle第九课


    Oracle第九课

    一、in,exists的用法

    • in:在一个范围内

      select * from emp where empno in (
      select empno from emp where deptno=10
      )
      -- 编号和姓名重复
      delete from emp where empno not in (
      select min(empno) from emp group by empno,ename)
      )
    • exists比in效率高

      • 主子表的存在关系,返回的是true,false

      • SELECT * FROM emp o WHERE EXISTS (SELECT 
        empno FROM emp i WHERE o.empno=i.empno AND deptno=10);
      • where exists(结果)

    • 作业

      CREATE TABLE team(NAME CHAR(1));
      INSERT INTO team VALUES(&a);
      -- 显示所有的可能结果
      -- ab,ac,ad,ae   bc,bd,be cd,ce de
      SELECT * FROM team;
      SELECT t1.*,t2.* FROM team t1,team t2 WHERE t1.name<t2.name;

    二、PL/SQL编程

    • test window

      • declare:定义变量,变量要提前定义,只能在定义区定义

    • begin是SQL主体

    • 输出:dbms包里面有put_line和put方法

      • put:输出到缓存

      • put_line:把缓存中的数据一起输出

    • 简单示例

      declare 
       -- Local variables here
       -- 只能在这里定义变量
      i integer;
      begin
       -- Test statements here
      dbms_output.put(1);
      dbms_output.put_line(2);
      end;
    • 变量的定义和赋值

      -- Created on 2021/1/25 by 96093 
      declare
       -- Local variables here
       -- 只能在这里定义变量
      i integer;
      v_username VARCHAR(10);
      v_clazz NUMBER:=11;
      v_college NUMBER(10) DEFAULT 1;
      pai CONSTANT NUMBER := 3.14;
      BEGIN
       -- =只是比较的功能,不能赋值,赋值要加:=
      username:='张三';
       -- Test statements here
      dbms_output.put(1);
      dbms_output.put_line(2);
      dbms_output.put_line(v_username||'-'||v_clazz||'-'||v_college);
      END;
    • 把sql的结果放到变量中

      declare 
       -- Local variables here
      i integer;
       -- 数据类型来自于字段的类型,随着表字段改变而改变
       -- 始终保持一致
      v_empno emp.empno%TYPE;
      begin
       -- Test statements here
       -- 工资最低的员工编号,把sql的结果放到变量中
       SELECT empno INTO v_empno FROM (SELECT empno FROM emp ORDER BY sal DESC) WHERE ROWNUM=1;
      dbms_output.put_line('最高工资'||v_empno);
      end;
    • 行变量定义

       v_emprow emp%ROWTYPE; -- 行记录类型变量,数据结构
      dbms_output.put_line('最高工资'||v_emprow.empno||'-'||v_emprow.ename);
    • select...into...应该只能得到一条记录

    • 异常处理

      -- 捕获异常
      EXCEPTION
         -- others 包罗万象
         -- sqlcode:异常编号 sqlerrom:异常信息
         WHEN no_data_found THEN -- oracle内部预定义的异常名称
          dbms_output.put_line('没有数据');
         WHEN too_many_rows THEN
          dbms_output.put_line('返回太多行');
         WHEN OTHERS THEN -- 对未知异常的处理
          dbms_output.put_line(SQLCODE||'-'||SQLERRM);
    • IF ELSIF

      -- Created on 2021/1/25 by 96093 
      declare
       -- Local variables here
      i integer;
      begin
       -- Test statements here
      i:=60;
       IF i<60 THEN
        dbms_output.put_line('no pass');
       ELSE
        dbms_output.put_line('pass');
       END IF;
      /* IF i<60 THEN
         dbms_output.put_line('no pass');
         ELSIF i<80 THEN
           dbms_output.put_line('普通');
           ELSIF i<90 THEN
             dbms_output.put_line('良好');
             ELSE
               dbms_output.put_line('优秀');
               END IF;*/
      end;
    • 随机数

      -- Created on 2021/1/25 by 96093 
      declare
       -- Local variables here
      v_score INTEGER;-- 成绩
      i integer;
      begin
       -- Test statements here
       DELETE FROM t_score;-- 测试前先删除表数据
       FOR i IN 1..10 LOOP -- 2. for循环
      v_score:=abs(mod(dbms_random.random,100)); -- 1. 随机数
         INSERT INTO t_score(NAME,score) VALUES('name'||seq1.nextval,v_score);
       END LOOP;
       COMMIT;
      dbms_output.put_line(i);
      end;
    • case when

        SELECT score,CASE 
       WHEN score BETWEEN 0 AND 59 THEN '不及格'
        WHEN score BETWEEN 60 AND 80 THEN '普通'
         WHEN score BETWEEN 80 AND 90 THEN '良好'
           WHEN score BETWEEN 90 AND 100 THEN '优秀'
             END
             FROM t_score;
             
      -- 第二个示例
       SELECT CASE
       WHEN score BETWEEN 1 AND 60 THEN 'no pass'
         ELSE 'pass'
       END
       FROM t_score;
    • 表里有多少条数据

        SELECT COUNT(*) INTO i FROM t_score;
      dbms_output.put_line(i);
    • while循环

      -- 变量定义时为初始化为null,无法进行比较
      declare
       -- Local variables here
      i INTEGER;
      BEGIN
       IF i IS NULL THEN
        dbms_output.put_line('i is not init');
        i:=1;
         ELSE
           IF i<10 THEN
              dbms_output.put_line('i<10');
           ELSE
            dbms_output.put_line('i>=10');
       -- Test statements here
       WHILE i<10 LOOP
        i:=i+1;
        dbms_output.put_line(i);
       END LOOP;
      end;
    • loop end loop

      declare 
       -- Local variables here
      i integer;
      begin
       -- Test statements here
       /*
       for ... loop
         end loop
         while loop
           end loop
       */
       LOOP
         IF i IS NULL THEN
          i:=0;
          ELSIF i<10 THEN
            i:=i+1;
             ELSE
               EXIT; -- 退出循环
               END IF;
              dbms_output.put_line(i);
               END LOOP;
      end;

      -- 示例2
      declare
       -- Local variables here
      i integer;
      begin
       -- Test statements here
      i:=0;
       LOOP
        i:=i+1;
         EXIT WHEN i>10;
        dbms_output.put_line(i);
         END LOOP;
      end;

    三、作业

    1. 输出100以内的质数

    2. 建一张表,t_money(id,name,money),money是收入,1万以内,分段显示:0-1500属于贫困,1501-3000是蓝领,3001-8000是白领,8001-10000是精英

      select case when end 来实现

    3. 写一个程序,找出上述t_money表中有多少条记录,并显示工资最高的人的信息,排序再过滤,结果存储到变量



    软件下载提取码:qwer
  • 相关阅读:
    php面向对象三大特性
    php面向对象的重写与重载
    一组成对的数字,找出不成对的数字
    如何创建dll以及使用
    常见运行时错误
    连续数的和
    绕圆圈取球
    第一章 概述
    错误2038
    一个简单的环境光shader
  • 原文地址:https://www.cnblogs.com/ty0910/p/14324560.html
Copyright © 2020-2023  润新知