zoukankan      html  css  js  c++  java
  • Oracle第九课课后作业

    Oracle第九课课后作业

    一、作业

    1. 输出100以内的质数

      -- 定义3个变量
      -- i:外循环,循环2到100的数
      -- j:内循环,判断从2到i-1是否能被整除
      -- flag:是否是素数的标志,执行完一次内循环,判断flag的值,如果内循环中有被整除的,flag变为0,若没有,flag值为1,输出i
      declare
       -- Local variables here
      i integer;
      j INTEGER;
      flag INTEGER;
      begin
       -- Test statements here
      i:=2;
      j:=2;
       FOR i IN 2..100 LOOP
        flag:=1;
         FOR j IN 2..i-1 LOOP
           IF MOD(i,j)=0 THEN
            flag:=0;
             EXIT;
             END IF;
           END LOOP;
           IF flag=1 THEN
          dbms_output.put_line(i);
           END IF;
         END LOOP;
      end;
    2. 建一张表,t_money(id,name,money),money是收入,1万以内,分段显示:0-1500属于贫困,1501-3000是蓝领,3001-8000是白领,8001-10000是精英

      select case when end 来实现

      CREATE TABLE t_money(ID NUMBER(2),NAME VARCHAR(8),money NUMBER(6));
      CREATE SEQUENCE s1 MINVALUE 0 START WITH 0;
      INSERT INTO t_money VALUES(s1.nextval,&n,&m);
      SELECT NAME,CASE
      WHEN money BETWEEN 0 AND 1500 THEN '贫困'
       WHEN money BETWEEN 1501 AND 3000 THEN '蓝领'
         WHEN money BETWEEN 3001 AND 8000 THEN '白领'
           WHEN money BETWEEN 8001 AND 10000 THEN '精英'
      END
      FROM t_money;
    3. 写一个程序,找出上述t_money表中有多少条记录,并显示工资最高的人的信息,排序再过滤,结果存储到变量

      declare 
       -- Local variables here
      i integer;
       -- 行变量的定义
      v_userrow t_money%ROWTYPE;
      begin
       -- Test statements here
       SELECT COUNT(*) INTO i FROM t_money;
       SELECT id,NAME,money INTO v_userrow.id,v_userrow.name,v_userrow.money FROM
      (SELECT * FROM t_money ORDER BY money DESC) WHERE rownum=1;
      dbms_output.put_line(i);
      dbms_output.put_line('工资最高人的信息:'||v_userrow.id||v_userrow.name||v_userrow.money);
      end;

    二、in和exists

    1. 执行顺序

      • in:由内而外,先执行子查询,将子查询作为结果集,再执行外查询

      • exists:由外而内,相当于loop循环,先从外表取出一条记录,然后进入子查询看这条记录是否符合条件,若符合,返回true,否则返回false,然后继续判断下一条记录

    2. 例题

      • 员工表employee,有2个字段salary , deptid ,查询所有数据,按照部门号从高到低,工资从低到高顺序输出

        SELECT * FROM employee ORDER BY deptid DESC,salary;
      • 员工表employee,有2个字段salary , deptid ,查询各个部门中高于所有员工平均工资的人数:查询的结果列为: 部门,人数

        SELECT deptid 部门,COUNT(*) 人数 FROM employee WHERE salary>(
        SELECT AVG(salary) FROM employee) GROUP BY deptid;
      • 员工表employee,有2个字段salary , deptid ,查询出最高工资和最低工资的差是多少

        SELECT MAX(salary)-MIN(salary) FROM employee;
      • 用exists替换下面的sql中的in SELECT * FROM tb1 WHERE u_id IN (SELECT u_id FROM tb2 WHERE name = ‘张三’);

        SELECT * FROM tb1 WHERE EXISTS (
        SELECT * FROM tb2 WHERE NAME='张三' AND tb1.u_id=tb2.u_id);
    3. 当子查询返回的结果集很少时,采用in比较好;

      当子查询返回的结果集很多时,采用exists比较好

    三、PL/SQL编程

    1. 区域:在Test window进行编程

    2. 组成:

      • declare部分进行一些变量的定义

      • begin end;部分里面写执行程序

        declare 
         -- Local variables here
         -- 进行一些变量的定义
        i integer;
        begin
         -- Test statements here
         -- 执行程序在这里编写
         
        end;
    3. 变量定义

      • 直接定义字段类型

          i integer;
          v_username VARCHAR(10);
      • 常量的定义

         pai CONSTANT NUMBER := 3.14;
      • 字段类型来源于表中

        v_empno emp.empno%TYPE;
      • 行变量的定义

         v_emprow emp%ROWTYPE;
    4. 变量的赋值(用:=进行赋值)

      -- 在定义变量时进行赋值,或者在使用前进行赋值
        v_clazz NUMBER:=11;
        v_college NUMBER(10) DEFAULT 1;
      -- 在查询时进行赋值:将查询到的最高工资赋值给i
      SELECT MAX(sal) INTO i FROM emp;
      -- 行变量的赋值
      SELECT emp.empno,emp.ename INTO v_emprow.empno,v_emprow.ename FROM emp WHERE rownum=1;

      -- select只能查询到一条记录

    5. 输出

      • dbms_output.put():输出到缓存

      • dbms_output.put_line():将缓存中的和要输出的进行输出

        dbms_output.put(1);
        dbms_output.put_line(2);
         dbms_output.put_line(v_username||'-'||v_clazz||'-'||v_college);
    6. 异常处理:exception

      -- sqlcode:异常编号,sqlerrom:异常信息

      -- 捕获异常
        EXCEPTION
          WHEN no_data_found THEN 
            dbms_output.put_line('没有数据');
          WHEN too_many_rows THEN
            dbms_output.put_line('返回太多行');
          WHEN OTHERS THEN -- 对未知异常的处理
            dbms_output.put_line(SQLCODE||'-'||SQLERRM);
    7. 选择语句(在编程窗口执行):IF ELSIF

      -- 成绩大于小于60为没有通过,大于60通过
      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;
      end;
    8. 选择语句(在SQL窗口执行): 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;
    9. for循环

      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;
    10. 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;
    11. 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;



    软件下载提取码:qwer
  • 相关阅读:
    Springboot配置多数据源Rabbitmq
    SpringBoot 搭建 Rabbitmq
    SpringBoot 成Rabbitmq的疑惑记录
    Docker安装Redis关于Mounts denied解决
    使用Preferences写入注册表
    RSA解密报错 javax.crypto.BadPaddingException: Decryption error
    星座和生肖转化
    bio与nio
    跳表
    springboot+dubbo+zookeeper
  • 原文地址:https://www.cnblogs.com/ty0910/p/14326574.html
Copyright © 2011-2022 走看看