设为首页 收藏本站
查看: 1216|回复: 0

[经验分享] PL/SQL控制语句

[复制链接]

尚未签到

发表于 2018-10-23 08:28:43 | 显示全部楼层 |阅读模式
  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);
  3  begin
  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;
  17  END;
  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 [TRUE | FALSE]
  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、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-625193-1-1.html 上篇帖子: PL/SQL变量与类型 下篇帖子: 29. SQL -- T-SQL 流程控制语句
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表