데이터베이스 Mysql_ 연구 노트 (2 개)

2 장 Mysql 저장 프로 시저

기술:

    데이터베이스 사용자 이름은 root, 암호는 rootpwd, 연결은 로컬 Windows mysql 데이터베이스입니다.

    데이터베이스 버전, SELECT VERSION (), 8.0.15

    데이터베이스 엔진 : SHOW ENGINES

   

   위 그림에서 알 수 있듯이 InnoDB 만 트랜잭션을 지원합니다.

   기본 데이터베이스 엔진 : SHOW VARIABLES LIKE'default_storage_engine '

 

위 그림에서 알 수 있듯이 InnoDB는 기본 데이터 엔진입니다.

준비된 데이터 테이블의 구조 : 

SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;

-- ----------------------------
-- Table structure for trans_order
-- ----------------------------
DROP TABLE IF EXISTS `trans_order`;
CREATE TABLE `trans_order`  (
  `WAYBILL_NO` int(255) NOT NULL COMMENT '运单号',
  `SEND_SITE_ID` int(11) NULL DEFAULT NULL COMMENT '寄件网点ID',
  `SEND_SITE_CODE` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '寄件网点代码',
  `SEND_SITE_NAME` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '寄件网点名称',
  `SEND_DATE` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '寄件时间',
  `ORDER_NO` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '订单号',
  `CUSTOMER_ID` int(11) UNSIGNED NULL DEFAULT NULL COMMENT '客户ID',
  `CUSTOMER_NAME` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '客户名称',
  `CUSTOMER_CODE` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '客户代码',
  `SEND_PHONE` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '寄件人联系电话',
  `SEND_PROVINCE_CITY_DISTRICT` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '寄件人省市区',
  `SEND_ADDRESS_DETAIL` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '寄件人详细地址',
  `SEND_PERSON` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '寄件人',
  `DISP_SITE_ID` int(255) NULL DEFAULT NULL COMMENT '目的网点ID',
  `DISP_SITE_NAME` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '目的网点名称',
  `DISP_SITE_CODE` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '目的网点代码',
  `ACCEPT_PHONE` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '收件人电话',
  `ACCEPT_ADDRESS` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '收件人地址',
  `ACCEPT_PROVINCE_CITY_DISTRICT` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '收件人省市区',
  `ACCEPT_PERSON` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '收件人',
  `PRODUCT_ID` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '产品类型',
  `WEIGHT` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '重量',
  `PAYMENT_TYPE` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '支付类型',
  `PAYMENT__DELIVERY_FEE` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '到付费用',
  `PAYMENT__NOW_FEE` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '现付费用',
  `INSURANCE_FEE` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '保险费',
  `GOODS_TYPE` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '货物类型',
  `REMARK` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '备注信息',
  `PACK_TYPE` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL COMMENT '包装方式',
  PRIMARY KEY (`WAYBILL_NO`) USING BTREE
) ENGINE = InnoDB CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;

-- ----------------------------
-- Records of trans_order
-- ----------------------------
INSERT INTO `trans_order` VALUES (8001, 1, '755A', '深圳龙岗坂街道', '20201216131522', '741000015819', 666, '阿聪', '888', '13828892565', '广东省|深圳市|龙岗区', '坂田街道禾坪岗', '阿聪', 9, '湖北武汉大学网点', '027C', '15889861946', '武汉大学', '湖北省|武汉市|武昌区', '阿朱', 'T66', '1.80', '现付', '0', '100.00', '10', '日用品', '零食和衣物', '0');

SET FOREIGN_KEY_CHECKS = 1;

참조 문서: 

     https://www.mysqlzh.com/doc/224.html 

     https://dev.mysql.com/doc/refman/8.0/en/create-procedure.html

2.1 저장 프로 시저 란?

2.1.1 개념

 MySQL 5.0 버전은 저장 프로 시저를 지원하기 시작했습니다.

저장 프로 시저 (Stored Procedure)는 외부 프로 시저가 호출 할 수 있도록 복잡한 프로 시저를 데이터베이스에 저장하는 일종의 데이터베이스 개체입니다. 저장 프로시 저는 특정 함수를 완료하기위한 SQL 문 집합입니다. 컴파일되어 데이터베이스에 저장됩니다. 사용자는 저장 프로 시저의 이름과 지정된 매개 변수 (필요한 경우)를 지정하여 호출하고 실행할 수 있습니다.

저장 프로시 저는 매우 간단합니다. 즉, 데이터베이스 SQL 언어 수준에서 코드 캡슐화 및 재사용이 가능합니다.

2.1.2 장점

  • 저장 프로 시저를 캡슐화하고 복잡한 비즈니스 논리를 숨길 수 있습니다.
  • 저장 프로시 저는 값을 반환 할 수 있으며 매개 변수를 허용 할 수 있습니다.
  • 스토어드 프로시 저는 뷰 테이블, 데이터 테이블 또는 사용자 정의 함수와 다른 서브 루틴이므로 SELECT 명령어를 사용하여 실행할 수 없습니다.
  • 저장 프로시 저는 데이터 검사, 강제 비즈니스 논리 등에 사용할 수 있습니다.
  • 저장 프로 시저의 실행 속도는 비교적 빠르며 미리 컴파일되었습니다.

2.1.3 단점

  • 저장 프로시 저는 지원되는 프로그래밍 언어가 다르기 때문에 종종 특정 데이터베이스에서 사용자 지정됩니다. 다른 제조업체의 데이터베이스 시스템으로 전환 할 때 원래 저장 프로 시저를 다시 작성해야합니다.
  • 저장 프로 시저의 성능 조정 및 쓰기는 다양한 데이터베이스 시스템에 의해 제한됩니다.

2.2 저장 프로 시저의 간단한 예

2.2.1 저장 프로 시저 및 저장 함수 문 만들기

공식 지침 : 

CREATE
    [DEFINER = user]
    PROCEDURE sp_name ([proc_parameter[,...]])
    [characteristic ...] routine_body

CREATE
    [DEFINER = user]
    FUNCTION sp_name ([func_parameter[,...]])
    RETURNS type
    [characteristic ...] routine_body

proc_parameter:
    [ IN | OUT | INOUT ] param_name type

type:
    Any valid MySQL data type

characteristic: {
    COMMENT 'string'
  | LANGUAGE SQL
  | [NOT] DETERMINISTIC
  | { CONTAINS SQL | NO SQL | READS SQL DATA | MODIFIES SQL DATA }
  | SQL SECURITY { DEFINER | INVOKER }
}

routine_body:
    Valid SQL routine statement

기본적으로 프로그램은 현재 데이터베이스와 연결됩니다. 서브 루틴을 지정된 데이터베이스와 명시 적으로 연결하려면 서브 루틴을 만들 때 이름을 db_name.sp_name으로 지정할 수 있습니다

서브 루틴의 이름이 내장 SQL 함수의 이름과 같으면 서브 루틴을 정의 할 때 이름과 후속 대괄호 사이에 공백을 삽입해야합니다. 그렇지 않으면 구문 오류가 발생합니다. 나중에 서브 루틴을 호출 할 때 삽입하십시오. 따라서 이러한 상황이 가능하더라도 기존 SQL 함수와 동일한 이름을 자신의 저장된 서브 루틴에 지정하지 않는 것이 가장 좋습니다.

DEFINER : CREATE PROCEDURE 및 CREATE FUNCTION에는 CREATE ROUTINE 권한이 필요합니다. DEFINER 절이있는 경우 필요한 권한은 사용자 값에 따라 다릅니다.

괄호 안의 매개 변수 목록은 항상 존재해야합니다. 매개 변수가없는 경우 빈 매개 변수 목록 ()을 사용해야합니다. 매개 변수 이름은 대소 문자를 구분하지 않습니다.

각 매개 변수는 기본적으로 IN 매개 변수입니다. 다른 매개 변수를 지정하려면 매개 변수 이름 앞에 키워드 OUT 또는 INOUT을 사용할 수 있습니다.

참고 : 매개 변수를 IN, OUT 또는 INOUT으로 지정하는 것은 PROCEDURE에만 유효합니다. (FUNCTION 매개 변수는 항상 IN 매개 변수로 간주됩니다.)

RETURNS 절은 함수에 필수 인 FUNCTION 만 지정할 수 있습니다. 함수의 반환 유형을 지정하는 데 사용되며 함수 본문에는 RETURN 값 문이 포함되어야합니다.

routine_body : 복합 명령문

[begin_label:] BEGIN
    [statement_list]
END [end_label]

사용할 수있는 문법 템플릿으로 번역 :

delimiter //
CREATE
    PROCEDURE sp_name ([proc_parameter[,...]])
    BEGIN
      [statement_list]
    END//
delimiter;


delimiter //
CREATE
    FUNCTION sp_name ([func_parameter[,...]])
    RETURNS type
    BEGIN
      [statement_list]
    END
delimiter;

  1. 빈 매개 변수 저장 프로 시저 만들기

delimiter //
CREATE
    PROCEDURE query_trans_all ()
    BEGIN
      SELECT * FROM trans_order;
    END//
delimiter;

   저장 프로 시저 호출 

CALL query_trans_all;

  

   실제로 결과는 쿼리 문을 실행하는 것과 같습니다 : SELECT * FROM trans_order; 그러나 쿼리 문은 쿼리 시간을 읽을 때 저장 프로 시저보다 짧을 수 있습니다.

  복잡한 논리는 여러 문으로 구성 할 수 있습니다. 

-- 将多个sql语句封装成一个存储过程 --
delimiter //
CREATE
    PROCEDURE query_trans_all ()
    BEGIN
       [创建表结构]
       [插入表数据]
       [查询表数据]
       ....
    END//
delimiter;

2.3 저장 프로 시저의 변수

2.3.1 저장 프로 시저가 매개 변수 변수를 입력합니다.

스토어드 프로 시저의 매개 변수 유형은 IN, OUT, INOUT이며 세 가지 유형이 아래에 소개됩니다.

매개 변수 IN 설명 :

  1. 수신 매개 변수, 유형 IN은 호출되는 프로세스에서 입력 매개 변수가 전달되어야 함을 의미합니다. 지정된 유형이 표시되지 않으면 기본 유형은 IN 유형입니다.
  2. IN 유형 매개 변수는 일반적으로 호출 과정에서 수신에만 사용되며 일반적으로 수정 및 반환으로 사용되지 않습니다.
  3. 저장 프로 시저에 대한 호출에서 값을 수정하고 반환해야하는 경우 OUT 형식 매개 변수를 사용해야합니다.

예 : 운송장 WAYBILL_NO 쿼리에 따라 운송장의 ORDER_NO를 반환합니다.

-- 根据运单WAYBILL_NO查询,返回运单的ORDER_NO
delimiter //
CREATE
    PROCEDURE query_trans_by_Id (IN wayNO int)
    BEGIN
		  DECLARE orderno VARCHAR(32) DEFAULT ' ';
          SELECT ORDER_NO INTO orderno FROM trans_order WHERE WAYBILL_NO=wayNO;
		  SELECT orderno;
    END//
delimiter;


-- 调用
CALL query_trans_by_Id(8002);

  결과:

  

매개 변수 OUT 설명 :

  1. 발신 매개 변수 : 저장 호출에서 값을 변경할 수 있으며 다음을 반환 할 수 있습니다.
  2. OUT은 나가는 매개 변수이며 들어오는 매개 변수에 사용할 수 없습니다.
  3. 저장 프로 시저를 호출 할 때 out 매개 변수도 지정해야하지만 상수가 아닌 변수 여야합니다.
  4. 동시에 전달 및 전달해야하는 경우 INOUT 매개 변수 유형을 사용할 수 있습니다.

   예 : 운송장 WAYBILL_NO 쿼리에 따라 운송장의 ORDER_NO를 반환합니다.

-- 根据运单WAYBILL_NO查询,返回运单的ORDER_NO
delimiter //
CREATE
    PROCEDURE query_trans_by_Id_out (IN wayNO int,out orderno VARCHAR(32))
    BEGIN
      SELECT ORDER_NO INTO orderno FROM trans_order WHERE WAYBILL_NO=wayNO;
    END//
delimiter;

-- 调用
SET @orderno='';
CALL query_trans_by_Id_out(8001,@orderno);
SELECT @orderno as orderno

  결과:

 

매개 변수 INOUT 설명 :

  1. 변수 변수 INOUT, 호출시 값을 전달할 수 있으며, 호출 과정에서 값을 수정할 수 있으며 값도 동시에 반환 할 수 있습니다.
  2. INOUT 매개 변수 : IN 및 OUT 매개 변수 유형의 매개 변수 모음
  3. INOUT이 호출 될 때 전달되는 값은 상수가 아닌 변수입니다.

예 : 운송장 WAYBILL_NO 쿼리에 따라 운송장의 ORDER_NO, WAYBILL_NO, SEND_PHONE 반환

--  根据运单WAYBILL_NO查询,返回运单的ORDER_NO,WAYBILL_NO,SEND_PHONE
delimiter //
CREATE
    PROCEDURE query_trans_by_Id_INOUT (INOUT wayNO int,INOUT orderno VARCHAR(32),OUT sendphone VARCHAR(32))
    BEGIN 
		SET orderno = '0000000';
		SET sendphone = '12345678';
        SELECT WAYBILL_NO,ORDER_NO,SEND_PHONE  INTO wayNO,orderno,sendphone  FROM trans_order WHERE WAYBILL_NO=wayNO;
    END//
delimiter;

-- 调用
SET @wayNO = 8002;
SET @orderno='';
SET @sendphone='';
CALL query_trans_by_Id_INOUT(@wayNO,@orderno,@sendphone);
SELECT @wayNO,@orderno as orderno,@sendphone;

 결과:

설명 : CALL query_trans_by_Id_INOUT (8001, @ orderno, @ sendphone);이 상수를 쓰면 오류가보고되며 여기에 변수가 필요합니다.

CALL query_trans_by_Id_INOUT (8001, @ orderno, @ sendphone)
> 1414- 루틴 ats에 대한 OUT 또는 INOUT 인수 1입니다
.


2.3.2 저장 프로 시저의 지역 변수

변수 선언

    DECLARE var_name[,...] type [DEFAULT value]

이 문은 지역 변수를 선언하는 데 사용됩니다. 변수의 기본값을 제공하려면 DEFAULT 절을 포함하십시오. 값은 표현식으로 지정할 수 있으며 상수 일 필요는 없습니다. DEFAULT 절이없는 경우 초기 값은 NULL입니다.

기술:

  1. 변수 선언을 위해 선언을 사용하십시오. 변수를 먼저 선언 한 다음 사용해야합니다. 위치는 BEGIN ... END 내에 있으며 BEGIN ... END는 중첩 될 수 있습니다.
  2. 변수에는 mysql의 SQL 데이터 유형과 일치하는 데이터 유형과 길이가 있으며 기본값을 설정할 수 있습니다.
  3. 변수는 set 또는 select를 통해 할당 할 수 있습니다.
  4. 변수를 반환해야합니다. 다음과 같은 select 문을 사용할 수 있습니다. select variable name.

변수 할당

  1.  변수 이름 = 값 설정
  2.  필드 1, 필드 2를 변수 1로, 변수 2를 테이블 이름에서 선택하십시오.

가변 범위

범위 설명

  1. 저장 프로세스의 변수에는 범위가 있고 범위는 BEGIN과 END 블록 사이에 있으며 END는 변수의 범위가 끝입니다.
  2. 여러 블록 사이에 값을 전달해야하는 경우 전역 변수를 사용할 수 있습니다. 즉, 모든 코드 블록 앞에 배치됩니다.
  3. 전달 매개 변수 변수는 전역 적이며 여러 블록간에 작동 할 수 있습니다.

지역 변수의 범위를 확인하십시오.

--  变量的作用域验证
delimiter //
CREATE
    PROCEDURE test ()
    BEGIN 
		BEGIN 
		    -- 返回trans_order的总记录数
			DECLARE count int DEFAULT 0;
		    SELECT COUNT(*)  INTO count FROM trans_order;
			SELECT count;
		END;
			
		BEGIN 
			-- 返回trans_order中CUSTOMER_NAME是阿朱的记录数
			DECLARE usercount int DEFAULT 0;
		    SELECT COUNT(*)  INTO usercount FROM trans_order WHERE CUSTOMER_NAME = '阿朱' ;
			SELECT usercount;
		END;
    END//
delimiter;



-- 调用
CALL test

   결과:

  

  변경하면 문제가 발생합니다. 

--  变量的作用域验证
delimiter //
CREATE
    PROCEDURE test2 ()
    BEGIN 
		BEGIN 
		    -- 返回trans_order的总记录数
			DECLARE count int DEFAULT 0;
		    SELECT COUNT(*)  INTO count FROM trans_order;
			SELECT count;
		END;
			
		BEGIN 
			-- 返回trans_order中CUSTOMER_NAME是阿朱的记录数
			DECLARE usercount int DEFAULT 0;
		    SELECT COUNT(*)  INTO usercount FROM trans_order WHERE CUSTOMER_NAME = '阿朱' ;
			SELECT usercount,count;
		END;
    END//
delimiter;



-- 调用
CALL test2()

  생성시 오류가보고되지 않고 호출시 하나의 결과 만 반환되며 두 번째 결과는 반환되지 않습니다.

 

   사전 변수 선언 :

--  变量的作用域验证
delimiter //
CREATE
    PROCEDURE test3 ()
    BEGIN 
		    -- 返回trans_order的总记录数
				DECLARE count int DEFAULT 0;
		    BEGIN 
				 SELECT COUNT(*)  INTO count FROM trans_order;
				 SELECT count;
			END;
				
			BEGIN 
				-- 返回trans_order中 
				DECLARE usercount int DEFAULT 0;
				SELECT COUNT(*)  INTO usercount FROM trans_order WHERE CUSTOMER_NAME = '阿朱' ;
				SELECT usercount,count;
			END;
    END//
delimiter;

-- 调用
CALL test3()

  결과:

     

  

설명 : 저장 프로 시저의 변수 범위, 범위는 시작 블록과 끝 블록 사이, 변수 범위의 끝은 끝입니다.

2.4 보관 중 공정 제어

2.4.1 IF 문

 IF 문 구조

IF search_condition THEN statement_list
    [ELSEIF search_condition THEN statement_list] ...
    [ELSE statement_list]
END IF

 간단한 구조 :

IF (condition) THEN 
  statement_list
ELSE
  statement_list
END IF

  다중 조건 판단 :

IF (condition) THEN 
  statement_list
ELSEIF (condition) THEN
  statement_list
ELSEIF (condition) THEN
  statement_list
ELSE
  statement_list
END IF

 예 : ID로 쿼리, ID가 짝수이면 이름이 반환되고 홀수는 전화 번호가됩니다.

-- 通过ID查询,如果id是偶数返回名字,奇数返回电话号码;
delimiter //
CREATE
    PROCEDURE test4 (IN wayNO int)
    BEGIN 
			DECLARE username VARCHAR(32) DEFAULT ' ';
			DECLARE phone VARCHAR(32) DEFAULT ' ';
			IF(wayNO%2=0) THEN
				SELECT CUSTOMER_NAME INTO username FROM trans_order WHERE WAYBILL_NO = wayNO;
				SELECT username;
			ELSE
			  SELECT SEND_PHONE INTO phone  FROM  trans_order WHERE WAYBILL_NO = wayNO;
				SELECT phone;
			END IF;
    END//
delimiter;

  실행 결과 : (데이터베이스 테이블에는 두 개의 데이터가 있습니다.)

2.4.2 WHILE 문

WHILE 문 구조

[begin_label:] WHILE search_condition DO
    statement_list
END WHILE [end_label]

 간단한 구조 :

WHILE (condition) DO
    statement_list
END WHILE

 예 : 테이블에 n 개의 데이터 추가

-- 插入n条记录
delimiter //
CREATE
    PROCEDURE test5 (num int)
    BEGIN 
		DECLARE n int DEFAULT 0;
		DECLARE wayNO int DEFAULT 0;
		WHILE (n < num) DO
		   SET wayNO = n;
	       INSERT INTO `trans_order` VALUES (wayNO, 1, '755A', '深圳龙岗坂街道', '20201216131522', '741000015819', 666, '阿聪', '888', '13828892565', '广东省|深圳市|龙岗区', '坂田街道禾坪岗', '阿聪', 9, '湖北武汉大学网点', '027C', '15889861946', '武汉大学', '湖北省|武汉市|武昌区', '阿朱', 'T66', '1.80', '现付', '0', '100.00', '10', '日用品', '零食和衣物', '0');
		   SET n = n+1; 
						
         END WHILE;
      SELECT n;
    END//
delimiter;

결과 :

 

 원래는 2 개의 데이터가 있었는데 지금은 1002 개의 데이터가 있습니다. 

2.4.3 REPEAT 문

  REPEAT 문 구조

REPEAT
    statement_list
UNTIL search_condition
END REPEAT

   루프를 종료하려면 search_condition이 true입니다.

예 : 데이터를 주기적으로 삽입하면 원래 ID가 999에 도달했습니다. 여기서는 1000에서 증가합니다.

-- 插入n条记录
delimiter //
CREATE
    PROCEDURE test6 (num int)
    BEGIN 
		  DECLARE n int DEFAULT 0;
		  DECLARE wayNO int DEFAULT 1000;
			REPEAT
	            SET wayNO = wayNO + n;
	            INSERT INTO `trans_order` VALUES (wayNO, 1, '755A', '深圳龙岗坂街道', '20201216131522', '741000015819', 666, '阿聪', '888', '13828892565', '广东省|深圳市|龙岗区', '坂田街道禾坪岗', '阿聪', 9, '湖北武汉大学网点', '027C', '15889861946', '武汉大学', '湖北省|武汉市|武昌区', '阿朱', 'T66', '1.80', '现付', '0', '100.00', '10', '日用品', '零食和衣物', '0');
				SET n = n+1;
				SET wayNO = 1000;
             UNTIL n >= num 
             END REPEAT;
		 SELECT n;
    END//
delimiter;


CALL test6(2000);

 결과:

 

1000 개에서 2999 개 사이의 ID로 2000 개의 데이터를 추가했습니다.

2.4.4 LOOP 문

루프 문 구조

label: LOOP
    statement_list
	IF exit_condition THEN
		LEAVE label; 
	END IF; 
END LOOP label;

   LEAVE 레이블은 루프를 종료하는 것을 의미합니다.

  예 : 1000 개의 데이터를 주기적으로 삽입

delimiter //
CREATE
    PROCEDURE test7 ()
    BEGIN 
		 DECLARE wayNO int DEFAULT 3000;
		 label: LOOP
	       INSERT INTO `trans_order` VALUES (wayNO, 1, '755A', '深圳龙岗坂街道', '20201216131522', '741000015819', 666, '阿聪', '888', '13828892565', '广东省|深圳市|龙岗区', '坂田街道禾坪岗', '阿聪', 9, '湖北武汉大学网点', '027C', '15889861946', '武汉大学', '湖北省|武汉市|武昌区', '阿朱', 'T66', '1.80', '现付', '0', '100.00', '10', '日用品', '零食和衣物', '0');
				 SET wayNO = wayNO + 1;
	   IF wayNO >= 3999 THEN
		     LEAVE label; 
	   END IF; 
     END LOOP label;
		 SELECT wayNO;
    END//
delimiter;

   결과:

 

  1000 개의 데이터가 추가되었습니다.

2.4.5 CASE 문

CASE 구문 구조

case ...
when ... then....
when.... then....
else ... 
end case;

다른 언어의 switch-case 문법과 유사하게 여기에 다른 사람들이 일러스트레이션으로 작성한 예제의 사본이 있습니다. 이해하기 쉬워야합니다!

 create procedure testcate(userid int)
    begin 
        declare my_status int default 0;
        select status into my_status from users where id=userid;
 
        case my_status
            when 1 then update users set score=10 where id=userid;
            when 2 then update users set score=20 where id=userid;
            when 3 then update users set score=30 where id=userid;
            else update users set score=40 where id=userid;
        end case;
    end;

2.5 저장 프로 시저의 작동

2.5.1 수정, 삭제,보기

수정 

        변경 {절차 | FUNCTION}   sp_name [ 특성 ...]

지우다 

       삭제 {절차 | 기능} [존재하는 경우] sp_name

       IF EXISTS 절은 MySQL 확장입니다. 프로그램이나 기능이 저장되어 있지 않으면 오류 발생을 방지합니다.

전망

      SHOW CREATE {PROCEDURE | FUNCTION}   sp_name 단일보기

      PROCEDURE {SHOW |} STATUS the FUNCTION [the LIKE ' pattern '] 생성자 저장 프로 시저 또는 함수, 생성 시간 및 기타 속성 참조

2.6 사용자 정의 기능

함수 구문 구조 정의

delimiter //
CREATE
    FUNCTION sp_name ([func_parameter[,...]]) RETURNS type
    [statement_list]
    BEGIN
      [statement_list]
    END
delimiter;
    

 기술:

  1. 생성 함수는 반환 값 유형을 지정해야하며 입력 매개 변수는 기본적으로 모두 IN 유형입니다.
  2. 함수 본문은 BEGIN과 END 사이에 있습니다.
  3. 지정된 함수의 반환 값을 반환합니다.
  4. 함수 호출은 select function name ()을 사용합니다.

예 : ID 별 쿼리 이름

delimiter //
CREATE
    FUNCTION getUsername (id int) RETURNS VARCHAR(32)
    READS SQL DATA
    BEGIN
      DECLARE id_username VARCHAR(32) DEFAULT ' ';
			SELECT CONCAT(CUSTOMER_NAME,'_',id)  INTO id_username FROM trans_order WHERE WAYBILL_NO = id;
			RETURN id_username;
    END//
delimiter;

 결과:

추천

출처blog.csdn.net/LoveG_G/article/details/112275886