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

[经验分享] oracle PL/SQL 流程控制

[复制链接]

尚未签到

发表于 2018-9-13 10:34:37 | 显示全部楼层 |阅读模式
  使用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;
  /
  declare
  v_year date := to_date('2000-10-10','yyyy-mm-dd');
  v_five_years boolean;
  begin
  if months_between(sysdate,v_year)/12 > 5
  then
  v_five_years := true;
  else
  v_five_years := false;
  end if;
  if v_five_years then
  dbms_output.put_line('yes');
  else
  dbms_output.put_line('no');
  end if;
  end;
  /
  使用CASE表达式:
  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;
  /
  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;
  /
  set serveroutput on
  declare
  v_score number := &score;
  v_grade VARCHAR2(10) := 'no grade';
  begin
  v_grade :=
  case to_char(trunc(v_score,-1))
  when '90' then 'A'
  when '80' then 'B'
  when '70' then 'C'
  else 'D'
  end;
  dbms_output.put_line(v_grade);
  end;
  循环遍历控制:
  loop
  ...
  end loop;
  while ... loop
  ....
  end loop;
  for ... loop
  ...
  end loop;
  1.基本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 i15;
  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;
  
  dbms_output.put_line('end loop V_counter current value:'||V_counter);
  end;
  /
  写一个PL/SQL块
  向dept表中循环插入5条记录
  每一条记录的deptno 值比表中最大的deptno 值增加1
  dname分别为"Test1" "Test2"..."Test5"
  loc列的值都为空。
  sys>create table hr.dept as select * from scott.dept;
  hr>
  declare
  v_deptno hr.dept.deptno%type;
  begin
  select max(deptno) into v_deptno from hr.dept;
  for i in 1..5 loop
  insert into hr.dept values(v_deptno+i,'Test'||to_char(i),null);
  end loop;
  end;
  事务处理控制语句(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;
  /
  *********
  drop table t1 purge;
  create table t1 (id number);
  begin
  for i  in 1..1000 loop
  insert into t1 values(i);
  if i mod 50 = 0
  then
  commit;
  end if;
  end loop;
  end;
  Plsql table+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;
  /
  declare
  v_deptno hr.dept.deptno%type;
  v_dname hr.dept.dname%type;
  v_loc hr.dept.loc%type;
  v_max number;
  begin
  select count(*) into v_max from hr.dept;
  for i in 1..v_max loop
  select deptno,dname,loc into v_deptno,v_dname,v_loc
  from (select rownum rn,d.* from hr.dept d)
  where rn=i;
  dbms_output.put_line(v_deptno||' '||v_dname||' '||v_loc);
  end loop;
  end;
  /


运维网声明 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.iyunv.com/thread-577564-1-1.html 上篇帖子: Oracle语句连接查询 下篇帖子: 收获,不止oracle 章节结构
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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