暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

PL/SQL的流程控制

全栈精英 2021-08-19
426

(本文例子使用经典的scott表)

if语句

格式:

 -- 写法:一个条件的判断
 IF <布尔表达式> THEN
    -- PL/SQL 和 SQL语句
 END IF;
 
 -- 或:两个条件的判断
 IF <布尔表达式> THEN
    -- PL/SQL 和 SQL语句
 ELSE
    -- 其它语句
 END IF;
 
 -- 或:多条件的判断
 IF <布尔表达式> THEN
    -- PL/SQL 和 SQL语句
 ELSIF < 其它布尔表达式> THEN
    -- 其它语句
 ELSE
    -- 其它语句
 END IF;

例:判断员工工资的高低 

    DECLARE
    v_empno emp.empno%TYPE := &empno; -- 使用输入框输入员工号
    V_salary emp.sal%TYPE;
    V_comment VARCHAR2(40);
    BEGIN
    SELECT sal INTO v_salary FROM emp WHERE empno = v_empno;
    IF v_salary < 1500 THEN -- 条件判断1:低于1500元
    V_comment := '太少了,加点吧~!';
    ELSIF v_salary <3000 THEN -- 条件判断2:低于300元
    V_comment := '多了点,少点吧~!';
    ELSE -- 默认
    V_comment := '没有薪水~!';
    END IF;
    DBMS_OUTPUT.PUT_LINE(V_comment);
     END;

    while 语句

    格式:

     while  <布尔表达式> loop
      -- PL/SQL 和 SQL语句 (会循环的内容)
     end loop;

    例:循环输入员工号,根据判断入职日期来设置奖金 

      DECLARE 
      x NUMBER :=1;
      BEGIN
      WHILE x<=10 LOOP -- 循环条件
      DBMS_OUTPUT.PUT_LINE('X的当前值为:'||x); -- 输出x当前的值
      x:= x+1; -- 自增
      END LOOP;
       END;

      loop 语句

      格式:

       loop
          -- PL/SQL 和 SQL语句 (会循环的内容)
          exit when  <布尔表达式>;
          -- PL/SQL 和 SQL语句 (会循环的内容)
       end loop;

      例:循环打印数字 

        DECLARE
        i NUMBER(2) := 0;
        BEGIN
        LOOP
        i := i + 1; -- 自增
        DBMS_OUTPUT.PUT_LINE('int 的当前值为:'||i); -- 每循环一次,打印当前i的值
        EXIT WHEN i=10; -- 循环退出的条件
        END LOOP;
        END;

        for 语句

        格式:

         for 循环计数器 in [ REVERSE ] 下限 .. 上限 loop
            -- PL/SQL 和 SQL语句 (会循环的内容)
         end loop;

        说明:每循环一次,循环变量自动加1;使用关键字REVERSE,循环变量自动减1。跟在IN REVERSE 后面的数字必须是从小到大的顺序,而且必须是整数,不能是变量或表达式。可以使用EXIT 退出循环

        例:循环输出i值

           BEGIN
          FOR i in 1..10 LOOP -- 循环的下限1,上限10
          DBMS_OUTPUT.PUT_LINE('int 的当前值为: '||i); -- 每循环一次,打印当前i的值
          END LOOP;
           END

          附1:运算符

          运算符意义
          =等于
          <> , != , ~= , ^=不等于
          <小于
          >大于
          <=小于或等于
          >=大于或等于
          +加号
          -减号
          *乘号
          /除号
          :=赋值号
          =>关系号
          ..范围运算符
          ||字符连接符
          IS NULL是空值
          BETWEEN AND介于两者之间
          IN在一列值中间
          AND逻辑与
          OR逻辑或
          NOT取返,如IS NOT NULL, NOT IN

          附2:scott表

            -- 部门表 (主表)
            CREATE TABLE dept (
            deptno NUMBER(2) CONSTRAINT PK_DEPT PRIMARY KEY, -- 主键:部门号
            dname VARCHAR2(14) , -- 部门名称
            loc varchar2(13) ) ; -- 部门办公地点


            -- 员工表 (关联部门表)
            CREATE TABLE emp (
            empno NUMBER(4) CONSTRAINT PK_EMP PRIMARY KEY, -- 主键:员工号
            ename VARCHAR2(10), -- 员工姓名
            job VARCHAR2(9), -- 员工职位
            mgr NUMBER(4), -- 员工的上级的编号(关联的是自己表的empno)
            hiredate DATE, -- 员工的入职日期
            sal NUMBER(7,2), -- 员工工资
            comm NUMBER(7,2), -- 员工奖金
            deptno number(2) constraint fk_deptno references dept ); -- 外键:关联部门号


            -- 工资表 (无主键)
            CREATE TABLE bonus (
            enamE VARCHAR2(10) , -- 员工姓名
            job VARCHAR2(9) , -- 员工职位
            sal NUMBER, -- 员工工资
            comm number ) ; -- 员工奖金


            -- 工资等级表(无主键)
            CREATE TABLE salgrade (
            grade NUMBER, -- 等级编号
            losal NUMBER, -- 符合工资等级的下限值
            hisal number ); -- 符合工资等级的上限值


            -- 添加部门
            INSERT INTO dept VALUES (10,'ACCOUNTING','NEW YORK');
            INSERT INTO dept VALUES (20,'RESEARCH','DALLAS');
            INSERT INTO dept VALUES (30,'SALES','CHICAGO');
            insert into dept values (40,'OPERATIONS','BOSTON');


            -- 添加员工
            INSERT INTO emp VALUES(7369,'SMITH','CLERK',7902,to_date('17-12-1980','dd-mm-yyyy'),800,NULL,20);
            INSERT INTO emp VALUES(7499,'ALLEN','SALESMAN',7698,to_date('20-2-1981','dd-mm-yyyy'),1600,300,30);
            INSERT INTO emp VALUES(7521,'WARD','SALESMAN',7698,to_date('22-2-1981','dd-mm-yyyy'),1250,500,30);
            INSERT INTO emp VALUES(7566,'JONES','MANAGER',7839,to_date('2-4-1981','dd-mm-yyyy'),2975,NULL,20);
            INSERT INTO emp VALUES(7654,'MARTIN','SALESMAN',7698,to_date('28-9-1981','dd-mm-yyyy'),1250,1400,30);
            INSERT INTO emp VALUES(7698,'BLAKE','MANAGER',7839,to_date('1-5-1981','dd-mm-yyyy'),2850,NULL,30);
            INSERT INTO emp VALUES(7782,'CLARK','MANAGER',7839,to_date('9-6-1981','dd-mm-yyyy'),2450,NULL,10);
            INSERT INTO emp VALUES(7788,'SCOTT','ANALYST',7566,to_date('19-04-1987','dd-mm-yyyy')-85,3000,NULL,20);
            INSERT INTO emp VALUES(7839,'KING','PRESIDENT',NULL,to_date('17-11-1981','dd-mm-yyyy'),5000,NULL,10);
            INSERT INTO emp VALUES(7844,'TURNER','SALESMAN',7698,to_date('8-9-1981','dd-mm-yyyy'),1500,0,30);
            INSERT INTO emp VALUES(7876,'ADAMS','CLERK',7788,to_date('23-05-1987','dd-mm-yyyy')-51,1100,NULL,20);
            INSERT INTO emp VALUES(7900,'JAMES','CLERK',7698,to_date('3-12-1981','dd-mm-yyyy'),950,NULL,30);
            INSERT INTO emp VALUES(7902,'FORD','ANALYST',7566,to_date('3-12-1981','dd-mm-yyyy'),3000,NULL,20);
            insert into emp values(7934,'MILLER','CLERK',7782,to_date('23-1-1982','dd-mm-yyyy'),1300,null,10);


            -- 添加工资等级数据
            INSERT INTO salgrade VALUES (1,700,1200);
            INSERT INTO salgrade VALUES (2,1201,1400);
            INSERT INTO salgrade VALUES (3,1401,2000);
            INSERT INTO salgrade VALUES (4,2001,3000);





            文章转载自全栈精英,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

            评论