Mysql 변수, 커서 및 저장 프로시저 적용

齐天大圣
풀어 주다: 2020-05-29 10:41:29
원래의
1713명이 탐색했습니다.

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿