Mysql은 5.0부터 저장 프로시저를 지원했습니다. 일반인의 관점에서 저장 프로시저는 캡슐화된 SQL이지만 단순히 SQL이 아니라 일반적으로 변수, 조건부 판단, 루프 본문, 커서 등도 포함합니다.
저장 프로시저의 역할
많은 시나리오에서 필요한 새 데이터를 생성하려면 여러 테이블의 데이터를 처리해야 합니다. 이러한 여러 테이블의 데이터는 연결 등의 쿼리 방식을 통해서는 제공될 수 없으며, 판단과 루프를 통해서만 생성될 수 있습니다. 이때 저장 프로시저를 사용하여 이를 달성할 수 있습니다.
또한 저장 프로시저에는 성능 향상, 네트워크 요청 감소 기능과 같은 몇 가지 이점도 있습니다. 저장 프로시저를 사용하여 구현하지 않는 경우 MySQL을 여러 번 호출해야 하며, PHP를 사용하여 구현하는 경우 여러 요청을 생성해야 합니다.
물론 저장 프로시저에도 단점이 있는 것은 아니며 조정이 쉽지 않고 클러스터링을 지원하지 않습니다.
저장 프로시저 생성
저장 프로시저 생성 구문은 다음과 같습니다.
CREATE PROCEDURE 过程名(参数) BEGIN 过程体 END
매개변수의 경우 매개변수 설정 구문은
[IN|OUT|INOUT] 매개변수 이름 유형
IN은 변수를 프로세스 내부에서만 사용할 수 있음을 의미합니다.
OUT은 변수를 프로세스 외부에서만 사용할 수 있음을 의미합니다.
INOUT은 프로세스 내부와 외부 모두에서 사용할 수 있음을 의미합니다. 가장 간단한 저장 프로시저를 만들어 보겠습니다.
CREATE PROCEDURE p1(IN x INT) BEGIN SELECT x; END;
Variables
MySQL의 변수는 전역 변수와 지역 변수로 구분됩니다. 전역 변수는 @로 시작하므로 직접 사용할 수 있습니다. 예를 들어
SET @name='gwx';
로컬 변수를 먼저 선언해야 합니다.
DECLARE x int DEFAULT 0;
자. 저장 프로시저: 거리를 기준으로 요금을 계산합니다. 3km 이내의 거리는 1km당 1.2위안으로 계산됩니다.
-- distance 路程 CREATE PROCEDURE p1(in distance FLOAT) BEGIN DECLARE d_money FLOAT DEFAULT 0; IF distance>3 THEN SET d_money=6+(distance-3)*1.2; ELSE SET d_money=6; END IF; SELECT d_money; END;
cursor
PHP와 비교하면, 커서는 foreach와 약간 유사하며 반복할 때마다 레코드를 가져옵니다. 커서 정의:
declare 游标名 CURSOR FOR SELECT 语句
커서 열기 및 닫기:
커서 이름 열기
커서 이름 닫기
커서 데이터 가져오기:
FETCH 游标名 INTO 变量名
커서를 사용하여 매우 간단한 기능을 완성하고 test_cursor 테이블의 모든 숫자를 더하세요.
CREATE TABLE IF NOT EXISTS test_cursor( num1 INT(10) UNSIGNED NOT NULL DEFAULT 0, num2 INT(10) UNSIGNED NOT NULL DEFAULT 0 ); INSERT INTO test_cursor(num1,num2) VALUES(1,1),(2,2),(3,3); CREATE PROCEDURE `test_cursor`() BEGIN DECLARE sum INT(10) DEFAULT 0; DECLARE n1,n2 INT(10); DECLARE done INT DEFAULT 0; DECLARE cur CURSOR FOR SELECT num1,num2 FROM test_cursor; DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1; OPEN cur; -- 打开游标 WHILE done=0 DO FETCH cur INTO n1,n2; IF done=0 THEN -- 注意这里为什么加IF条件,不加的话,最后一个值会被多加一遍 SET sum=sum+n1+n2; END IF; END WHILE; CLOSE cur; -- 关闭游标 SELECT sum; END
여기서 주의할 점이 몇 가지 있습니다. 먼저, 커서를 선언하기 전에 지역 변수의 정의를 먼저 선언해야 합니다.
또한 여기서 DECLARE CONTINUE HANDLER FOR SQLSTATE '02000' SET done=1;은 루프를 종료하기 위해 커서가 끝난 후 done이 1로 설정됨을 의미합니다.
위 내용은 Mysql 변수, 커서 및 저장 프로시저 적용의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!