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 설명 :
- 수신 매개 변수, 유형 IN은 호출되는 프로세스에서 입력 매개 변수가 전달되어야 함을 의미합니다. 지정된 유형이 표시되지 않으면 기본 유형은 IN 유형입니다.
- IN 유형 매개 변수는 일반적으로 호출 과정에서 수신에만 사용되며 일반적으로 수정 및 반환으로 사용되지 않습니다.
- 저장 프로 시저에 대한 호출에서 값을 수정하고 반환해야하는 경우 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 설명 :
- 발신 매개 변수 : 저장 호출에서 값을 변경할 수 있으며 다음을 반환 할 수 있습니다.
- OUT은 나가는 매개 변수이며 들어오는 매개 변수에 사용할 수 없습니다.
- 저장 프로 시저를 호출 할 때 out 매개 변수도 지정해야하지만 상수가 아닌 변수 여야합니다.
- 동시에 전달 및 전달해야하는 경우 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 설명 :
- 변수 변수 INOUT, 호출시 값을 전달할 수 있으며, 호출 과정에서 값을 수정할 수 있으며 값도 동시에 반환 할 수 있습니다.
- INOUT 매개 변수 : IN 및 OUT 매개 변수 유형의 매개 변수 모음
- 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입니다.
기술:
- 변수 선언을 위해 선언을 사용하십시오. 변수를 먼저 선언 한 다음 사용해야합니다. 위치는 BEGIN ... END 내에 있으며 BEGIN ... END는 중첩 될 수 있습니다.
- 변수에는 mysql의 SQL 데이터 유형과 일치하는 데이터 유형과 길이가 있으며 기본값을 설정할 수 있습니다.
- 변수는 set 또는 select를 통해 할당 할 수 있습니다.
- 변수를 반환해야합니다. 다음과 같은 select 문을 사용할 수 있습니다. select variable name.
변수 할당
- 변수 이름 = 값 설정
- 필드 1, 필드 2를 변수 1로, 변수 2를 테이블 이름에서 선택하십시오.
가변 범위
범위 설명
- 저장 프로세스의 변수에는 범위가 있고 범위는 BEGIN과 END 블록 사이에 있으며 END는 변수의 범위가 끝입니다.
- 여러 블록 사이에 값을 전달해야하는 경우 전역 변수를 사용할 수 있습니다. 즉, 모든 코드 블록 앞에 배치됩니다.
- 전달 매개 변수 변수는 전역 적이며 여러 블록간에 작동 할 수 있습니다.
지역 변수의 범위를 확인하십시오.
-- 变量的作用域验证
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;
기술:
- 생성 함수는 반환 값 유형을 지정해야하며 입력 매개 변수는 기본적으로 모두 IN 유형입니다.
- 함수 본문은 BEGIN과 END 사이에 있습니다.
- 지정된 함수의 반환 값을 반환합니다.
- 함수 호출은 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;
결과: