当创建一个存储过程时,我们需要考虑以下几个方面:
-
存储过程的目的和功能: 首先确定存储过程的目的,是为了执行何种功能,如查询、更新、删除等。
-
存储过程的输入和输出: 确定存储过程是否需要接收参数,并且需要确定参数的数据类型和数量。同时,确定存储过程是否需要返回结果,如果需要返回结果,需要定义返回结果的类型和形式。
-
编写存储过程的 SQL 语句: 根据存储过程的目的和功能,编写包含 SQL 语句的存储过程主体。
-
创建存储过程: 最后将这些步骤组合起来,创建存储过程并在数据库中保存。
以上表为例
创建存储过程用查询
DELIMITER //
CREATE PROCEDURE search(IN student_id INT)
BEGIN
SELECT ci.id AS id, ci.name AS name, cs.score AS score, ci.age AS age, ci.address AS address
FROM class1_infor ci
INNER JOIN class1_score cs ON ci.id = cs.id
WHERE ci.id = student_id;
END //
DELIMITER ;
-
DELIMITER //
: 这里设置了自定义的分隔符为//
,这是为了告诉 MySQL 解析器,直到遇到//
才认为存储过程的定义结束。这是因为在存储过程的定义中可能包含多个语句,而默认的分隔符;
可能会导致解析器在遇到分号时认为语句结束,而不是存储过程的结束。 -
CREATE PROCEDURE search(IN student_id INT)
: 这里开始了存储过程search
的创建,它接收一个INT
类型的参数student_id
。 -
BEGIN
: 存储过程体的开始。 -
SELECT ci.id AS id, ci.name AS name, cs.score AS score, ci.age AS age, ci.address AS address
: 这是查询语句,用于从class1_infor
和class1_score
表中检索数据。通过内连接 (INNER JOIN
),将两个表连接起来,然后根据student_id
进行过滤,选择对应学生的信息。在结果中,将学生的id
、name
、score
、age
和address
进行了别名的设置。 -
END //
: 存储过程体的结束。这里使用了定义的自定义分隔符//
来表示存储过程的结束。 -
DELIMITER ;
: 恢复默认的分隔符;
,这样后续的 SQL 语句又可以使用分号作为结束符号了。
show procedure status like '%search%'\G;
show procedure status
是用来显示数据库中存储过程的信息,like '%search%'
是用来筛选包含 "search" 的存储过程名称。
Db
: 存储过程所在的数据库名称为school
。Name
: 存储过程的名称为search
。Type
: 类型为PROCEDURE
,表示它是一个存储过程。Definer
: 定义者为root@localhost
,表示存储过程是由root
用户在本地localhost
上创建的。Modified
: 最后修改时间为2024-03-27 16:36:02
。Created
: 创建时间为2024-03-27 16:36:02
。Security_type
: 安全类型为DEFINER
。Comment
: 评论为空。
删除存储过程
要删除存储过程,可以使用 DROP PROCEDURE
语句,指定要删除的存储过程的名称。
DROP PROCEDURE IF EXISTS search;