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;