lihanchuan125 发表于 2018-10-23 08:28:43

PL/SQL控制语句

  12-10
  IF-THEN-ELSE 语句
  IF语句:包含IF-THEN和IF-THEN-ELSE
  ELSIF语句:如果IF不成立 允许怎样
  循环1
  IF condition
  THEN
  .....
  END IF;
  例子
  declare
  v_countNUMBER(10):=0;
  v_empnoNUMBER(4):=7888;
  begin
  select count(1) into v_count from emp where empno=v_empno;
  IF v_empno=0
  THEN
  insert into emp(empno,ename,job,hiredate,sal,deptno) values(v_empno,'张三','经理',TRUNC(SYSDATE),1000,20);
  END IF;
  commit;
  exception
  when others
  then
  dbms_output.put_line(SQLERRM);
  end;
  循环2
  IF condition
  THEN
  ......
  ELSE
  ......
  END 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 v_count=0
  THEN
  insert into emp (empno,ename,job,hiredate,sal,deptno) values(v_empno,'张三','经理',TRUNC(SYSDATE),1000,20);
  ELSE
  update emp set ename='张三',job='经理',hiredate=TRUNC(SYSDATE),sal=1000,deptno=20 where empno=v_empno;
  END IF;
  commit;
  exception
  when others
  then
  dbms_output.put_line(SQLERRM);
  end;
  嵌套IF语句
  declare
  v_sal NUMBER(7,2);
  v_deptnoNUMBER(2);
  v_jobvarchar2(9);
  begin
  select deptno,v_job,sal into v_deptno,v_job,v_sal from emp where empno=&empno;
  IF v_deptno=20
  THEN
  IF v_job='CLERK'
  THEN
  v_sal := v_sal *(1+0.12);
  ELSIF v_job='ANALYST'
  THEN
  v_sal := v_sal * (1+0.19);
  END IF;
  ELSE
  dbms_output.put_line('仅部门编号为20的员工才能加薪');
  END IF;
  end;
  IF-THEN-ELSIF语句
  IF condition-1
  THEN
  statements-1
  ELSIF condition-N
  THEN
  statements-N
  [ELSE
  else_statements]
  end if;
  当开始IF条件为false或者null时则elsif 就执行另一个条件 包含多个elsif语句时 只有当有是true时 才会被执行 然后忽略掉所有其他的ELSIF 语句 进入end if。如果所有的elsif都失败则进入else语句
  例子   有问题   待解决
  declare
  v_character char(1);
  begin
  v_character := '&tmpvar';
  IF    v_character = 'A'
  THEN
  dbms_output.put_line('当前输出字符串:'|| v_character);
  ELSIF v_character = 'B'
  THEN
  dbms_output.put_line('当前输出字符串:'|| v_character);
  ELSIF v_character = 'C'
  THEN
  dbms_output.put_line('当前输出字符串:'|| v_character);
  else
  dbms_output.put_line('不是1-3之间的字符');
  END IF;
  END;
  18/
  输入 tmpvar 的值:A
  原值    4:      v_character := &tmpvar;
  新值    4:      v_character := A;
  v_character := A;
  *
  第 4 行出现错误:
  ORA-06550: 第 4 行, 第 17 列:
  PLS-00201: 必须声明标识符 'A'
  ORA-06550: 第 4 行, 第 2 列:
  PL/SQL: Statement ignored
  declare
  v_character char(1);
  begin
  v_character := &tmpvar;
  IF    v_character = '1'
  THEN
  dbms_output.put_line('当前输出字符串:'|| v_character);
  ELSIF v_character = '2'
  THEN
  dbms_output.put_line('当前输出字符串:'|| v_character);
  ELSIF v_character = '3'
  THEN
  dbms_output.put_line('当前输出字符串:'|| v_character);
  else
  dbms_output.put_line('不是1-3之间的字符');
  END IF;
  END;
  却可以执行
  18/
  输入 tmpvar 的值:1
  原值    4:      v_character := &tmpvar;
  新值    4:      v_character := 1;
  当前输出字符串:1
  PL/SQL 过程已成功完成。
  这样就对了
  输入 tmpvar 的值:'A'
  原值    4:      v_character := &tmpvar;
  新值    4:      v_character := 'A';
  PL/SQL 过程已成功完成。
  SQL> declare
  2   v_character char(1);
  3begin
  4   v_character := '&tmpvar';
  5   IF    v_character = 'A'
  6   THEN
  7             dbms_output.put_line('当前输出字符串:'|| v_character);
  8   ELSIF v_character = 'B'
  9   THEN
  10             dbms_output.put_line('当前输出字符串:'|| v_character);
  11   ELSIF v_character = 'C'
  12   THEN
  13             dbms_output.put_line('当前输出字符串:'|| v_character);
  14   else
  15             dbms_output.put_line('不是1-3之间的字符');
  16   END IF;
  17END;
  18/
  输入 tmpvar 的值:A
  原值    4:      v_character := '&tmpvar';
  新值    4:      v_character := 'A';
  PL/SQL 过程已成功完成。
  这样也可以
  12-11
  CASE 语句分为两种类型
  简单CASE语句:简单的CASE语句的选择器是一个变量或是一个返回有效数据类型的函数,选择器不可以是布尔类型
  搜索CASE语句:搜索CASE语句的选择器是布尔类型的变量或是返回布尔型的函数,默认的选择器为true,当搜索一个true表达式时,可以省略掉选择器的定义
  CASE 。。。。
  WHEN .......THEN
  .........;
  WHEN.........THEN
  .........;
  ELSE
  .........;
  END CASE;
  declare
  v_jobvarchar2(30);
  v_empnoNUMBER(4):=&empno;
  begin
  select job into v_job from emp where empno = v_empno;
  CASEv_job
  WHEN 'CLERK'
  THEN
  update emp set sal=sal*(1+0.15)
  where empno=v_empno;
  dbms_output.put_line('为普通职员加薪15%');
  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
  dbms_output.put_line('员工职级不再加薪的行列');
  end case;
  end;
  搜索CASE语句
  CASE
  WHEN ......THEN
  .............;
  WHEN.......THEN
  .............;
  ELSE
  .............;
  END CASE;
  declare
  v_salNUMBER(10,2);
  v_empnonumber(10):=&empno;
  begin
  select sal into v_sal from emp where empno = v_empno;
  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;
  循环控制语句
  简单的loop循环:loop-end loop
  数字式for循环:指定循环要执行的次数
  while循环:仅当特定的循环满足时才执行循环,当条件不再满足时循环终止
  exit语句
  exit语句:直接退出循环
  exit when:当when指定的条件满足时退出循环
  1.
  loop
  .........;
  end loop;
  2.
  loop
  .....;
  .....;
  IF ......THEN;
  EXIT;
  END IF;
  END LOOP;
  例子
  declare
  v_count number(2):=0;
  begin
  loop
  v_count:=v_count+1;
  dbms_output.put_line('行' || v_count || ': Hello PLSQL');
  IF v_count=10
  THEN
  EXIT;
  end if;
  end loop;
  dbms_output.put_line('循环已经退出了');
  end;
  loop
  ..........;
  ..........;
  exit when .......;
  end loop;
  例子
  declare
  v_countnumber(2):=0;
  begin
  loop
  v_count:=v_count+1;
  dbms_output.put_line('行' || v_count || ': Hello PLSQL');
  exit when v_count=10;
  end loop;
  dbms_output.put_line('循环已经退出');
  end;
  使用continue 继续执行循环
  continue 不会中断当前循环的执行,但是continue不会马上退出循环,而是将循环执行跳转到语句的开头开始下一次循环,continue 允许跳过部分循环执行的代码重新开始另一次循环。
  例子 在一个输出累加循环的代码中 如果循环体计数大于3,则执行额外的输出代码,如果小于3,将跳过部分代码的执行。
  declare
  x number:=0;
  begin
  loop
  dbms_output.put_line('内部循环值:x' || TO_CHAR(x));
  x := x+1;
  IF x < 3
  THEN
  continue;
  end if;
  dbms_output.put_line('continue之后的值: x=' || TO_CHAR(x));
  exit when x = 5;
  end loop;
  dbms_output.put_line('循环体结束后的值: x = ' || TO_CHAR(x));
  end;
  continue when 例子
  declare
  x number:=0;
  begin
  loop
  dbms_output.put_line('内部循环值:x' || TO_CHAR(x));
  x := x+1;
  continue when x < 3;
  dbms_output.put_line('continue之后的值: x=' || TO_CHAR(x));
  exit when x = 5;
  end loop;
  dbms_output.put_line('循环体结束后的值: x = ' || TO_CHAR(x));
  end;
  while-loop 循环
  loop-end loop类似的代码总能被执行至少一次这种类型的循环也称为出口值守循环。
  while-loop循环在代码之前先判断一个条件,如果条件一开始就为假,那么一次循环也不执行,这种类型叫做 入口值守循环。
  while ........loop
  ..........;
  ..........;
  end loop;
  declare
  v_count PLS_INTEGER :=1;
  begin
  while v_count
页: [1]
查看完整版本: PL/SQL控制语句