MySQL --- Explicación detallada de los procedimientos almacenados

Introducción a los procedimientos almacenados

¿Por qué utilizar procedimientos almacenados?

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

La mayoría de las sentencias SQL son sentencias únicas contra una o más tablas. No todas las operaciones son tan sencillas. A menudo, una operación completa requiere varias declaraciones para completarse.

En pocas palabras, un procedimiento almacenado es una colección de una o más declaraciones MySQL que se guardan para su uso posterior. Piense en ello como un archivo por lotes. Aunque su función no se limita al procesamiento por lotes.

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.

Ventajas de los procedimientos almacenados

  1. Simplifique las operaciones complejas encapsulando el procesamiento en unidades fáciles de usar;
  2. Simplifica la gestión de cambios. Si cambia el nombre de la tabla, el nombre de la columna o la lógica empresarial. Solo es necesario cambiar el código del procedimiento almacenado, las personas que lo usan no cambiarán su propio código;
  3. Por lo general, los procedimientos almacenados ayudan a mejorar el rendimiento de la aplicación. Cuando se compila el procedimiento almacenado creado, se almacena en la base de datos. Sin embargo, los procedimientos almacenados implementados por MySQL son ligeramente diferentes. Los procedimientos almacenados de MySQL se compilan bajo demanda. Después de compilar el procedimiento almacenado, MySQL lo coloca en la caché. MySQL mantiene su propia caché de procedimientos almacenados para cada conexión. Si la aplicación usa el procedimiento almacenado varias veces en una sola conexión, use la versión compilada; de lo contrario, el procedimiento almacenado funciona como una consulta;
  4. Los procedimientos almacenados ayudan a reducir el tráfico entre la aplicación y el servidor de la base de datos, porque la aplicación no tiene que enviar múltiples sentencias SQL extensas, sino solo el nombre y los parámetros del procedimiento almacenado;
  5. El programa almacenado es reutilizable y transparente para cualquier aplicación. El procedimiento almacenado expone la interfaz de la base de datos a todas las aplicaciones, de modo que los desarrolladores no necesitan desarrollar las funciones admitidas en el procedimiento almacenado;
  6. El programa almacenado es seguro. Los administradores de la base de datos pueden otorgar los permisos adecuados a las aplicaciones que acceden a los procedimientos almacenados en la base de datos sin proporcionar ningún permiso a las tablas de la base de datos subyacente.

Desventajas de los procedimientos almacenados

  1. Si se usa una gran cantidad de procedimientos almacenados, el uso de memoria de cada conexión que usa estos procedimientos almacenados aumentará considerablemente. Además, si sobreutiliza una gran cantidad de operaciones lógicas en el proceso de almacenamiento, el uso de la CPU también aumentará, porque el diseño inicial de la base de datos MySQL se centra en consultas eficientes, lo que no favorece las operaciones lógicas;
  2. La estructura de los procedimientos almacenados dificulta el desarrollo de procedimientos almacenados con lógica empresarial compleja;
  3. Es difícil depurar procedimientos almacenados. Solo unos pocos sistemas de administración de bases de datos le permiten depurar procedimientos almacenados. Desafortunadamente, MySQL no proporciona la capacidad de depurar procedimientos almacenados;
  4. No es fácil desarrollar y mantener procedimientos almacenados. El desarrollo y mantenimiento de procedimientos almacenados generalmente requiere una habilidad profesional que no todos los desarrolladores de aplicaciones tienen. Esto puede causar problemas en la fase de desarrollo y mantenimiento de la aplicación.

Procedimientos almacenados en MySQL

Crear y llamar procedimientos

Cree un procedimiento almacenado, el código es el siguiente:

-- 创建存储过程 
create procedure mypro(in a int,in b int,out sum int) 
begin 
set sum = a+b; 
end;

Los resultados son los siguientes

imagen-20210316103451673

También puede ver el proceso en el nodo "Función" del cliente Navicat, como se muestra en la siguiente figura:

imagen-20210316103523273

Llame al procedimiento almacenado, el código es el siguiente:

call mypro(1,2,@s);-- 调用存储过程 
select @s;-- 显示过程输出结果

resultado de la operación

imagen-20210316103610471

Análisis de sintaxis de procedimientos almacenados

  • create procedure Utilizado para crear el proceso;
  • mypro Se utiliza para definir el nombre del proceso;
  • (in a int,in b int,out sum int)El parámetro representa el proceso en el que indenota un parámetro de entrada, outindica un parámetro de salida. Similar a los parámetros formales y el valor de retorno cuando Java define un método;
  • beginY endrepresenta el comienzo y el final del cuerpo principal del proceso, que es equivalente a un par de llaves en un método de definición de Java;
  • callSe utiliza para llamar al proceso, @ses la variable utilizada para recibir los parámetros de salida del proceso.

Parámetros del procedimiento almacenado

Los parámetros del procedimiento almacenado de MySQL se utilizan en la definición del procedimiento almacenado. Hay tres tipos de parámetros:

  • IN Parámetro de entrada: indica que la persona que llama pasa un valor al procedimiento (el valor de entrada puede ser un literal o una variable);
  • OUT Parámetro de salida: indica que el proceso envía un valor a la persona que llama (se pueden devolver varios valores) (el valor de salida solo puede ser una variable);
  • INOUTParámetros de entrada y salida: no solo significa que la persona que llama pasa un valor al proceso, sino que también significa que el proceso pasa un valor a la persona que llama (los valores solo pueden ser variables).

Los procedimientos almacenados se pueden dividir en cuatro categorías según los parámetros:

1) Proceso sin parámetros;

2). Solo el proceso de ingreso de parámetros;

3). Solo el proceso de los parámetros de salida;

4) Proceso que incluye parámetros de entrada y salida.

variable

El procedimiento almacenado en MySQL es similar al método en java.

En este caso, las variables también se pueden utilizar en procedimientos almacenados. El alcance de la variable local en java es el método donde se encuentra la variable, y el alcance de la variable local en MySQL es el procedimiento almacenado donde se encuentra.

Definiciones de variables

DECLARE variable_name [,variable_name...] datatype [DEFAULT value];
  • declareSe usa para declarar variables;

  • variable_nameRepresenta el nombre de la variable;

  • datatypeEs el tipo de datos de MySQL;

  • defaultSe utiliza para declarar valores predeterminados;

  • P.ej:

    declare name varchar(20) default ‘jack’。
    

Asignación variable

SET 变量名 = 表达式值 [,variable_name = expression ...]

Use variables en el procedimiento almacenado, el código es el siguiente

use schooldb;-- 使用 schooldb 数据库
-- 创建过程
create procedure mypro1()
begin
declare name varchar(20);
set name = '丘处机';
select * from studentinfo where studentname = name;
end;
-- 调用过程
call mypro1();

resultado de la operación

imagen-20210316104419334

Declaración de control de flujo

if declaración condicional

IFEl enunciado contiene múltiples juicios condicionales, según el resultado TRUE, se FALSEejecuta el enunciado if, else ifque es elsesimilar a la sintaxis de ,, y en los lenguajes de programación .

Defina un procedimiento almacenado, ingrese un número entero y use la instrucción if para determinar si es positivo o negativo. El código es el siguiente:

-- 创建过程
create procedure mypro2(in num int)
begin
if num<0 then -- 条件开始
select '负数';
elseif num=0 then
select '不是正数也不是负数';
else
select '正数';
end if;-- 条件结束
end;
-- 调用过程
call mypro2(-1);

resultado de la operación

imagen-20210316104810016

declaración condicional de caso

caseEs otra sentencia condicional, similar al lenguaje de programación choose, whensintaxis. En MySQL, la casedeclaración tiene dos
formatos de sintaxis .

Defina un procedimiento almacenado, ingrese un número entero y use la instrucción case para determinar si es positivo o negativo. El código es el siguiente:

-- 创建过程
create procedure mypro3(in num int)
begin
case -- 条件开始
when num<0 then select '负数';
when num=0 then select '不是正数也不是负数';
else select '正数';
end case; -- 条件结束
end;
-- 调用过程
call mypro3(1);

resultado de la operación

imagen-20210316104934579

Defina un procedimiento almacenado, ingrese un número entero y use la instrucción case para determinar si es 1 o 2. El código es el siguiente:

-- 创建过程
create procedure mypro4(in num int)
begin
case num -- 条件开始
when 1 then select '数值是 1';
when 2 then select '数值是 2';
else select '不是 1 也不是 2';
end case; -- 条件结束
end;
-- 调用过程
call mypro4(3);

resultado de la operación

imagen-20210316105009743

Ambas gramáticas de casos pueden lograr un juicio condicional, pero la primera es adecuada para el juicio de valor de rango y la segunda es adecuada para el juicio de valor definido.

while declaración de bucle

whileDeclaración de uso y javaen whileun ciclo similar.

Defina un procedimiento almacenado y use un ciclo while para generar la suma acumulativa de 1 a 10. El código es el siguiente:

-- 创建过程
create procedure mypro5(out sum int)
begin
declare num int default 0;
set sum = 0;
while num<10 do -- 循环开始
set num = num+1;
set sum = sum+num;
end while; -- 循环结束
end;
-- 调用过程
call mypro5(@sum);
-- 查询变量值
select @sum;

resultado de la operación

imagen-20210316105127457

repetir declaración de bucle

repeatUso y declaraciones javaen la do…whiledeclaración, las operaciones son el primer ciclo de ejecución, luego la condición de determinación, la diferencia entre repeatla expresión de
la fórmula falsesolo se ejecuta en bucles hasta que truese detiene el valor de la expresión .

Defina un procedimiento almacenado y use un ciclo de repetición para generar la suma acumulativa de 1 a 10. El código es el siguiente:

-- 创建过程
create procedure mypro6(out sum int)
begin
declare num int default 0;
set sum = 0;
repeat-- 循环开始
set num = num+1;
set sum = sum+num;
until num>=10
end repeat; -- 循环结束
end;
-- 调用过程
call mypro6(@sum);
-- 查询变量值
select @sum;

resultado de la operación

imagen-20210316105241308

declaración de bucle

Las sentencias de bucle se utilizan para ejecutar determinadas sentencias de forma repetida.

Se puede usar durante la ejecución de la leavedeclaración o iteratefuera del ciclo se puede anidar IFcomo una declaración de juicio.

  • leaveEl efecto de la declaración es equivalente al de Java, breakque se usa para terminar el ciclo;
  • iterateEl efecto de la declaración es equivalente al de Java, continueque se utiliza para finalizar esta operación de bucle y entrar en el siguiente bucle.

Defina un procedimiento almacenado y use el bucle para generar la suma acumulada de 1 a 10. El código es el siguiente:

-- 创建过程
create procedure mypro7(out sum int)
begin
declare num int default 0;
set sum = 0;
loop_sum:loop-- 循环开始
set num = num+1;
set sum = sum+num;
if num>=10 then
leave loop_sum;
end if;
end loop loop_sum; -- 循环结束
end;
-- 调用过程
call mypro7(@sum);
-- 查询变量值
select @sum;

resultado de la operación

imagen-20210316105416021

Loop_sum en el código es equivalente a etiquetar el bucle para facilitar la operación flexible durante múltiples bucles.

Gestión de procedimientos almacenados

La gestión del proceso de almacenamiento incluye principalmente: visualizar el proceso, visualizar el código fuente del proceso y eliminar el proceso.

La forma más sencilla es utilizar la herramienta cliente Navicat para la administración, simplemente haga clic con el mouse, como se muestra en la siguiente figura:

imagen-20210316105545505

Mostrar procedimiento almacenado

SHOW PROCEDURE STATUS;

Mostrar los procedimientos almacenados de una base de datos específica

SHOW PROCEDURE status where db = 'schooldb';

Para mostrar los procedimientos almacenados en un modo específico, es necesario mostrar los procedimientos almacenados con "mi" en el nombre

SHOW PROCEDURE status where name like '%my%';

Muestra el código fuente del procedimiento almacenado "mypro1"

SHOW CREATE PROCEDURE mypro1;

imagen-20210316105740141

Eliminar el procedimiento almacenado "mypro1"

drop PROCEDURE mypro1;

Supongo que te gusta

Origin blog.csdn.net/whf_a/article/details/114871866
Recomendado
Clasificación