02_流程控制


  1 -----------------------------------------------------
  2            条件判断
  3 -----------------------------------------------------
  4 7. 使用 IF ... THEN ... ELSIF ... THEN ...ELSE ... END IF;
  5 
  6 要求: 查询出 150号 员工的工资, 若其工资大于或等于 10000 则打印 'salary >= 10000'; 
  7 若在 5000 到 10000 之间, 则打印 '5000<= salary < 10000'; 否则打印 'salary < 5000'
  8 (方法一)
  9 declare
 10   v_salary employees.salary%type;
 11 begin
 12   --通过 select ... into ... 语句为变量赋值
 13  select salary into v_salary
 14  from employees
 15  where employee_id = 150;
 16  
 17  dbms_output.put_line('salary: ' || v_salary);
 18  
 19  -- 打印变量的值
 20  if v_salary >= 10000 then
 21     dbms_output.put_line('salary >= 10000');
 22  elsif v_salary >= 5000 then
 23     dbms_output.put_line('5000 <= salary < 10000');
 24  else
 25     dbms_output.put_line('salary < 5000');
 26  end if;
 27 (方法二)
 28 declare
 29      v_emp_name employees.last_name%type;
 30      v_emp_sal employees.salary%type;
 31      v_emp_sal_level varchar2(20);
 32 begin
 33      select last_name,salary into v_emp_name,v_emp_sal from employees where employee_id = 150;
 34      
 35      if(v_emp_sal >= 10000) then v_emp_sal_level := 'salary >= 10000';
 36      elsif(v_emp_sal >= 5000) then v_emp_sal_level := '5000<= salary < 10000';
 37      else v_emp_sal_level := 'salary < 5000';
 38      end if;
 39      
 40      dbms_output.put_line(v_emp_name||','||v_emp_sal||','||v_emp_sal);
 41 end;
 42 
 43 7+ 使用 CASE ... WHEN ... THEN ...ELSE ... END 完成上面的任务
 44 
 45 declare
 46        v_sal employees.salary%type;
 47        v_msg varchar2(50);
 48 begin     
 49        select salary into v_sal
 50        from employees
 51        where employee_id = 150;
 52        
 53        --case 不能向下面这样用
 54        /*
 55        case v_sal when salary >= 10000 then v_msg := '>=10000' 
 56                   when salary >= 5000 then v_msg := '5000<= salary < 10000'
 57                   else v_msg := 'salary < 5000'
 58        end;
 59        */
 60  
 61        v_msg := 
 62              case trunc(v_sal / 5000)
 63                   when 0 then 'salary < 5000'
 64                   when 1 then '5000<= salary < 10000'
 65                   else 'salary >= 10000'
 66              end;
 67        
 68        dbms_output.put_line(v_sal ||','||v_msg);
 69 end;
 70 
 71 8. 使用 CASE ... WHEN ... THEN ... ELSE ... END;
 72 
 73 要求: 查询出 122 号员工的 JOB_ID, 若其值为 'IT_PROG', 则打印 'GRADE: A'; 
 74                         'AC_MGT', 打印 'GRADE B', 
 75                         'AC_ACCOUNT', 打印 'GRADE C'; 
 76                         否则打印 'GRADE D'
 77 
 78 declare
 79        --声明变量
 80        v_grade char(1);
 81        v_job_id employees.job_id%type;
 82 begin
 83        select job_id into v_job_id
 84        from employees
 85        where employee_id = 122;
 86        
 87        dbms_output.put_line('job_id: ' || v_job_id);
 88        
 89        --根据 v_job_id 的取值, 利用 case 字句为 v_grade 赋值
 90        v_grade :=  
 91                case v_job_id when 'IT_PROG' then 'A'
 92                              when 'AC_MGT' then 'B'
 93                              when 'AC_ACCOUNT' then 'C'
 94                              else 'D'
 95                 end;
 96                 
 97        dbms_output.put_line('GRADE: ' || v_grade);
 98 end; 
 99 -----------------------------------------------------
100            循环结构
101 -----------------------------------------------------
102 9. 使用循环语句打印 1 - 100.(三种方式)
103 
104 1).  LOOP ... EXIT WHEN ... END LOOP
105 declare
106        --初始化条件
107        v_i number(3) := 1;
108 begin
109        loop
110        --循环体
111         dbms_output.put_line(v_i);
112     --循环条件
113         exit when v_i = 100;
114     --迭代条件
115         v_i := v_i + 1;
116        end loop;
117 end;
118 
119 2). WHILE ... LOOP ... END LOOP
120 declare
121        --初始化条件
122        v_i number(3) := 1;
123 begin
124        --循环条件
125        while v_i <= 100 loop
126          --循环体
127              dbms_output.put_line(v_i);
128          --迭代条件
129              v_i := v_i + 1;
130        end loop;
131 end; 
132 
133 3).
134 begin
135        for i in 1 .. 100 loop
136              dbms_output.put_line(i);
137        end loop;
138 end;
139 
140 10. 综合使用 if, while 语句, 打印 1 - 100 之间的所有素数
141 (素数: 有且仅用两个正约数的整数, 2, 3, 5, 7, 11, 13, ...).
142 declare
143   v_flag number(1):=1;
144   v_i number(3):=2;
145   v_j number(2):=2;
146 begin
147 
148   while (v_i<=100) loop
149         while v_j <= sqrt(v_i) loop
150               if (mod(v_i,v_j)=0) then v_flag:= 0;
151           end if;
152              
153           v_j :=v_j +1;
154         end loop;
155         
156     if(v_flag=1) then dbms_output.put_line(v_i);
157     end if;
158 
159         v_flag :=1;
160         v_j := 2;
161         v_i :=v_i +1;
162    end loop;
163 
164 end;
165 
166 
167 (法二)使用for循环实现1-100之间的素数的输出
168 declare
169   --标记值, 若为 1 则是素数, 否则不是
170   v_flag number(1) := 0;
171 begin
172    for i in 2 .. 100 loop
173 
174        v_flag := 1;     
175          
176        for j in 2 .. sqrt(i) loop
177            if i mod j = 0 then
178               v_flag := 0;    
179            end if;        
180        end loop;
181        
182        if v_flag = 1 then
183            dbms_output.put_line(i);
184        end if;
185        
186    end loop;
187 end;
188 
189 11. 使用 goto
190 declare
191   --标记值, 若为 1 则是素数, 否则不是
192   v_flag number(1) := 0;
193 begin
194    for i in 2 .. 100 loop
195        v_flag := 1;     
196          
197        for j in 2 .. sqrt(i) loop
198            if i mod j = 0 then
199               v_flag := 0;
200               goto label; 
201            end if;        
202        end loop;
203        
204        <<label>>
205        if v_flag = 1 then
206            dbms_output.put_line(i);
207        end if;
208        
209    end loop;
210 end; 
211 
212 11+.打印1——100的自然数,当打印到50时,跳出循环,输出“打印结束”
213 (方法一)
214 begin
215   for i in 1..100 loop
216       dbms_output.put_line(i);
217       if(i = 50) then 
218       goto label;
219       end if;
220   end loop;
221       
222       <<label>>
223       dbms_output.put_line('打印结束');
224 
225 end;
226 (方法二)
227 begin
228   for i in 1..100 loop
229       dbms_output.put_line(i);
230       if(i mod 50 = 0) then dbms_output.put_line('打印结束');
231       exit;
232       end if;
233   end loop;
234 end;

 

上一篇:数据库知识总结(一):数据库概念理论简介


下一篇:Oracle自定义DES3加解密