您的位置:首页 > 数据库

PL/SQL控制语句

2016-07-19 13:28 381 查看
--第4章开始  
--代码4.1 最简单的IF语句使用示例  
DECLARE  
  v_count NUMBER(10) := 0; --定义计数器变量  
  v_empno NUMBER(4) := 7888; --定义员工编号  
BEGIN  
  SELECT COUNT(1) --首先查询指定的员工编号是否存在  
  INTO   v_count  
  FROM   emp  
  WHERE  empno = v_empno;  
  --使用IF语句判断,如果员工编号不存在,结果为0  
  IF v_count = 0  
  THEN  
    --则执行INSERT语句,插入新的员工记录  
    INSERT INTO emp  
      (empno, ename, job, hiredate, sal, deptno)  
    VALUES  
      (v_empno, '张三', '经理', TRUNC(SYSDATE), 1000, 20);  
  ELSIF v_count >= 1  
  THEN  
    DBMS_OUTPUT.put_line('该员工已存在。');  
  END IF;  
  --向数据库提交更改  
  COMMIT;  
EXCEPTION  
  WHEN OTHERS THEN  
    DBMS_OUTPUT.put_line(SQLERRM); --输出异常信息  
END;  
  
select * from emp;  
  
--代码4.2 IF-THEN-ELSE  
DECLARE  
  v_count NUMBER(10) := 0; --定义计数器变量  
  v_empno NUMBER(4) := 7888; --定义员工编号  
BEGIN  
  SELECT COUNT(1) --首先查询指定的员工编号是否存在  
  INTO   v_count  
  FROM   emp  
  WHERE  empno = v_empno;  
  --使用IF语句判断,如果员工编号不存在,结果为0  
  IF v_count = 0  
  THEN  
    --则执行INSERT语句,插入新的员工记录  
    INSERT INTO emp  
      (empno, ename, job, hiredate, sal, deptno)  
    VALUES  
      (v_empno, '张三', '经理', TRUNC(SYSDATE), 1000, 20);  
  ELSE  
    --否则,执行UPDATE语句更新员工记录  
    UPDATE emp  
    SET    ename    = '黄阔',  
           job      = '顾问',  
           hiredate = TRUNC(SYSDATE),  
           sal      = 100000,  
           deptno   = 20  
    WHERE  empno = v_empno;  
  END IF;  
  --向数据库提交更改  
  COMMIT;  
EXCEPTION  
  WHEN OTHERS THEN  
    DBMS_OUTPUT.put_line(SQLERRM); --输出异常信息  
END;  
  
  
--代码4.3 嵌套的IF语句  
DECLARE  
   v_sal      NUMBER (11, 2);    --薪资变量  
   v_deptno   NUMBER (2);       --部门变量  
   v_job      VARCHAR2 (9);     --职位变量  
BEGIN  
   --从数据库中查询指定员工编号的信息  
   SELECT deptno, v_job, sal  
     INTO v_deptno, v_job, v_sal  
     FROM emp  
    WHERE empno = &empno;  
   --如果部门编号为20的员工  
   IF v_deptno = 20  
   THEN  
      --如果职别为CLERK  
      IF v_job = 'CLERK'  
      THEN  
         --加薪0.12  
         v_sal := v_sal * (1 + 0.12);  
      --如果职别为ANALYST  
      ELSIF v_job = 'ANALYST'  
      THEN  
         --加薪0.19  
         v_sal := v_sal * (1 + 0.19);  
      END IF;  
   --否则,不为20的员工将不允许加薪  
   ELSE  
      DBMS_OUTPUT.put_line ('仅部门编号为20的员工才能加薪');  
   END IF;  
END;  
  
  
--代码 4.4 IF-THEN-ELSIF分支示例  
DECLARE  
--定义替换变量 (此处&tmpVar要放到引号内,否则运行时报错)  
   v_character   CHAR(1) :='&tmpVar';      
BEGIN  
   IF v_character = 'A'                --判断字符是否为'A',如果不是,则跳到下一个ELSIF  
   THEN  
      DBMS_OUTPUT.put_line ('当前输出字符串:' || v_character);  
   ELSIF v_character = 'B'             --判断字符是否为'B',如果不是,则跳到下一个ELSIF  
   THEN  
      DBMS_OUTPUT.put_line ('当前输出字符串:' || v_character);  
   ELSIF v_character = 'C'             --判断字符是否为'C',如果不是,则跳到下一个ELSIF  
   THEN  
      DBMS_OUTPUT.put_line ('当前输出字符串:' || v_character);  
   ELSIF v_character = 'D'             --判断字符是否为'D',如果不是,则跳到ELSE语句  
   THEN  
      DBMS_OUTPUT.put_line ('当前输出字符串:' || v_character);  
   ELSE  
      DBMS_OUTPUT.put_line ('不是A-D之间的字符');  
   END IF;  
END;  
  
  
--代码4.5 简单CASE语句使用示例  
DECLARE  
   v_job     VARCHAR2 (30);             --定义保存CASE选择器的字符型变量  
   v_empno   NUMBER (4)    := &empno;   --定义用来查询员工的员工编号  
BEGIN  
   SELECT job                           --获取选择器v_job的值  
     INTO v_job  
     FROM emp  
    WHERE empno = v_empno;  
   --当指定了CASE的选择器为v_job后,所有的WHEN子句的类型必须匹配为VARCHAR2类型  
   CASE v_job   
      WHEN 'CLERK'  
      THEN  
         UPDATE emp  
            SET sal = sal * (1 + 0.15)  
          WHERE empno = v_empno;  
  
         DBMS_OUTPUT.put_line ('为普通职员加薪15%');  
      WHEN 'ANALYST'  
      THEN  
         UPDATE emp  
            SET sal = sal * (1 + 0.18)  
          WHERE empno = v_empno;  
  
         DBMS_OUTPUT.put_line ('为分析人员加薪18%');  
      WHEN 'MANAGER'  
      THEN  
         UPDATE emp  
            SET sal = sal * (1 + 0.20)  
          WHERE empno = v_empno;  
  
         DBMS_OUTPUT.put_line ('为管理人员加薪20%');  
      WHEN 'SALESMAN'  
      THEN  
         UPDATE emp  
            SET sal = sal * (1 + 0.22)  
          WHERE empno = v_empno;  
  
         DBMS_OUTPUT.put_line ('为销售人员加薪22%');  
      ELSE                  --使用ELSE语句显示信息  
         DBMS_OUTPUT.put_line ('员工职级不在加薪的行列!');  
   END CASE;                --终止CASE语句块  
END;  
  
  
--代码4.6 搜索CASE语句使用示例  
DECLARE  
   v_sal     NUMBER (10, 2);          --定义保存薪水的变量  
   v_empno   NUMBER (10)    := &empno;--用来查询的员工编号  
BEGIN  
   SELECT sal                         --获取员工薪资信息  
     INTO v_sal  
     FROM emp  
    WHERE empno = v_empno;  
   --使用搜索CASE语句,判断员工薪资级别  
   CASE  
      WHEN v_sal BETWEEN 1000 AND 1500  
      THEN  
         DBMS_OUTPUT.put_line ('员工级别:初级职员');  
      WHEN v_sal BETWEEN 1500 AND 3000  
      THEN  
         DBMS_OUTPUT.put_line ('员工级别:中级管理');  
      WHEN v_sal BETWEEN 3000 AND 5000  
      THEN  
         DBMS_OUTPUT.put_line ('员工级别:高级经理');  
      ELSE  
         DBMS_OUTPUT.put_line ('不在级别范围之内');  
   END CASE;  
END;  
     
  
--代码4.7 LOOP和EXIT使用示例  
DECLARE  
   v_count   NUMBER (2) := 0;         --定义循环计数变量  
BEGIN  
   LOOP                               --开始执行循环  
      v_count := v_count + 1;         --循环计数器加1  
      --打印字符信息  
      DBMS_OUTPUT.put_line ('行' || v_count || ':Hello PL/SQL!');  
      --如果计数条件为10,则退出循环  
      IF v_count = 10  
      THEN  
         EXIT;       --使用EXIT退出循环  
      END IF;  
   END LOOP;  
   --循环退出后,将执行这条语句  
   DBMS_OUTPUT.put_line ('循环已经退出了!');  
END;  
  
  
--代码4.8 LOOP和 EXIT WHEN使用示例  
DECLARE  
   v_count   NUMBER (2) := 0;         --定义循环计数变量  
BEGIN  
   LOOP                               --开始执行循环  
      v_count := v_count + 1;         --循环计数器加1  
      --打印字符信息  
      DBMS_OUTPUT.put_line ('行' || v_count || ':Hello PL/SQL!');  
      --如果计数条件为10,则退出循环  
      EXIT WHEN v_count=10;  
   END LOOP;  
   --循环退出后,将执行这条语句  
   DBMS_OUTPUT.put_line ('循环已经退出了!');  
END;  
  
--代码4.9 使用CONTINUE重新开始循环  
DECLARE  
   x   NUMBER := 0;  
BEGIN  
   LOOP               -- 开始循环,当遇到CONTINUE语句时,将重新开始LOOP的执行  
      DBMS_OUTPUT.put_line ('内部循环值:  x = ' || TO_CHAR (x));  
      x := x + 1;  
      IF x < 3  
      THEN                            --如果计数器小于3,则重新开始执行循环。  
         CONTINUE;             --使用CONTINUE跳过后面的代码执行,重新开始循环  
      END IF;  
      --当循环计数大于3时执行的代码  
      DBMS_OUTPUT.put_line ('CONTINUE之后的值:  x = ' || TO_CHAR (x));  
      EXIT WHEN x = 5;         --当循环计数为5时,退出循环  
   END LOOP;  
   --输出循环的结束值  
   DBMS_OUTPUT.put_line (' 循环体结束后的值:  x = ' || TO_CHAR (x));  
END;  
  
  
--代码4.10 使用CONTINUE WHEN 重新开始循环(相比if then conitinue更为简洁)  
DECLARE  
   x   NUMBER := 0;  
BEGIN  
   LOOP               -- 开始循环,当遇到CONTINUE语句时,将重新开始LOOP的执行  
      DBMS_OUTPUT.put_line ('内部循环值:  x = ' || TO_CHAR (x));  
      x := x + 1;  
      CONTINUE WHEN x<3;  
      --当循环计数大于3时执行的代码  
      DBMS_OUTPUT.put_line ('CONTINUE之后的值:  x = ' || TO_CHAR (x));  
      EXIT WHEN x = 5;         --当循环计数为5时,退出循环  
   END LOOP;  
   --输出循环的结束值  
   DBMS_OUTPUT.put_line (' 循环体结束后的值:  x = ' || TO_CHAR (x));  
END;  
  
  
--代码4.11 使用WHILE-LOOP输出计数器值  
DECLARE  
   counter   NUMBER := 1;          --定义计数器变量  
BEGIN  
   WHILE (counter < 10)            --判断循环的条件为counter<10  
   LOOP  
      DBMS_OUTPUT.put_line ('计数器 [' || counter || '].');      
      IF counter >= 1              --如果循环计数器大于等于1  
      THEN  
         counter := counter + 1;   --将循环计数器加1  
      END IF;  
   END LOOP;  
END;  
  
  
--代码4.12 简单的FOR-LOOP示例  
DECLARE  
   v_total   INTEGER := 0;    --循环累计汇总数字  
BEGIN  
   FOR i IN 1 .. 3            --使用FOR循环开始循环计数  
   LOOP  
      v_total := v_total + 1; --汇总累加  
      DBMS_OUTPUT.put_line ('循环计数器值:' || i);  
   END LOOP;  
   --输出循环结果值  
   DBMS_OUTPUT.put_line ('循环总计:' || v_total);  
END;  
  
  
--代码4.13 使用REVERSE的FOR-LOOP示例  
DECLARE  
   v_total   INTEGER := 0;    --循环累计汇总数字  
BEGIN  
   FOR i IN REVERSE 1 .. 3    --使用REVERSE从高到低进行循环  
   LOOP  
      v_total := v_total + 1; --汇总累加  
      DBMS_OUTPUT.put_line ('循环计数器值:' || i);  
   END LOOP;  
   --输出循环结果值  
   DBMS_OUTPUT.put_line ('循环总计:' || v_total);  
END;  
  
  
--代码4.14 动态指定循环边界值  
DECLARE  
   v_counter   INTEGER := &counter;  --动态指定上限边界值变量  
BEGIN  
   FOR i IN 1 .. v_counter           --在循环中使用变量定义边界  
   LOOP  
      DBMS_OUTPUT.put_line ('循环计数:' || i);  
   END LOOP;  
END;  
  
  
--代码4.15 GOTO语句使用示例  
DECLARE  
  p VARCHAR2(30); --定义输出字符串变量   
  n PLS_INTEGER := &prime_number; --定义要判断的数字(此处代码增强为允许用户输入,并且循环输出)  
BEGIN  
  <<outer>>  
  FOR j IN 2 .. ROUND(SQRT(n))  
  LOOP  
    --外层循环  
    IF n MOD j = 0  
    THEN  
      --判断是否为一个素数  
      p := ' 不是素数'; --初始化P的值  
      GOTO print_now; --跳转到print_now标签位置  
    END IF;  
  END LOOP;  
  p := ' 是一个素数';  
  --跳转到标签位置   
  <<print_now>>  
  DBMS_OUTPUT.PUT_LINE(TO_CHAR(n) || p);  
  n := n - 1;  
  IF n >= 1  
  THEN  
    GOTO OUTER;  
  ELSE  
    NULL;  
  END IF;  
END;  
  
  
--代码4.16 GOTO语句模拟循环语句  
DECLARE  
   v_counter   INT := 0;   --定义循环计数器变量  
BEGIN    
   <<outer>>               --定义标签  
   v_counter := v_counter + 1;  
   DBMS_OUTPUT.put_line ('循环计数器:' || v_counter);  
   --判断计数器条件  
   IF v_counter < 5  
   THEN  
      GOTO OUTER;           --向上跳转到标签位置  
   END IF;  
END;  
  
  
--代码4.17 NULL语句使用示例  
DECLARE  
   v_counter   INT := &counter;  --允许用户输入变量值  
BEGIN  
   IF v_counter > 5              --如果变量值大于5  
   THEN  
      DBMS_OUTPUT.put_line ('v_counter>5');  --输出信息  
   ELSE                          --否则  
      NULL;                      --仅占位符,不做任何事情  
   END IF;  
END;  
  
  
--代码4.18 NULL与标签使用示例  
DECLARE  
   v_result   INT := 0;                                    --保存结果值的变量  
BEGIN  
   v_result := 16 / 0;                                            --故意被0除  
   DBMS_OUTPUT.put_line (   '现在时间是:'  
                         || TO_CHAR (SYSDATE, 'yyyy-MM-dd HH24:MI:SS')  
                        );  
EXCEPTION                                                     --异常处理语句块  
   WHEN OTHERS  
   THEN  
      NULL;                                  --当触发任何异常时,什么也不做。  
END; 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: