Notas de estudio de base de datos Mysql_ (dos)

Capítulo 2 Procedimiento almacenado de Mysql

Descripción:

    El nombre de usuario de la base de datos es root, la contraseña es rootpwd y la conexión es la base de datos local de Windows MySQL

    Versión de la base de datos, SELECCIONAR VERSIÓN (), 8.0.15

    Motor de base de datos: MOSTRAR MOTORES

   

   Como se puede ver en la figura anterior, solo InnoDB admite transacciones

   El motor de base de datos predeterminado: MOSTRAR VARIABLES COMO'default_storage_engine '

 

Como puede verse en la figura anterior, InnoDB es el motor de datos predeterminado.

La estructura de la tabla de datos preparada: 

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;

Documentos de referencia: 

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

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

2.1 ¿Qué es un procedimiento almacenado?

2.1.1 Concepto

 La versión MySQL 5.0 comenzó a admitir procedimientos almacenados.

El procedimiento almacenado (procedimiento almacenado) es un tipo de objeto de base de datos que almacena procedimientos complejos en la base de datos para que los procedimientos externos puedan llamar. Un procedimiento almacenado es un conjunto de sentencias SQL para completar una función específica. Se compila y guarda en la base de datos. El usuario puede llamarlo y ejecutarlo especificando el nombre del procedimiento almacenado y los parámetros dados (cuando sea necesario).

El procedimiento almacenado es muy simple en pensamiento, es decir, encapsulación y reutilización de código en el nivel del lenguaje SQL de la base de datos.

2.1.2 Ventajas

  • Los procedimientos almacenados se pueden encapsular y ocultar una lógica empresarial compleja.
  • El procedimiento almacenado puede devolver valores y aceptar parámetros.
  • El procedimiento almacenado no se puede ejecutar usando la instrucción SELECT porque es una subrutina, que es diferente de una tabla de vista, tabla de datos o función definida por el usuario.
  • Los procedimientos almacenados se pueden utilizar para la inspección de datos, forzar la lógica empresarial, etc.
  • La velocidad de ejecución del procedimiento almacenado es relativamente rápida y se ha compilado previamente.

2.1.3 Desventajas

  • Los procedimientos almacenados a menudo se personalizan en una base de datos específica, porque los lenguajes de programación admitidos son diferentes. Al cambiar a un sistema de base de datos de otro fabricante, es necesario reescribir el procedimiento almacenado original.
  • El ajuste del rendimiento y la escritura de procedimientos almacenados están limitados por varios sistemas de bases de datos.

2.2 Un ejemplo simple de un procedimiento almacenado

2.2.1 Crear un procedimiento almacenado y una declaración de función almacenada

Instrucciones oficiales: 

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

De forma predeterminada, el programa está asociado con la base de datos actual. Para asociar explícitamente una subrutina con una base de datos determinada, puede especificar su nombre como db_name.sp_name al crear la subrutina

Si el nombre de la subrutina es el mismo que el nombre de la función SQL incorporada, al definir la subrutina, debe insertar un espacio entre el nombre y los corchetes subsiguientes, de lo contrario se producirá un error de sintaxis. Insértelo cuando llame posteriormente a la subrutina. Por esta razón, incluso si esta situación es posible, recomendamos que sea mejor evitar darle a su propia subrutina almacenada el mismo nombre que la función SQL existente.

DEFINER : CREATE PROCEDURE y CREATE FUNCTION requieren privilegios CREATE ROUTINE. Si hay una cláusula DEFINER, los privilegios necesarios dependen del valor del usuario,

La lista de parámetros entre paréntesis debe existir siempre. Si no hay parámetros, se debe usar una lista de parámetros vacía de (). Los nombres de los parámetros no distinguen entre mayúsculas y minúsculas.

Cada parámetro es un parámetro IN por defecto. Para especificar otros parámetros, puede utilizar la palabra clave OUT o INOUT antes del nombre del parámetro

Nota : Especificar el parámetro como IN, OUT o INOUT solo es legal para PROCEDURE. (Los parámetros FUNCTION siempre se consideran parámetros IN)

La cláusula RETURNS solo puede especificar FUNCTION, que es obligatoria para las funciones. Se utiliza para especificar el tipo de retorno de la función y el cuerpo de la función debe contener una declaración de valor RETURN.

rutina_cuerpo: declaración compuesta

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

Traducido a una plantilla gramatical que se puede utilizar:

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. Cree un procedimiento almacenado de parámetros vacío

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

   Llamar al procedimiento almacenado 

CALL query_trans_all;

  

   De hecho, el resultado es el mismo que ejecutar la instrucción de consulta: SELECT * FROM trans_order; Sin embargo, la instrucción de consulta puede ser más corta que el procedimiento almacenado cuando se lee el tiempo de consulta;

  La lógica compleja se puede construir mediante múltiples declaraciones 

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

2.3 Variables en el procedimiento almacenado

2.3.1 El procedimiento almacenado ingresa la variable de parámetro

Los tipos de parámetros del procedimiento almacenado son: IN, OUT, INOUT, los tres tipos se presentan a continuación:

Descripción del parámetro IN:

  1. Parámetros entrantes, el tipo IN significa que el parámetro de entrada debe pasarse en el proceso de ser llamado, si el tipo especificado no se muestra, el tipo predeterminado es el tipo IN
  2. Los parámetros de tipo IN generalmente solo se usan para entrantes, en el proceso de llamada, generalmente no como modificación y retorno
  3. Si necesita modificar y devolver el valor en la llamada al procedimiento almacenado, debe usar los parámetros de tipo OUT

Ejemplo: De acuerdo con la consulta de la hoja de ruta WAYBILL_NO, devuelva el ORDER_NO de la hoja de ruta.

-- 根据运单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);

  resultado:

  

Descripción del parámetro OUT:

  1. Parámetros salientes: en la llamada a almacenar, puede cambiar su valor y puede regresar
  2. OUT es un parámetro saliente y no se puede utilizar para parámetros entrantes
  3. Cuando se llama a un procedimiento almacenado, también se debe especificar el parámetro out, pero debe ser una variable, no una constante;
  4. Si necesita pasar dentro y fuera al mismo tiempo, puede usar el tipo de parámetro INOUT

   Ejemplo: De acuerdo con la consulta de la hoja de ruta WAYBILL_NO, devuelva el ORDER_NO de la hoja de ruta.

-- 根据运单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

  resultado:

 

Descripción del parámetro INOUT:

  1. Variable variable INOUT, el valor se puede pasar al llamar, en el proceso de llamar, su valor se puede modificar y el valor también se puede devolver al mismo tiempo
  2. Parámetro INOUT: una colección de parámetros de tipos de parámetros IN y OUT
  3. El valor que se pasa cuando se llama a INOUT es una variable en lugar de una constante

Ejemplo: de acuerdo con la consulta WAYBILL_NO de la hoja de ruta, devuelva el ORDER_NO, WAYBILL_NO, SEND_PHONE de la hoja de ruta.

--  根据运单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;

 resultado:

Descripción: CALL query_trans_by_Id_INOUT (8001, @ orderno, @ sendphone); La escritura de esta constante reportará un error, y aquí se debe requerir una variable;

CALL query_trans_by_Id_INOUT (8001, @ orderno, @ sendphone)
> 1414 - El argumento 1 de OUT o INOUT para la rutina ats.query_trans_by_Id_INOUT no es una variable o una pseudovariable NUEVA en ANTES del disparador
> 时间: 0.001s


2.3.2 Variables locales de procedimientos almacenados

Declaración de variable

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

Esta declaración se utiliza para declarar variables locales. Para proporcionar un valor predeterminado para la variable, incluya una cláusula DEFAULT. El valor se puede especificar como una expresión y no es necesario que sea una constante. Si no hay una cláusula DEFAULT, el valor inicial es NULL.

Descripción:

  1. Use declare para la declaración de variables. Las variables deben declararse primero y luego usarse. La posición está dentro de BEGIN ... END, y BEGIN ... END se puede anidar;
  2. Las variables tienen tipo y longitud de datos, que son consistentes con el tipo de datos SQL de mysql y pueden establecer valores predeterminados
  3. Las variables se pueden asignar a través de establecer o seleccionar en;
  4. Las variables deben devolverse, puede usar la instrucción de selección, como: seleccionar nombre de variable.

Asignación variable

  1.  establecer nombre de variable = valor
  2.  seleccione el campo 1, el campo 2 en la variable 1, la variable 2 del nombre de la tabla donde condición ...

Alcance variable

Descripción del alcance

  1. Las variables en el proceso de almacenamiento tienen un alcance, el alcance está entre los bloques BEGIN y END, END termina el alcance de la variable es el final
  2. Necesita pasar valores entre múltiples bloques, puede usar variables globales, es decir, colocadas antes de todos los bloques de código
  3. Las variables de parámetro de paso son globales y pueden funcionar entre varios bloques

Verifique el alcance de las variables locales:

--  变量的作用域验证
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

   resultado:

  

  Si lo cambia, habrá problemas: 

--  变量的作用域验证
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()

  No se informará ningún error al crear, solo se devuelve un resultado al llamar y no se devuelve el segundo resultado;

 

   Declaración de variable avanzada:

--  变量的作用域验证
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()

  resultado:

     

  

Descripción: el alcance de la variable en el procedimiento almacenado, el alcance está entre los bloques de inicio y fin, el final del alcance de la variable es el final

2.4 Control de proceso durante el almacenamiento

2.4.1 Declaración IF

 Estructura de la declaración IF

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

 Estructura simple:

IF (condition) THEN 
  statement_list
ELSE
  statement_list
END IF

  Juicio de múltiples condiciones:

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

 Ejemplo: Consulta por ID, si el ID es un número par, se devolverá el nombre y el número impar será el número de teléfono;

-- 通过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;

  Resultado de la ejecución: (hay dos datos en la tabla de la base de datos)

2.4.2 declaración WHILE

Estructura de la declaración WHILE

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

 Estructura simple:

WHILE (condition) DO
    statement_list
END WHILE

 Ejemplo: agregue n datos a la tabla

-- 插入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;

Resultados de la:

 

 Originalmente había 2 piezas de datos, ahora hay 1002 piezas 

2.4.3 declaración REPEAT

  Estructura de la instrucción REPEAT

REPEAT
    statement_list
UNTIL search_condition
END REPEAT

   condición_de_búsqueda es verdadera para salir del bucle

Ejemplo: Insertar datos cíclicamente, la identificación original ha llegado a 999, aquí aumenta de 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);

 resultado:

 

Se agregaron 2000 piezas de datos, identificación de 1000 a 2999

2.4.4 Declaración LOOP

Estructura de declaración de bucle

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

   LEAVE etiqueta significa salir del bucle

  Ejemplo: inserte 1000 datos de forma cíclica

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;

   resultado:

 

  Se han agregado 1000 datos;

2.4.5 Declaración CASE

Estructura de sintaxis CASE

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

De manera similar a la gramática de mayúsculas y minúsculas de otros idiomas, aquí hay una copia de un ejemplo escrito por otros como ilustración, ¡debería ser fácil de entender!

 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 Operación del procedimiento almacenado

2.5.1 Modificar, eliminar, ver

modificar 

        ALTERAR {PROCEDIMIENTO | FUNCTION}   sp_name [ característica ...]

Eliminar 

       DROP {PROCEDURE | FUNCIÓN} [SI EXISTE] sp_name

       La cláusula IF EXISTS es una extensión de MySQL. Si el programa o la función no se almacena, evita que se produzcan errores.

Vista

      MOSTRAR CREAR {PROCEDIMIENTO | FUNCIÓN}   sp_name Ver un solo

      PROCEDIMIENTO {MOSTRAR |} el ESTADO la FUNCIÓN [el ' patrón ' LIKE ] Ver el procedimiento o función almacenada del creador, el tiempo de creación y otros atributos

2.6 Funciones personalizadas

Definir la estructura de la sintaxis de la función

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

 Descripción:

  1. La función de creación debe especificar el tipo de valor de retorno, y los parámetros de entrada son todos tipos IN por defecto
  2. El cuerpo de la función se coloca entre BEGIN y END
  3. devuelve el valor de retorno de la función especificada
  4. La llamada a la función usa el nombre de la función de selección ()

Ejemplo: nombre de la consulta por 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;

 resultado:

Supongo que te gusta

Origin blog.csdn.net/LoveG_G/article/details/112275886
Recomendado
Clasificación