PLSQL——03、结构控制

使用IF语句按条件判断,控制PL/SQL执行流程

格式如下:
if-then-end if;
if-then-else-end if;
if-then-elsif-then-else-end if;

演示:

set serveroutput on
declare
  v_hire_date date := to_date(‘1995-01-15‘,‘yyyy-mm-dd‘);
  v_five_years boolean;
begin
    if months_between(sysdate,v_hire_date)/12 > 5 then
      v_five_years := true;
      dbms_output.put_line(‘true‘);
    else
      v_five_years := false;
      dbms_output.put_line(‘false‘);
  end if;
end;
/

使用CASE表达式

格式1:

set serveroutput on
define p_grade=‘a‘
declare
  v_grade char(1) := upper(‘&p_grade‘);
  v_appraisal varchar2(20);
begin
  v_appraisal :=
    case v_grade
        when ‘A‘ then ‘excellent‘
        when ‘B‘ then ‘very good‘
        when ‘C‘ then ‘good‘
        else ‘no such grade!‘
    end;
  dbms_output.put_line (‘grade: ‘|| v_grade || ‘ appraisal ‘ || v_appraisal);
end;
/

格式2:

DECLARE
  v_grade CHAR(1) := UPPER(‘&p_grade‘);
  v_appraisal VARCHAR2(20);
BEGIN
  v_appraisal :=
  CASE --省略
  WHEN v_grade=‘A‘ THEN ‘Excellent‘
  WHEN v_grade=‘B‘ THEN ‘Very Good‘
  WHEN v_grade=‘C‘ THEN ‘Good‘
  ELSE ‘No such grade‘
  END;
  DBMS_OUTPUT.PUT_LINE (‘Grade: ‘|| v_grade || ‘ Appraisal ‘ || v_appraisal);
END;
/

循环遍历控制

跳出整个循环:exit
跳出本次循环:continue (11g之后新加,10g没有此关键字)

continue演示:

declare
  total int:=0;
begin
  for i in 1..10 loop
     if mod(i,2)=0 then
        continue;
     end if;
     total:=total+i;
  end loop;
  dbms_output.put_line(total);
end;
/

循环演示

基本LOOP循环:

set serveroutput on
declare
  i integer :=1;
begin
  loop
    dbms_output.put_line(i);
    i := i+1;
    exit when i>10;
  end loop;
end;
/

while循环

declare
  i integer :=1;
begin
  while i<=10 loop
    dbms_output.put_line(i);
    i := i+1;
  end loop;
end;
/

数字for循环

begin
  for i in 1..10 loop        --其中i不用声明就可以使用
    dbms_output.put_line(i);
  end loop;
end;
/

begin
  for i in reverse 1..10 loop    --反向循环
    dbms_output.put_line(i);
  end loop;
end;
/

实现双重循环

演示:
      外循环和内循环都执行5次.
      内外计数器变量名相同:i
      显示内循环的计数器和外循环的计数器的乘积
      当乘积超过15时候,退出

declare
  v_plus number(10);
begin
  <<outer_loop>>
   for i in 1..5 loop
     <<inner_loop>>
     for i in 1..5 loop
        v_plus:=i*outer_loop.i;
        exit when v_plus>15;
        dbms_output.put_line(v_plus);
     end loop inner_loop;
   end loop outer_loop;
end;
/

标号和goto

declare
   v_counter number := 1;
begin
   loop
       dbms_output.put_line(‘in loop V_counter current value:‘||V_counter);
       v_counter := v_counter + 1;
     if v_counter > 10 then
       goto l_ENDofLOOP;
      end if;
   end loop;
   <<l_ENDofLOOP>>
   dbms_output.put_line(‘end loop V_counter current value:‘||V_counter);
end;
/

练习

1、写一个PL/SQL块
向dept表中循环插入5条记录,每一条记录的deptno 值比表中最大的deptno 值增加1,dname分别为"Test1" "Test2"..."Test5",loc列的值都为空。

declare
   v_deptno scott.dept.deptno%type;
   v_loop number(1):=1;
begin
   for i in 1..5 loop
    select MAX(deptno) into v_deptno from dept;
    insert into dept(deptno,dname)
    values ((v_deptno+1),(‘Test‘||to_char(i)));
    commit;
   end loop;
end;
/

2、事务处理控制语句(COMMIT 和 ROLLBACK)

CREATE TABLE T1(ID INT);
/*(批量提交,减少log file sync提高效率!)*/
DECLARE
V_NUM NUMBER := 0;
BEGIN
FOR V_LOOPCOUNTER IN 1..500 LOOP
    INSERT INTO T1 VALUES (V_LOOPCOUNTER);
    V_NUM := V_NUM + 1;
    IF V_NUM = 50 THEN
      COMMIT;
      V_NUM := 0;
    END IF;
  END LOOP;
  COMMIT;
END;
/

3、Plsql表+record+循环打印结果集(dept表的所有行所有列)

declare
  TYPE CharacterTab IS TABLE OF dept%rowtype index by binary_integer;
  v_Character CharacterTab;
  v_max number;
  v_deptno number;
begin
 select count(*) into v_max from dept;
 for i in 1..v_max loop
   select deptno
   into v_deptno
   from
   (select rownum rn,d.* from dept d)
   where rn=i;
   select *
   into v_Character(i)
   from dept
   where deptno=v_deptno;
  end loop;
   for i in 1..v_max loop
     dbms_output.put_line(v_Character(i).deptno||‘ ‘||v_Character(i).dname||‘ ‘||v_Character(i).loc);
   end loop;
end;
/

4、新建一张表(只有一列数字),插入1..520个数,每50个一提交。

declare
  j number :=1;
begin
      for i in 1..520 loop
         insert into t7 values(i);
         if i-50*j=0 then
            commit;
            j :=j+1;
         end if;
      end loop;
      commit;
end;
/

5、for + pl/sql_table + record 实现将dept表所有行保存到pl/sql_table + record结构里并输出

declare
      type dept_table_type is table of dept%rowtype index by binary_integer;
      dept_table dept_table_type;
      v_max number;
begin
      select count(*) into v_max from dept;
      for i in 1..v_max loop
         select deptno,dname,loc into dept_table(i)
            from (select rownum rn,deptno,dname,loc from dept) where rn=i;
         dbms_output.put_line(dept_table(i).deptno||‘ ‘||dept_table(i).dname||‘ ‘||dept_table(i).loc);
      end loop;
end;
/

原文地址:https://www.cnblogs.com/marxist/p/12247227.html

时间: 2024-09-25 19:19:26

PLSQL——03、结构控制的相关文章

怒学Python——第三篇——结构控制

众所周知,程序语句运行的结构无非是顺序结构.分支结构和循环结构,Python也是如此,顺序结构过于简单不提,简单记录一下分支和循环与C++的异同点,顺便提一下,对于已经会C++的人来说,学Python应该注意的是语句块通过缩进来控制. 分支结构:都使用if.else,多出了一个elif代替C++的else if,本质相同,就不给出例子 循环结构:和C++对比,没有了do..until语句,有while和for,里面同样使用break来结束循环,使用continue来进入下一个循环,但for出现了

Android_(游戏)打飞机03:控制玩家飞机

Android_(游戏)打飞机01:前言 传送门 Android_(游戏)打飞机02:游戏背景滚动 传送门 Android_(游戏)打飞机03:控制玩家飞机 传送门 控制玩家飞机效果 package com.example.administrator.myapplication; import android.content.Context; import android.graphics.Bitmap; import android.graphics.BitmapFactory; import

plsql的结构

plsql的变量声明: 先写一个简单plsql块 命令窗口不能修改 代码 所以在写之前先要在记事本上写 然后再复制到命令窗口里 PL/sql块中流程控制 if语句: 这种是if else 只有两种情况下 if语句多种情况下 求成绩 0-60 是不及格,60-70 合格 70 -80 良好 80-100是优秀 While循环语句: while循环需要先定义变量 然后在进行循环 For循环结构: reverse有这个就是逆序,不加就是默认顺序 求1-10的合 Loop循环语句: 类似于do whil

【iOS开发基础】【C语言】03 - 流程控制

一.流程控制结构 (1)顺序结构:按照书写顺序执行每一条语句. (2)选择结构:对给定的条件进行判断,根据判断结果来决定执行哪一段代码. (3)循环结构:在给定条件成立的情况下,反复执行某一段代码. 二.选择结构 - if (一)if简单使用 1) 第一种结构: 如果条件为真,就执行后面的语句,否则不执行. if(条件) { 语句1: 语句2: …… } 2) 第二种结构: 如果条件成立就执行语句1,否则执行语句2. if(条件) { 语句1: } else { 语句2: } 3) 第三种结构:

plsql导出表结构,表数据,表序号

场景:项目开发完之后要部署在不同的环境进行测试,这时候就需要将数据库中的表结构,序号,数据进行迁移,这时候就需要能够熟练的使用plsql. 问题: 导出的表结构,在另一个数据库中无法导入 部分表的数据过大,导致长时间无响应,其实数据仍然在迁移,这个时候就需要找出关键的数据表,对于不需要的数据直接丢弃即可

PL/SQL 03 流程控制

--IF语法IF condition THEN  statements;[ELSIF condition THEN  statements;][ELSE  statements;]END IF; --CASE 语法 1.在 CASE 语句中使用单一选择符进行等值比较 CASE selector  WHEN expression1 THEN sequence_of_statements1;  WHEN expression2 THEN sequence_of_statements2;  ... 

03 流程控制

流程控制 if 和 switch 1 <!DOCTYPE html> 2 <html lang="en"> 3 <head> 4 <meta charset="UTF-8"> 5 <meta http-equiv="X-U-Compatible" content="IE-edge"> 6 <meta name="viewport" conte

c/c++优化结构控制

一.表达式优化--使用替换程序中的乘除法 c/c++中的加减运算效率远远高于乘除运算,由于移位指令的执行速度和乘除法差不多,所以可以使用移位的方式来替换程序中的乘除法.一个数向右移一位,等于该数乘以2:向左移一位,等于该数除以2:通过这种移位的方式可以明显提高程序的工作效率: 理论上讲,所有的乘法运算均可以转化为移位操作,如a*8,可以替换为:a<<3:a*13,可以替换为:a<<3+a<<2+a; 但对于除法,只有a为2的n次幂时,才可以进项替换,如a/8,可以替换为

【PLSQL】变量声明,结构语句,cursor游标

************************************************************************   ****原文:blog.csdn.net/clark_xu 徐长亮的专栏 ************************************************************************ PLSQL是ORACLE在标准SQL基础上增加了过程化处理,把DML和SELECT语句组织在PLSQL代码的过程性单元中. PLS