database mysql 存储过程的简单例子

mysql 存储过程的简单例子

 

 

-- 定义新的语句分隔符//
delimiter //
create procedure pd016()
begin
	-- ----------------------------------
	-- 本存储过程主要实现以下操作
	-- 1.查询游戏表的数据
	-- 2.根据游戏表数据去获取类型表的信息
	-- ----------------------------------

	-- 创建一个临时表
	create temporary table if not exists tmpTable
	(
		id int(11) NOT NULL AUTO_INCREMENT,
		game_id int(11),
		catalog_name varchar(100),
		primary key(id)
	) engine=memory;

	-- 显示临时表数据
	select * from tmpTable;

	begin

		-- declare 必须紧跟着在begin之后定义
		declare m_ga_id int;
		declare m_game_name_cn varchar(100);

		declare m_catalog_game_id int;
		declare m_catalog_name varchar(100);

		-- 定义游标结束标志
		declare m_stop_flag int default 0;

		-- 定义需要使用的游标
		declare cursor_game cursor for  select ga_id,ga_name_cn from t021_game;
		declare cursor_catalog cursor for SELECT ca_game_id,ca_name FROM t025_catalog where ca_game_id=m_ga_id;

		-- 如果用了游标cursor,则必须定义这个游标结束标志,用来判读游标是否到底
		-- 如果有多个游标,那么这些游标共用这个结束标志
		-- 在读取游标所在记录时,必须先判断结束标志
		-- 如果多个游标是嵌套关系,那么内层游标结束之后,必须将结束标志恢复为0,否则会影响外层游标的使用
		declare continue handler for not found set m_stop_flag=1;

		-- 打开前面定义的游标
		open cursor_game;

		-- 循环开始
		-- 从游标当前位置取出1条记录,执行后游标会自动会移动到下一条记录
		-- 将取出的字段赋给定义好的变量,注意游标字段与变量的一一对应关系
		repeat fetch cursor_game into m_ga_id,m_game_name_cn;

			-- 判读游标是否到底
			if m_stop_flag=0 then

				-- 打开游标
				open cursor_catalog;

				-- 内层循环开始
				repeat fetch cursor_catalog into m_catalog_game_id,m_catalog_name;

					-- 判读游标是否到底
					if m_stop_flag=0 then
						-- 将数据存入临时表中
						insert into tmpTable(game_id,catalog_name) values(m_ga_id,m_catalog_name);
					end if;

				-- 游标结束标志为1,表示游标到底,内层循环结束。
				until m_stop_flag=1 end repeat;

				-- 关闭游标
				close cursor_catalog;

				-- 设置游标结束标志为0(0=未结束),这样可以让外层循环继续执行。
				set m_stop_flag=0;

			end if;

		-- 游标结束标志为1,表示游标到底,循环结束。
		until m_stop_flag=1 end repeat;

		-- 关闭游标
		close cursor_game;

	end;

	-- 显示临时表数据
	select * from tmpTable;

	-- 结束前清除临时表数据
	truncate table tmpTable;

end;
-- //表示创建存储过程语句的结束
//
-- 恢复语句分隔符为;
delimiter ;

Tagged: ,

Comments are closed.