存储过程循环嵌套(2)
单层循环
create or replace procedure demo1() is
declare
begin
for i in 1..5 loop
if i=2 then
continue;
end if;
select i;
end loop;
end;
双层循环
循环遍历
create or replace procedure demo2() is
declare
n number;
begin
for i in 1..3 loop
for j in 4..6 loop
select i,j;
end loop;
end loop;
end;
跳出内层循环
方式1:
create or replace procedure demo3() is
declare
n number;
begin
for i in 1..3 loop
for j in 4..6 loop
if i= 2 then
select 'test';
continue;
end if;
select i,j;
end loop;
end loop;
end;
方式2:
declare
n number;
begin
for i in 1..3 loop
for j in 4..6 loop
if i= 2 then
select 'test';
goto next123;
end if;
select i,j;
<<next123>>
null;
end loop;
end loop;
end;
注意:
- 使用
continue
的话只是跳过本次循环,执行下次循环。针对当前的示例来说当i为2时,会输出3次test,而不会执行select i,j;
- 使用
goto
的时候不能使用next
关键字 <<next>>
标签后的null;
语句不可少,因为goto标签后必须紧接着一个执行语句
跳出外层循环
create or replace procedure demo4() is
declare
n number;
begin
for i in 1..3 loop
for j in 4..6 loop
if i= 2 then
select 'test';
goto next123;
end if;
select i,j;
end loop;
<<next123>>
null;
end loop;
end;
- 可以根据需要跳出到指定的位置
示例
需求:用存储过程实现查询所有用户的省份,然后输出这个省份有哪些数据
-- 1. 建表插入数据
create table t_user_info(
name varchar2(10),
p_code number
);
insert into t_user_info values ('admin',001);
insert into t_user_info values ('zs',002);
create table t_r_province_city(
code number,
c_name varchar(10)
);
insert into t_r_province_city values (001,'广州市');
insert into t_r_province_city values (002,'中山市');
insert into t_r_province_city values (003,'珠海市');
insert into t_r_province_city values (002,'温州市');
insert into t_r_province_city values (002,'嘉兴市');
-- 2. 创建存储过程
create or replace procedure find_citys() is
-- 创建游标
cursor provinces is select name,p_code from t_user_info;
begin
-- 从游标的结果取值
-- `province_obj`为每行的结果是一个对象;可以根据`对象.列名`的方式获取对应列的值
for province_obj in provinces LOOP
-- 根据p_code查询所对应的市数据有哪些
for city_obj in (select c_name from t_r_province_city where code=province_obj.p_code) LOOP
select province_obj.name,city_obj.c_name;
END LOOP;
END LOOP;
end;
- 什么时候创建游标?当需要对数据进行遍历,并且根据遍历的结果再做其他的操作时
for...in
方式遍历结果集(结果集可以是游标或其他的联表查询)的时候,可以直接拼接SQL