存储过程循环嵌套(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

参考文档

原文地址:https://www.cnblogs.com/it774274680/p/15048620.html