标签:declare evel div 之间 ast rom 循环条件 for line
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;
标签:declare evel div 之间 ast rom 循环条件 for line
原文地址:https://www.cnblogs.com/shici/p/14406154.html