Un procedimiento almacenado (STORE PROCEDURE) está conformado por un conjunto de instrucciones Transact-SQL que definen un determinado proceso, este puede aceptar parámetros de entrada y devolver un valor o conjunto de resultados. Este procedimiento se guarda en el servidor y puede ser ejecutado en cualquier momento.

La diferencia entre los procedimientos almacenados y las instrucciones SQL o lotes de estas reside en que los procedimientos están precompilados. De esta manera la mayor parte del trabajo de procesamiento de consultas ya está hecho y almacenado en una tabla del sistema por lo que el uso de procedimientos almacenados mejora notablemente la potencia y eficacia del SQL.

Hay algunos procedimientos incorporados del sistema en la base de datos master, todos tienen antes de su nombre las letras “sp_” y por lo regular se intenta que los procedimientos creados por usuarios sigan una regla similar para nombrarlos pero no exactamente igual para no confundirlos.

Los procedimientos almacenados se crean mediante la sentencia CREATE PROCEDURE y se ejecutan con EXEC (o EXECUTE). Para ejecutarlo también se puede utilizar el nombre del procedimiento almacenado sólo, siempre que sea la primera palabra del lote.


Crear y ejecutar un procedimiento

Para crear un procedimiento almacenado como hemos dicho se emplea la instrucción CREATE PROCEDURE:

CREATE PROCEDURE:

CREATE {PROC|PROCEDURE} 
[NombreEsquema.]NombreProcedimiento          
[{@parametro tipo} [VARYING] [= valorPredet]  [OUT|OUTPUT] ] [,...n]     AS
{  
   <bloque_instrucciones> [ ...n]
}[;]     

<bloque_instrucciones> ::=   
{
   [BEGIN] instrucciones [END]
}

Las instrucciones CREATE PROCEDURE no se pueden combinar con otras instrucciones SQL en el mismo lote.

Luego del verbo se debe poner el nombre del procedimiento que no debe superar los 128 caracteres.

Además, se pueden declarar uno o más parámetros indicando para cada uno su nombre (debe de empezar  por arroba) y su tipo de datos, y opcionalmente un valor por defecto (=valorPredet) este valor será el asumido si en la llamada el usuario no pasa ningún valor para el parámetro. Un procedimiento almacenado puede tener un máximo de 2.100 parámetros.

Ahora bien, un ejemplo rápido de lo que hemos visto:

CREATE PROCEDURE  spHola_Mundo 
AS
PRINT ‘Hola Mundo’;     
GO

-Se indica “GO” para cerrar el lote que crea el procedimiento y empezar  otro lote.

EXEC spHola_Mundo;

-De esta forma llamamos al procedimiento y se ejecuta.

Este procedimiento lo que hace simplemente es imprimir en consola “Hola Mundo” cuando es llamado.

Ahora probemos con un parámetro de entrada (la frase que queremos que escriba).

CREATE PROCEDURE spDice_Frase  @frase CHAR(30)    
AS      
PRINT @frase;  
GO     
EXEC spDice_Frase ‘Mulieres es genial’;


Parámetros de salida

Un procedimiento puede hacer uso no solo de parámetros de entrada sino que también puede devolver datos y para ello se debe indicar al parámetro con la palabra OUTPUT o bien usando la instrucción RETURN.

Para ello hagamos un ejemplo:

CREATE PROC spUltimo_cumple @ofi  INT, @fecha DATETIME OUTPUT    
AS      
SELECT @fecha=(SELECT MAX(fechaNacimiento)  FROM empleados WHERE oficina=@ofi)

En el parámetro de fecha OUTPUT recopilamos entonces el último cumpleaños de los empleados registrados en la oficina que indiquemos en el parámetro de entrada.

En la llamada, para los parámetros de salida, en lugar de indicar un valor de entrada se indica un nombre de variable, misma que recogerá el valor devuelto por el procedimiento sin olvidar la palabra OUTPUT:

DECLARE @cumple AS DATETIME;   
EXEC spUltimo_cumple 12,@cumple  OUTPUT;   
PRINT @cumple;

Además existe la instrucción RETURN que ordena salir de un procedimiento en cualquier punto en que esta instrucción se encuentre. Así bien, se utiliza para devolver valores al final o quizás en alguna consulta intermedia de algún procedimiento.

Pero algo importante a resaltar es que RETURN no puede regresar un valor NULL ya que de intentarlo saltará un mensaje de error y advertencia.

Supongamos que queremos saber el número de clientes en cierto municipio, con este procedimiento con RETURN se puede hacer de la siguiente manera:

CREATE PROC spClientesTotales @municipio INT   
AS    
RETURN (SELECT COUNT(*) FROM  clientes WHERE municipio=@municipio)   
GO

O bien asignar el resultado de la consulta a una variable y devolver la variable.


Insertar datos con INSERT EXEC

Con esta instrucción se pueden insertar los datos resultantes de un procedimiento en una tabla destino que se especifique.

Primeramente creamos nuestro procedimiento que en este caso recopila todas las ventas (pedidos) hechas a un país que es un parámetro de entrada:

CREATE PROCEDURE spVentasPorPais @paisOrden AS VARCHAR(15)
AS
SELECT id, empid, fechaOrden, pais, art FROM Ordenes WHERE pais = @paisOrden;

Necesitamos entonces ejecutar el siguiente código para que el conjunto de resultados de la consulta sea insertado en la tabla MisOrdenes.

SET IDENTITY_INSERT MisOrdenes ON;


INSERT INTO MisOrdenes(id,empid,fechaOrden,pais,art)
EXEC spVentasPorPais @pais = ‘España’;


SET IDENTITY_INSERT MisOrdenes OFF;

Esto puede resultar útil en ciertas ocasiones, no siempre es lo más utilizado pero es mejor saber todas nuestras opciones y que cada uno decida el mejor camino a seguir.


Eliminar y alterar un procedimiento

Por último, a veces puede suceder que necesitemos alterar o incluso eliminar un procedimiento que con anterioridad hemos creado y eso es de lo más normal.

Para eliminar un procedimiento se debe usar la siguiente sentencia:

DROP PROCEDURE spVentasPorPais;

Mientras que para alterarlo podemos usar lo siguiente:

ALTER PROCEDURE spVentasPorPais

Y posteriormente escribir el procedimiento como si lo estuviésemos creando, es decir que al ejecutar dicha instrucción se “borrará” el anterior procedimiento y se reemplazará con el nuevo que hemos escrito.

No cabe duda que en el mundo de SQL los procedimientos almacenados son muy populares y utilizados, por lo que entender las bases es esencial.

Por la lección de hoy ha sido todo, pero si tienen alguna duda respecto al tema o sugerencias de conceptos y ejemplos de SQL que podemos abordar son bienvenidas en la sección de comentarios.

¡Nos leemos hasta la otra!

Referencias

https://www.w3schools.com/SQl

Documentación sobre SQL de Microsoft: https://docs.microsoft.com/en-us/sql

Imagen modificada: https://www.entechnie.com/wp-content/uploads/2017/05/SQL_Server.jpg

sorayagami02
Soy una chica gamer que últimamente pasa demasiado tiempo dejando los juegos a medias... !eso no es bueno, eh! Leo fanfics a todas horas del día y tengo fandoms a morir así que, sí, soy toda una fangirl.

Deja un comentario

A %d blogueros les gusta esto: