MySQL은 현재 가장 널리 사용되는 관계형 데이터베이스 관리 시스템입니다. 이는 저장 프로시저를 사용하여 SQL 문과 프로그램의 실행을 더 잘 유지하고 관리합니다. 저장 프로시저는 일반적으로 사용되는 SQL 문을 캡슐화하여 여러 실행 중에 효율성을 높이고 런타임 리소스 사용량을 줄일 수 있는 미리 컴파일된 SQL 코드 블록입니다.
MySQL의 저장 프로시저 사용
1. 저장 프로시저 생성
기본적으로 저장 프로시저를 생성한다는 것은 SQL 문 블록을 작성하고 이 코드 블록을 시스템 데이터베이스에 저장하는 것입니다. 다음은 구체적인 예입니다.
CREATE PROCEDURE `procedure_name` (`parameter_list`) BEGIN -- SQL 语句块 END
그 중 procedure_name
은 저장 프로시저의 이름이고, paramter_list
는 입력을 포함할 수 있는 저장 프로시저의 매개변수 목록입니다. 매개변수 및 출력 매개변수는 물론 매개변수를 포함할 수 없습니다. procedure_name
是存储过程的名称,paramter_list
是存储过程的参数列表,可以包括入参、出参,也可以不包含参数。
例如,我们创建一个获取用户信息的存储过程:
CREATE PROCEDURE `get_user_info`(user_id INT) BEGIN SELECT * FROM `user` WHERE `user_id` = user_id; END
在存储过程的 SQL 语句块中,我们可以使用 MySQL 支持的所有 SQL 语句,如 SELECT、INSERT、UPDATE、DELETE 等,还可以使用控制流语句,例如 IF、WHILE、LOOP 等,从而实现更复杂的数据逻辑处理。
2、调用存储过程
创建存储过程之后,我们可以通过 CALL 语句来调用存储过程,并向其传递参数:
CALL procedure_name(param1, param2, ...)
例如,我们可以按如下方式调用上面定义的 get_user_info
存储过程:
CALL `get_user_info`(1);
3、删除存储过程
如果随着时间的推移,一个存储过程已经不再需要,可以使用 DROP PROCEDURE 语句删除它:
DROP PROCEDURE `procedure_name`;
例如:
DROP PROCEDURE `get_user_info`;
4、存储过程实例
我们来看一个完整的存储过程实例。假设我们有一个 score
表,存储了学生的考试成绩,而我们需要计算出每个学生的总分、平均分,并按照总分从高到低排列。这时可以使用存储过程来实现:
CREATE PROCEDURE `calc_stu_score`() BEGIN DECLARE `total_score` INT; DECLARE `avg_score` FLOAT; DECLARE `stu_id` INT DEFAULT 0; DECLARE `stu_name` VARCHAR(255); DECLARE `total` INT DEFAULT 0; DECLARE `cursor_stu_id` CURSOR FOR SELECT `stu_id` FROM `score` GROUP BY `stu_id`; DECLARE CONTINUE HANDLER FOR NOT FOUND SET finished = TRUE; DROP TEMPORARY TABLE IF EXISTS `tmp_score`; CREATE TEMPORARY TABLE `tmp_score` ( `stu_id` INT NOT NULL, `stu_name` VARCHAR(255) NOT NULL, `total_score` INT NOT NULL, `avg_score` FLOAT NOT NULL, PRIMARY KEY (`stu_id`) ); OPEN cursor_stu_id; stu_loop: LOOP FETCH cursor_stu_id INTO stu_id; IF finished = TRUE THEN LEAVE stu_loop; END IF; SELECT `name` INTO stu_name FROM `student` WHERE `stu_id` = stu_id; SELECT SUM(`sorce`), COUNT(*) INTO total_score, total FROM `score` WHERE `stu_id` = stu_id; SET avg_score = total_score / NULLIF(total, 0); INSERT INTO `tmp_score` (`stu_id`, `stu_name`, `total_score`, `avg_score`) VALUES (stu_id, stu_name, total_score, avg_score); END LOOP; CLOSE cursor_stu_id; SELECT * FROM `tmp_score` ORDER BY `total_score` DESC; DROP TEMPORARY TABLE `tmp_score`; END
在这个存储过程中,我们首先定义了一些需要使用的变量,包括 total_score
表示某个学生的总分,avg_score
表示某个学生的平均分,stu_id
表示某个学生的编号,stu_name
表示某个学生的姓名,还有一个临时表 tmp_score
。
然后我们使用了 DECLARE CURSOR
语句声明了一个游标变量 cursor_stu_id
,用于查询学生表中的学生编号。在循环中,我们根据这个学生编号查询成绩表,计算出该学生的总分和平均分,并将其保存到临时表中。最后,我们使用 SELECT
语句查询临时表,按照总分从高到低排序,并在最后使用 DROP TABLE
语句删除临时表。
最后,我们可以使用 CALL
CALL `calc_stu_score`();
get_user_info를 호출할 수 있습니다. 다음 코드> 저장 프로시저: 🎜rrreee🎜3. 저장 프로시저 삭제🎜🎜시간이 지나면서 저장 프로시저가 더 이상 필요하지 않으면 DROP PROCEDURE 문을 사용하여 삭제할 수 있습니다. 🎜rrreee🎜예: 🎜rrreee🎜4. 저장 프로시저 예시🎜🎜전체 저장 프로시저 예시를 살펴보겠습니다. 학생들의 시험 점수를 저장하는 <code>점수
테이블이 있고, 각 학생의 총점과 평균 점수를 계산하고 총점에 따라 높은 것부터 낮은 것 순으로 정렬해야 한다고 가정해 보겠습니다. 이는 저장 프로시저를 사용하여 달성할 수 있습니다: 🎜rrreee🎜이 저장 프로시저에서는 먼저 학생의 총 점수를 나타내는 total_score
와 avg_score는 특정 학생의 평균 점수를 나타내고, <code>stu_id
는 특정 학생의 번호를 나타내며, stu_name
은 특정 학생의 이름을 나타내며, 임시 테이블 tmp_score
. 🎜🎜그런 다음 DECLARE CURSOR
문을 사용하여 학생 테이블에서 학생 번호를 쿼리하는 데 사용되는 커서 변수 cursor_stu_id
를 선언했습니다. 루프에서는 이 학생 번호를 기반으로 점수 테이블을 쿼리하고 학생의 총점과 평균 점수를 계산하여 임시 테이블에 저장합니다. 마지막으로 SELECT
문을 사용하여 임시 테이블을 쿼리하고 총 점수를 높은 순으로 정렬한 다음 마지막으로 DROP TABLE
문을 사용하여 임시 테이블을 삭제합니다. 🎜🎜마지막으로 CALL
문을 사용하여 이 저장 프로시저를 호출할 수 있습니다. 🎜rrreee🎜요약🎜🎜 저장 프로시저는 MySQL의 매우 강력한 도구로, 데이터베이스 작업 프로세스를 크게 단순화하고 개선할 수 있습니다. 데이터베이스 성능 및 보안. 실제 응용 프로그램에서는 저장 프로시저를 사용하여 많은 복잡한 데이터 처리 작업을 완료하여 비즈니스 요구 사항을 더 효과적으로 충족하고 효율성을 향상하며 비용을 절감할 수 있습니다. 🎜위 내용은 mysql은 저장 프로시저를 사용한다의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!