存儲過程一直沒仔細學,今天為了完成實驗,老老實實看了書,在網上看了不少東西,想起來簡單,實現起來不容易啊,經過一個多小時的攻堅克難,總算實現了老師的要求,把完美的命令過程貼在下面,用於以后的改進
問題描述:
現有三張表,教職工,轉換,論文,教職工記錄學院教職工的基本信息,這里要用的是姓名和所屬系別,轉換是教職工中文名和英文名的轉換關系,論文是教職工所發表的論文信息,其中的作者數據可能是中文名也可能是英文名,要實現的是寫一個存儲過程實現以系中心為參數,查找各系中心發表的論文數。
************
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越做越好,以開源戰勝商業!加油