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

    参考文档

  • 相关阅读:
    Tomcat6 一些调优设置内存和连接数
    【原创】使用c3p0数据库连接池时出现com.mchange.v2.resourcepool.TimeoutException
    JVM内存的设置
    JBOSS以及tomcat最大连接数配置和jvm内存配置
    摘抄python __init__
    Python中__init__方法介绍
    Python 绝对简明手册
    python中eval, exec, execfile,和compile [转载]
    extern、static、auto、register 定义变量的不同用法
    Python 网络编程说明
  • 原文地址:https://www.cnblogs.com/it774274680/p/15048620.html
Copyright © 2011-2022 走看看