Directorio de artículos
-
- Introducción a los procedimientos almacenados
- Procedimientos almacenados en MySQL
- variable
- Gestión de procedimientos almacenados
-
- Mostrar procedimiento almacenado
- Mostrar los procedimientos almacenados de una base de datos específica
- Para mostrar los procedimientos almacenados en un modo específico, es necesario mostrar los procedimientos almacenados con "mi" en el nombre
- Muestra el código fuente del procedimiento almacenado "mypro1"
- Eliminar el procedimiento almacenado "mypro1"
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
- Simplifique las operaciones complejas encapsulando el procesamiento en unidades fáciles de usar;
- 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;
- 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;
- 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;
- 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;
- 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
- 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;
- La estructura de los procedimientos almacenados dificulta el desarrollo de procedimientos almacenados con lógica empresarial compleja;
- 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;
- 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
También puede ver el proceso en el nodo "Función" del cliente Navicat, como se muestra en la siguiente figura:
Llame al procedimiento almacenado, el código es el siguiente:
call mypro(1,2,@s);-- 调用存储过程
select @s;-- 显示过程输出结果
resultado de la operación
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 quein
denota un parámetro de entrada,out
indica un parámetro de salida. Similar a los parámetros formales y el valor de retorno cuando Java define un método;begin
Yend
representa 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;call
Se utiliza para llamar al proceso,@s
es 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);INOUT
Pará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];
-
declare
Se usa para declarar variables; -
variable_name
Representa el nombre de la variable; -
datatype
Es el tipo de datos de MySQL; -
default
Se 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
Declaración de control de flujo
if declaración condicional
IF
El enunciado contiene múltiples juicios condicionales, según el resultado TRUE
, se FALSE
ejecuta el enunciado if
, else if
que es else
similar 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
declaración condicional de caso
case
Es otra sentencia condicional, similar al lenguaje de programación choose
, when
sintaxis. En MySQL, la case
declaració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
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
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
while
Declaración de uso y java
en while
un 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
repetir declaración de bucle
repeat
Uso y declaraciones java
en la do…while
declaración, las operaciones son el primer ciclo de ejecución, luego la condición de determinación, la diferencia entre repeat
la expresión de
la fórmula false
solo se ejecuta en bucles hasta que true
se 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
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 leave
declaración o iterate
fuera del ciclo se puede anidar IF
como una declaración de juicio.
leave
El efecto de la declaración es equivalente al de Java,break
que se usa para terminar el ciclo;iterate
El efecto de la declaración es equivalente al de Java,continue
que 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
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:
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;
Eliminar el procedimiento almacenado "mypro1"
drop PROCEDURE mypro1;