`
Luob.
  • 浏览: 1592678 次
  • 来自: 上海
社区版块
存档分类
最新评论

Oracle 流程控制 和 循环控制

阅读更多


--_______________________________________流程控制__________________________________________________

--1 IF (表达式) then  执行的语句   end if; (end if :结束IF)  -- 判断满足一种情况的 条件

--2 IF (表达式) then  执行的语句  else  执行的语句   end if;   --判断满足两种情况的 条件

--3 IF (表达式) then 执行的语句 elseif 执行的语句  elseif 执行的语句 ....   end if;  --判断满足多种情况的  条件 
    
     --示例1
     declare 
         v_emp emp%rowtype;  --自定义一个行类型
         v_dept_avgsal number(7,2);  --定义个平均工资的变量
     begin
         v_emp.empno:=&empno;   --接受用户的输入 保存到v_emp.empno
         
         --为v_emp 赋值
         select sal,comm,deptno into v_emp.sal,v_emp.comm,v_emp.deptno from emp where empno=v_emp.empno;
         --输出没有更新前的信息
         DBMS_output.put_line('雇员编号;'||v_emp.empno);
         Dbms_Output.put_line('雇员更新前的奖金:'|| NVL(v_emp.comm,0));
         
         --查询但前员工编号所在部门的平均工资
         select avg(sal) into v_dept_avgsal form emp where deptno=v_emp.deptno;
         --判断 该雇员的奖金
         if v_emp.comm is null then  --判断奖金为 null
             --更改该雇员的奖金为 所属部门的平均工资的0.1倍
              update emp set comm=v_dept_avgsal*0.1 where empno=v_emp.empno;  
              
         else    --判断奖金不为 null 
             if v_emp.sal<v_dept_avgsal then  --判断员工的工资 < 部门的平均工资
                 --更改该员工的奖金 += 部门平均工资的0.1倍
                 update emp set comm=comm+v_dept_avgsal*0.1 where empno=v_emp.empno;
             else  --员工工资 > 部门的平均工资
               --更改员工的奖金 += 该员工工资的0.1倍
               update emp set comm=comm+v_emp.sal*0.1 where empno=v_emp.empno;
             end if;  --结束  内部的IF
         end if;  --结束 外部的IF
           --查询更改后的奖金 值重新赋值给 v_emp
           select comm into v_emp.comm from emp whre empno=v_emp.empno;
           --输出来
           Dbms_Output.put_line('雇员更新后的奖金:'||v_emp.comm);
      Exception  --异常
       when no_data_found then
          Dbms_Output.put_line('该雇员不存在!');
      END;



--4 Case (表达式) when (条件表达式结果1 )then 执行语句1  when(条件表达式2) then 执行的语句 2 else 执行的语句 n end Caase; (end case 结束 Case)
    
    --示例1
    declare
       v_deptno number(2):=&deptno;
    begin
       case v_deptno
          when 10 then
              update emp set comm= case when comm is null then 100 else comm*1.1 end where deptno=v_deptno;
          when 20 then
              update emp set comm= case when comm is null then 200 else comm*1.2 end where deptno=v_deptno;
          when 30 then
              update emp set comm= case when comm is null then 300 else comm*1.3 end where deptno=v_deptno;
          else
             DBMS_output.put_line('不存在该部门!');
       end Case;
    End;
--5 Case when (条件表达式1)  then 执行语句1  when (条件表达式2) then 执行语句2  else 执行语句n end case;
   
   --示例1
   declare 
      v_empno number(4):=&empno;
      v_sal number(7,2);
   begin
      select sal into v_sal from emp where empno=v_empno;
      case 
         when v_sal<2000 then
              DBMS_output.put_line('一级工资');
         when v_sal>=2000 and v_sal<3000 then
              DBMS_output.put_line('二级工资');
         when v_sal>=3000 and v_sal<4000 then
              DBMS_output.put_line('三级工资');
         when v_sal>=4000 and v_sal<5000 then
              DBMS_output.put_line('四级工资');
         else
              DBMS_output.put_line('五级工资');
      END CASE;
      Exception
         when no_data_found then
              DBMS_output.put_line('输入的员工的编号不正确!');
      END;



     
--__________________________________________循环控制_______________________________________________

--1.  LOOP  语句段; exit [when 条件表达式]  end Loop;   ===>至少执行一次  相当于 do{} while(条件表达式);
   
   --示例1
     create table rnd_temp_table  --创建表
     (  
       id number(4) primary key;  -- 定义Id
       value varchar2(10) not null
     )
     
     declare
         type Rnd_varray_type id varray(4) of varchar2(20);  --定义一个长度为4的 varrray 的数据类型
         -- 生命一个 varray 类型的变量 并使用构造函数赋值
         v_rnd_varray Rnd_varray_type:=Rnd_varray_type('dalias','chicago','boston','newyork');
         
         v_loop number(2):=1;  --循环控制变量  (还可以是 其他数据类型)
         v_index number(1);  --随机数的下标
     begin
         LOOP
             if v_loop=6 then   --当 满足条件是 退出
                 exit;
             end if;
            v_index:=floor(dbms_random.value(1,5));  -- 使用 函数 产生  1<=n<5 (1,2,3,4) 的随机数 对应 v_rnd_varray 中的下标
            insert into rnd_temp_table value(v_loop,v_rnd_varray(v_index));   --向表中添加一条数据
            v_loop:=v_loop+1;   --循环控制变量++;
          END loop;
     END;
     
     
--2. while  条件表达式 LOOP 执行语句 end  LOOP ;(只有条件表达式 为 true时候 就  运行)
     
     --示例1
       select ID 编号,shopname 商品名称,stock 库存量,day_salse_volulme 日销售量,max_stock  最大库存量,min_stock 最小库存量 from tb_stock;  --创建一张tb_stock表用于 while循环掩饰
       
       declare 
               v_stock tb_stock%rowtype;  --定义一个行类型
               v_n number(4):=0;   --保存所需的天数
       begin
               v_stock.Id=&Id;   --接受用户的输入
               select stock,day_salse_colume,min_stock into v_stock.stock,v_stock.day_sales_volume,v_stock.min_stock from tb_stock where id=v_stock.Id;
               while v_stock.stock>v_stock.min_stock 
                   Loop
                       v_stock.stock:=v_stock.stock-v_stock.day_salse_colume;
                       v_n=v_n+1;
                   end Loop;
               DBMS_output.put_line('商品编号:'||v_stock.ID);
               DBMS_outpyt.pyt_line('采购期限:'||v_n);
       Exception
               when no_data_found then
                  DBMS_output.put_line('请输入正确的商品编号!');
       END;
                   
               
--for 循环变量 IN [reverse] 初始值表达式 ... 终值表达式 LOOP 执行语句  END LOOP;

   -- 示例1
      declare  
           type Dept_table_type is table of dept%rowtype index by binary_integer;  --定义一个行类型
           v_dept_table Dept_table_type;  --定义一个行类型的变量
      begin
           --赋值
           select deptno,dname into v_dept_table(0).deptno, v_dept_table(0).dname from dept where deptno=10;
           select deptno,dname into v_dept_tabel(1).deptno, v_dept_table(1).dname from dept where deptno=20;
           select deptno,dname into v_dept_table(2).deptno, v_dept_table(2).dname from dept where deptno+30;
           --输出
           DBMS_output.put_line('部门编号       部门名称');
           for  i in 0 ...v_dept_table.count-1   --循环遍历 rowType 的变量
                loop
                     DBMS_output.put_line(v_dept_table(i).deptno||'               '||v_dept_table(i).dname);
                END LOOP; --结束循环
      END;
      
分享到:
评论

相关推荐

    Oracle PLSQL存储过程循环LOOP跳处循环、退出循环、终止循环流程详解与实战指南

    5、高效性:通过学习资源中的循环控制方法,能够显著提高PL/SQL程序的运行效率和逻辑清晰度。 6、灵活性:丰富的控制策略使您能够根据不同业务需求灵活调整循环行为。 7、实用性强:所有示例均基于实际业务场景,...

    oracle PLSQL结构控制语句

    Oracle PL/SQL 结构控制语句是 PL/SQL 语言中的一种基本结构,用于控制程序的逻辑流程。结构控制语句可以分为两种:分支结构和循环结构。在本篇文章中,我们将详细介绍 Oracle PL/SQL 结构控制语句的使用方法和示例...

    oracle循环游标

    在给定的代码片段中,我们首先看到了一个简单的PL/SQL循环示例,它使用了基本的循环控制结构。这里,`i`被初始化为1,并在循环中递增,直到`i`等于10为止。每次循环,都会使用`dbms_output.put_line`函数输出`i`的...

    Oracle循环示例

    通过循环结构,可以有效地控制程序的流程,并且能够简化复杂的逻辑处理。本文将对提供的Oracle循环示例进行详细解析,并结合实际应用场景深入探讨其工作原理。 #### 二、代码分析 ##### 1. 声明部分 ```sql ...

    oracle笔记(存储过程函数触发器游标流程控制等)

    4. **流程控制**:在PL/SQL中,流程控制包括条件语句(如IF-THEN-ELSIF-ELSE,CASE语句)和循环结构(如WHILE,FOR)。这些结构用于根据条件执行不同的代码块或重复执行某些任务。 5. **异常处理**:Oracle中的异常...

    Oracle子程序和程序包

    2. 使用`BEGIN-END`块编写PL/SQL逻辑,包括控制结构(如IF-THEN-ELSE,CASE,FOR循环)和异常处理(如`BEGIN-EXCEPTION-END`块)。 3. 如何在程序包中定义全局变量,以及如何在子程序之间共享这些变量。 4. 创建程序...

    kettle oracle循环分页迁移数据的完整例子,生成txt后FTP上传到远程服务器

    综合上述,这个例子展示了如何使用Kettle工具从Oracle数据库中进行循环分页查询,将数据转化为TXT格式,然后通过FTP上传到远程服务器的整个流程,涉及数据的抽取、转换和加载,以及作业的管理和文件的处理。...

    Oracle 12c PL SQL程序设计终极指南

    2. **流程控制**:PL/SQL支持IF-THEN-ELSE、CASE语句进行条件判断,以及WHILE、FOR循环进行迭代操作。理解如何有效地使用这些控制结构,可以编写出逻辑清晰的程序。 3. **集合操作**:Oracle 12c引入了新的集合处理...

    Oracle采购应付循环Release 11i训练教材

    Oracle采购应付循环是Oracle E-Business Suite中的一个关键模块,主要负责管理企业的采购流程和应付账款处理。在Release 11i版本中,这个模块提供了全面的业务流程自动化,帮助用户有效地管理供应商关系、采购订单、...

    oracle存储过程学习经典入门

    CREATE PROCEDURE 语句是用来创建 Oracle 存储过程的语句,变量声明是用来声明变量的语句,控制语句是用来控制流程的语句,循环语句是用来循环执行的语句。 关于 Oracle 存储过程的若干问题备忘 在学习 Oracle ...

    Oracle PLSQL程序设计

    - **特性**:PL/SQL是对SQL的一种扩展,它支持多种数据类型,例如大对象类型和集合类型,并且可以在其中使用条件语句和循环等控制结构。 - **应用**:它可以用来创建存储过程、触发器和程序包,从而为SQL语句的执行...

    Oracle 同义词和视图

    在Oracle数据库中,同义词(Synonyms)和视图(Views)是两种非常重要的对象,它们都提供了数据访问和管理的便捷方式。下面将详细解释这两种概念以及它们在实际应用中的作用。 **同义词** 同义词是Oracle数据库提供...

    PLSQL Oracle8i程序设计

    PLSQL提供了多种流程控制结构,如IF-THEN-ELSE、CASE语句用于条件判断,WHILE和FOR循环用于迭代,GOTO语句进行无条件跳转,以及LOOP结构用于自定义循环。 四、SQL操作 PLSQL可以直接嵌入SQL语句,进行数据查询、...

    Oracle数据操作和控制语言详解

    4. PL/SQL:Oracle的Procedural Language/SQL是SQL的一个扩展,允许编写包含控制结构的程序块,如循环、条件语句和异常处理。 - `DECLARE`:声明变量、游标、记录类型等。 - `BEGIN`/`END`:定义PL/SQL程序块的...

    oracle(proc程序设计.rar

    PL/SQL提供了一系列流程控制语句,包括条件判断(IF-THEN-ELSIF-ELSE)、循环(WHILE、FOR)、CASE语句等,这些语句使开发者能够根据特定条件执行不同的代码块。 六、PL/SQL游标 游标是用于遍历查询结果集的一种...

    Oracle考试题.doc

    * 流程控制语句包括条件控制语句和循环控制语句 * PL/SQL是Oracle数据库的过程语言 * Oracle数据库的逻辑结构是指数据库的组织和存储方式 重要概念 * 数据查询语言(DQL) * 数据定义语言(DDL) * 数据操纵语言...

    oracle存储过程和函数PPT

    综合这三个主题,Oracle数据库开发者可以通过学习和熟练运用存储过程、函数和PL/SQL,提升数据库应用程序的性能和可维护性。了解并掌握游标管理,可以帮助开发者更加高效地处理大数据量的情况。这些知识对于任何涉及...

    介绍OracleSQL和PLSQL

    在实际应用中,Oracle SQL和PL/SQL通常结合使用,SQL负责数据的CRUD操作,而PL/SQL则负责更复杂的业务逻辑和流程控制。对于数据库管理员和开发者来说,掌握这两门语言是高效管理和开发Oracle数据库的关键。 文件...

    Oracle8 PL/SQL程序设计

    PL/SQL,全称Procedural Language/Structured Query Language,是Oracle数据库提供的一种过程化编程语言,它结合了SQL的查询功能和传统编程语言的控制结构,使得数据库管理和应用程序开发更为高效和灵活。...

Global site tag (gtag.js) - Google Analytics