存储过程一直没仔细学,今天为了完成实验,老老实实看了书,在网上看了不少东西,想起来简单,实现起来不容易啊,经过一个多小时的攻坚克难,总算实现了老师的要求,把完美的命令过程贴在下面,用于以后的改进
问题描述:
现有三张表,教职工,转换,论文,教职工记录学院教职工的基本信息,这里要用的是姓名和所属系别,转换是教职工中文名和英文名的转换关系,论文是教职工所发表的论文信息,其中的作者数据可能是中文名也可能是英文名,要实现的是写一个存储过程实现以系中心为参数,查找各系中心发表的论文数。
************
Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 121 Server version: 5.5 . 16 MySQL Community Server (GPL) Copyright (c) 2000 , 2011 , Oracle and/or its affiliates. All rights reserved. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type ' help; ' or ' \h ' for help. Type ' \c ' to clear the current input statement. mysql > use sstest; Database changed mysql > desc 教职工; + -- ----------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | + -- ----------+--------------+------+-----+---------+----------------+ | 教职工ID | int ( 11 ) | NO | PRI | NULL | auto_increment | | 工号 | mediumint( 9 ) | YES | | NULL | | | 姓名 | varchar ( 30 ) | NO | | NULL | | | 性别 | varchar ( 5 ) | NO | | NULL | | | 系中心 | varchar ( 40 ) | YES | | NULL | | | 职务 | varchar ( 30 ) | YES | | NULL | | | 职称 | varchar ( 30 ) | YES | | NULL | | | 退休前职务 | varchar ( 30 ) | NO | | NULL | | | 调离前职务 | varchar ( 50 ) | YES | | NULL | | | 调离前所属 | varchar ( 50 ) | YES | | NULL | | | 固定电话 | varchar ( 11 ) | YES | | NULL | | | 移动电话 | int ( 11 ) | YES | | NULL | | | 出生日期 | date | YES | | NULL | | | 电子邮件 | varchar ( 30 ) | YES | | NULL | | | 备注 | varchar ( 50 ) | YES | | NULL | | + -- ----------+--------------+------+-----+---------+----------------+ 15 rows in set ( 0.04 sec) mysql > desc 转换; + -- ------+-------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | + -- ------+-------------+------+-----+---------+-------+ | 英文名 | varchar ( 30 ) | YES | | NULL | | | 中文名 | varchar ( 30 ) | YES | | NULL | | + -- ------+-------------+------+-----+---------+-------+ 2 rows in set ( 0.00 sec) mysql > desc 论文; + -- ------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | + -- ------+--------------+------+-----+---------+----------------+ | 成果ID | int ( 11 ) | NO | PRI | NULL | auto_increment | | 作者 | varchar ( 100 ) | NO | | NULL | | | 题名 | varchar ( 160 ) | YES | | NULL | | | 刊名 | varchar ( 160 ) | YES | | NULL | | + -- ------+--------------+------+-----+---------+----------------+ 4 rows in set ( 0.00 sec) mysql > delimiter // mysql > drop procedure if exists `get_count_of_paper_of_major`; // Query OK, 0 rows affected ( 0.04 sec) mysql > create procedure get_count_of_paper_of_major( in major_name varchar ( 40 ), out count_of_papers int ) -> reads sql data -> begin -> declare cnt int default 0 ; -> declare tmp int default 0 ; -> declare tmp_name varchar ( 30 ) default ""; -> declare mycursor cursor for select 英文名 from 教职工,转换 where 教职工.系中心 = major_name and 转换.中文名 = 教职工.姓名; -> DECLARE CONTINUE HANDLER FOR SQLSTATE ' 02000 ' SET tmp_name = NULL ; -> -> open mycursor; -> fetch mycursor into tmp_name; -> while (tmp_name is not null ) -> do -> select count ( * ) from 论文 where 作者 = tmp_name into tmp; -> set cnt = cnt + tmp; -> set tmp = 0 ; -> fetch mycursor into tmp_name; -> end while ; -> close mycursor; -> set count_of_papers = cnt; -> end -> // Query OK, 0 rows affected ( 0.00 sec) mysql > delimiter ; mysql > call get_count_of_paper_of_major( ' 软件工程系 ' , @count_of_papers ); Query OK, 0 rows affected, 1 warning ( 0.00 sec) mysql > select @count_of_papers ; + -- ----------------+ | @count_of_papers | + -- ----------------+ | 21 | + -- ----------------+ 1 row in set ( 0.00 sec) mysql > call get_count_of_paper_of_major( ' 数字媒体技术系 ' , @count_of_papers ); Query OK, 0 rows affected, 1 warning ( 0.00 sec) mysql > select @count_of_papers ; + -- ----------------+ | @count_of_papers | + -- ----------------+ | 0 | + -- ----------------+ 1 row in set ( 0.00 sec) mysql > call get_count_of_paper_of_major( ' 信息安全系 ' , @count_of_papers ); Query OK, 0 rows affected, 1 warning ( 0.00 sec) mysql > select @count_of_papers ; + -- ----------------+ | @count_of_papers | + -- ----------------+ | 2 | + -- ----------------+ 1 row in set ( 0.00 sec) mysql >
对比以前写的语句,恩,好像没有问题
不得不说MySQL在存储过程和触发器还是和MS SQL Server,DB2,Oracle的差距还很大,很多的功能就MySQL没有实现,实现了的也相对比较麻烦,嗯,不管怎么样,希望MySQL越做越好,以开源战胜商业!加油