存儲過程一直沒仔細學,今天為了完成實驗,老老實實看了書,在網上看了不少東西,想起來簡單,實現起來不容易啊,經過一個多小時的攻堅克難,總算實現了老師的要求,把完美的命令過程貼在下面,用于以后的改進
?
問題描述:
現有三張表,教職工,轉換,論文,教職工記錄學院教職工的基本信息,這里要用的是姓名和所屬系別,轉換是教職工中文名和英文名的轉換關系,論文是教職工所發表的論文信息,其中的作者數據可能是中文名也可能是英文名,要實現的是寫一個存儲過程實現以系中心為參數,查找各系中心發表的論文數。
************
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越做越好,以開源戰勝商業!加油
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061
微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元

