• Oracle--pl/sql编程-分支语句(判断、循环)


    if语句

    oracle: elsif      java: else if

    if (条件) then
           pl/sql或sql语句
         [elsif (条件) then ]     
          ...可以有多个elsif
         [else]
    end  if---必须写   结束大括号

    例:

    --完成根据员工的编号查看员工需要交的税的情况   大于等于3000交1%    大于等于1500交 0.5%,低于1500的不要交税
    declare
       v_empno emp.empno%type;
       v_sal emp.sal%type;
       v_name emp.ename%type;
       v_rate  emp.sal%type;   --需要交的税
    begin
       v_empno :='&请输入员工编号';
       select ename,sal into v_name,v_sal from emp where empno = v_empno;
       if v_sal >= 3000 then
          v_rate := v_sal*0.01;
       elsif v_sal >= 1500 then
          v_rate := v_sal*0.005;
      else
        v_rate := 0;
      end if;
      dbms_output.put_line('编号为'||v_empno||'的员工姓名:' || v_name
                            ||',薪水:'||v_sal||',需要交的税:'||v_rate);
    end;

    swicth结构:oracle 的case   -decode 是对case的简写

    case 等值判断

    类似于java的switch

    case  表达式
          when 值1 then
            ...
          when 值2  then
            ...
          ...
          else
            ...
         end case ;

    例:

    --查询员工的岗位, 显示的中文的
    declare
      v_empno  emp.empno%type := '&请输入员工的编号';
      v_job  emp.job%type;
      v_cJob emp.job%type;
    begin
      select job into v_job from emp where empno = v_empno;
      case v_job 
        when 'CLERK' then
          v_cJob :='文员';
        when 'SALESMAN'  then
           v_cJob :='销售';
        when 'MANAGER'  then
            v_cJob :='主管';
        when 'ANALYST'  then
            v_cJob :='研发';
        when 'PRESIDENT'  then
            v_cJob :='董事长';
        else
           v_cJob := '未知';
      end case;
       dbms_output.put_line(v_cJob);
    end;

    case 范围判断,等值(类似if)

    case 
          when 条件 then
            ...
          when 条件  then
            ...
          ...
          else
            ...
         end case;

    例:

    declare
       v_empno emp.empno%type;
       v_sal emp.sal%type;
       v_name emp.ename%type;
       v_rate  emp.sal%type;   --需要交的税
    begin
       v_empno :='&请输入员工编号';
       select ename,sal into v_name,v_sal from emp where empno = v_empno;
       /*
       if v_sal >= 3000 then
          v_rate := v_sal*0.01;
       elsif v_sal >= 1500 then
          v_rate := v_sal*0.005;
      else
        v_rate := 0;
      end if;
      */
      case 
        when v_sal >= 3000 then 
           v_rate := v_sal*0.01;
        when v_sal >= 1500 then 
           v_rate := v_sal*0.005;
        else
            v_rate := 0;
      end case;
      dbms_output.put_line('编号为'||v_empno||'的员工姓名:' || v_name
                            ||',薪水:'||v_sal||',需要交的税:'||v_rate);
    end;

    if ,case  if不能再sql语句中使用,   case 可以在sql语句中使用

    --查询员工的信息,以及 >=3000  高新,   >=1500  中等收入, <1500 底薪   收入情况
    --  注意: ***  sql语句中使用case, 不能使用end case, 使用end;
    --              而pl/sql块, case 的结束是一定使用 end case;
    --decode() 函数, 在sql使用,  简化 case等值判断,
    -- 在sql中使用范围判断, 使用case 
    select   e.*, case   
                    when e.sal >=3000 then '高新'  
                    when e.sal >=1500 then '中等收入' 
                    else '底薪'
                  end   收入情况  
    from  emp e;

    loop 循环 常用

    Loop
         Pl/SQL 语句
         exit  when 循环结束的条件;
      end loop;

    例:

    --输出10次hello world
    declare
      v_str varchar2(30) :='hello world';
      i number := 0;
    begin
     -- 类似do-while
      loop
        --oracle 没有 ++  --   i+=1
        i:= i+1;
        --输出helloworld
        dbms_output.put_line(i||':'||v_str);
        --退出循环
        exit when  i = 10;
      end loop;
    end;

    while 循环

     while  条件  loop
        --代码
      end  loop;

    例:

    --使用while来实现
    declare
      v_str varchar2(30) := 'hello world';
      i number := 0;
    begin
      while i<10 loop
         i := i+1;
         dbms_output.put_line(i||':'||v_str);
      end loop;
    end;

    for循环

    从小到大:
    for i in 最小值..最大值 loop
              sql语句
     end loop;
     
     i从小值, 每循环一次, 加1 , 加到最大值结束
     
     从大到小:
     for i in  reverse 最小值..最大值 loop
              sql语句
     end loop;
     
      i从最大值, 每循环一次, 减1 , 减到最大值结束
      
      --注意 这个i不需要我们声明

    例:

    -- 累加操作:  1+ 2+...+100
    declare
      sum1 number := 0;
    begin
      for i in 1..100   loop
         sum1 :=  sum1 + i;
      end loop;
     DBMS_OUTPUT.PUT_LINE ('1到100的累加的和:'||sum1);
    end;
    
    
    --打印 10,9,8,7,...1
    begin
       for  i  in  reverse 1..10 loop
          dbms_output.put_line(i);
       end loop;
    end;
  • 相关阅读:
    Linux 磁盘与文件系统管理
    mysql join
    iostat
    解决TIME_WAIT过多问题
    mysql 数据库性能追踪与分析
    CHECKPOINT
    DTRACE -MYSQL
    ORCLE INNODB 博客与 innodb_lru_scan_depth
    innodb 变量
    mysql博客
  • 原文地址:https://www.cnblogs.com/64Byte/p/12709334.html
Copyright © 2020-2023  润新知