Un poco de comprensión de los procedimientos y cursores almacenados de Mysql

Recientemente aprendí el lenguaje de base de datos sql, y aprendí sobre procedimientos almacenados y cursores, no lo escuché en clase, por lo que se puede decir que estaba confundido todo el camino. Afortunadamente, hay un experimento después de la escuela. Sin embargo, el informe de errores en cmd a menudo es extremadamente tosco. Solo le dirá qué está mal cerca (a veces todavía está mal). La tarea del maestro, siento que es necesario para escribir un registro.

Todo el fondo negro del espacio profundo de cmd, no entres para los débiles de corazón.

Primero, dar la estructura de la tabla que definí yo mismo:

 Brevemente, este es un formulario de información del empleado, donde empno es el número de empleado, ename es el nombre del empleado, job es el nombre del trabajo, heredate es el tiempo de trabajo, salario es el salario, comm es el subsidio, deptno es el número de unidad, y mgr es el número de empleado del jefe. Los datos son todos aleatorios, no te lo tomes en serio.

Según tengo entendido , los procedimientos almacenados son en realidad funciones que a menudo se dicen en lenguajes de programación. Los estudiantes que han aprendido otros lenguajes están familiarizados con las funciones, pero el nombre es muy alto. La esencia es pasar el valor y luego calcular y pasar el valor salir.

Una pregunta real se publica directamente a continuación:

Esta pregunta se basa en la entrada empno y luego escribe un procedimiento almacenado, luego calcula el ingreso anual del número en él y luego genera la respuesta. La idea es muy simple, es decir, encontrar el empleado correspondiente según el número de empleado, y luego encontrar su salario mensual y subsidio (lo tomo como un subsidio mensual), y multiplicarlo por la cantidad de un año para obtener el anual ingreso.

Entonces, la pregunta es, ¿cómo escribir este procedimiento almacenado? La palabra clave del procedimiento almacenado es precedencia, creamos un nuevo procedimiento, y luego dijimos que el procedimiento almacenado es una función, debe dárselo a la persona que necesita calcularlo, así que agregue un in antes del empno en el lista de parámetros, lo que indica que es una entrada, porque aún necesita generar el valor, no sé si hay devolución en sql, pero puedo marcar la variable en la lista de parámetros como fuera, lo que significa salida, similar a el parámetro de referencia que pasa en otros idiomas, como sigue;

create procedure cal_all_salary(in empno_in int,out all_salary double)
begin
    过程体
end

 cal_all_salary es el nombre de este proceso. Hay un in delante de empno_in, lo que significa que es una entrada. Hay un out delante de all_salary, lo que significa que es una salida. Por supuesto, este parámetro debe pasarse usted mismo, y luego el comienzo y el final son el comienzo y el final del proceso.

Cómo escribir en el proceso no es más que reasignar all_salary, debe usar el método select... into variable from..., esta variable es lo que debe asignarse.

select (comm+salary)*12 into all_salary from eemp where empno=empno_in;

Por supuesto, esto no es completo, porque también involucra los caracteres de final e inicio del proceso, la completitud es la siguiente:

drop procedure if exists cal_all_salary;
delimiter //
create procedure cal_all_salary(in empno_in int,out all_salary double)
begin
select (comm+salary)*12 into all_salary from eemp where empno=empno_in;
end;
//
delimiter ;

Debido a que está escrito en el Bloc de notas, no hay sangría y el formato es más moderno. La primera oración es principalmente para evitar la duplicación de nombres, si hay duplicación, se sobrescribirá. La cadena delimitadora indica que esta cadena se usa como terminador. Yo uso // con más frecuencia, que se configura para evitar confusiones con el ; en el cuerpo del proceso.

Luego prueba, puedes usar set @ nombre de variable para definir una variable:

set @ans=0;
cal_all_salary(1,@ans);
select @ans;

 Efecto:

Entonces, el almacenamiento en sí es para completar una tarea específica y almacenar el método para completar esta tarea, por lo que la funcionalidad es relativamente clara, lo que facilita la administración de la base de datos.

El siguiente es el cursor . En mi opinión, el cursor es un bucle, que empaqueta los calificados en un conjunto y luego los saca uno por uno para juzgarlos y calcularlos.

El formato de uso del cursor es el siguiente: (copiado de otros)

DECLARE 迭代变量名1
.
.
.
DECLARE 游标名字 CURSOR FOR 查询语句;
open 游标名
while/repeat..
fetch 游标名 into var_name...
close 游标名

Aproximadamente los pasos anteriores. En primer lugar, empaquetaré varios atributos útiles en el cursor, el formato es {[atributo 1, atributo 2...], [atributo 1, atributo 2...]...}, cada cursor apunta a una fila , con múltiples valores de atributo, y luego uso el ciclo para sacarlos uno por uno y hacer lo que quiero hacer. La búsqueda aquí es tomar el valor y luego asignarlo a la variable correspondiente. Lo que hay que tener en cuenta es abrir y cerrar.

Una última pregunta:

El código es el siguiente, debe implementarse correctamente

 

drop procedure if exists avg_from_dept;
delimiter //
create procedure avg_from_dept(in dept_code int,out ans double)
begin
declare now_salary double;
declare no_data int default 0;
declare sum double default 0;
declare dept_cursor cursor for select salary from eemp where deptno=dept_code;
declare exit handler for not found set no_data = 1; 
open dept_cursor;
repeat
fetch dept_cursor into now_salary;
set sum=sum+now_salary;
set ans=sum/(select count(*) from eemp where deptno=dept_code);
until no_data=1
end repeat;
close dept_cursor;
end;
//
delimiter ;

set @dept_in=1;
set @ans=0;
call avg_from_dept(@dept_in,@ans);
select @ans;

Está todo en el Bloc de notas, mal formateado...

Supongo que te gusta

Origin blog.csdn.net/weixin_60360239/article/details/128155051
Recomendado
Clasificación