zoukankan      html  css  js  c++  java
  • 存储过程循环嵌套(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

    参考文档

  • 相关阅读:
    重温CLR(七 ) 属性和事件
    重温CLR(六)方法和参数
    KMP算法
    Webstorm 2019最新激活码
    bash: cd: too many arguments 报错
    mongoDB线上数据库连接报错记录
    常见的 eslint 基本报错信息
    git 查看项目代码统计命令
    npm 删除指定的某个包以及再次安装
    vue.config.js常用配置
  • 原文地址:https://www.cnblogs.com/it774274680/p/15048620.html
Copyright © 2011-2022 走看看