Ing. Ricardo Mendoza Rivera
Implementando Stored Procedures (SP) Los SP permiten incrementar la performance de la BD, realzan la seguridad de la BD e incorporan técnicas de programación basadas en el Transact SQL. A continuación veremos los tipos de SP, como crearlos y ejecutarlos. · · ·
Describir el propósito y razones de usar SP. Explicar como se procesa un SP en SQL Server. Determinar cuando usar SP para completar tareas en SQL Server.
Definición
fM ac hi
ne
tri
al
ve r
si on
Es una colección de ordenes Transact-SQL que van orientados a incrementar la performance de las tareas repetitivas. Por ejemplo si desea realizar un cálculo de planillas o realizar un proceso de facturación en Batch. Es recomendable usarlos cuando desde el cliente se van a ejecutar más de una instrucción SQL. Tienen la capacidad de aceptar parámetros y de retornar valores . Por ejemplo imagine el cálculo de planillas teniendo una interfaz desde la aplicación tal como se muestra en el siguiente diagrama:
Tipos
pd
Existen · · · · ·
5 tipos System Local Temporary Remote Extended
System SP
System SP son almacenados en la Base de Datos Master y llevan típicamente el prefijo sp_, pueden invocar el llamado de datos de las tablas del sistema, ejecutar tareas administrativas y tareas de seguridad.
Ing. Ricardo Mendoza Rivera Por ejemplo, si desea conocer la información del catálogo de la tabla de cliente puede ejecutar sp_help de la siguiente manera: Sp_help cliente
Local SP
Son comúnmente los más usados y corresponden a los Stored Procedures que vamos creando en nuestros servidores locales.
Ventajas de las SP
tri
al
ve r
si on
Compartir lógica de aplicaciones: Un Stored Procedure puede ser invocado desde una plataforma Window o desde el Web.
fM ac hi
ne
Proporciona Mecanismos de Seguridad: Representan cierta ventaja en la simplificación de las tareas de seguridad, dado que sólo es necesario tener permiso de ejecución no importando que tenga acceso a las tablas involucradas dentro del Stored Procedure. Es una de las formas más recomendadas para el llamado desde aplicaciones Web.
pd
Incrementan la Performance: Dado que los procesos se realizan en el servidor los tiempos de ejecución tienden a ser mejores. Reducen el tráfico de red Dado a que la lógico de proceso se encuentra en el servidor el llamado desde la aplicación (cliente) a la Base de Datos (servidor) se limita al mandado de parámetros.
Creando Stored Procedures Sixtáxis:
Ing. Ricardo Mendoza Rivera
CREATE PROCEDURE
[ @parámetro tipo_dato [ = default ] [ OUTPUT ] ] AS Por ejemplo: vamos a suponer que queremos conocer los clientes que nos adeudan 2 documentos pendientes de pago:
fM ac hi
ne
tri
al
El llamado de la interfaz podría ser:
ve r
si on
CREATE PROCEDURE spCom_VerificaCredito @codigo CHAR(4) -- es un parámetro de entrada desde la aplicación AS --- Imagine que para los clientes tipo 'A' no se produce validación SET NOCOUNT ON IF (SELECT tipocliente FROM cliente WHERE cliente = @codigo) = 'A' SELECT 0 As DocPendientes -- Esto llegaría como RecordSet al cliente ELSE -- Se produce verificación para cliente en el estado del documento si es diferente de tipo 'A' SELECT DocPendientes = COUNT(*) -- Esto llegaría como RecorsSet al cliente FROM documento WHERE cliente = @codigo AND estado = 'P'
pd
El código muestra desde Visual Basic sería: Private Sub TxtCliente_Validate(Cancel As Boolean) Dim rs As adodb.Recordset Dim sql As String ' Llamado del Stored Procedure sql = " EXEC spCom_VerificaCredito @codigo='" & TxtCliente.Text & "'" rs.Open sql, cn, adOpenForwardOnly, adLockOptimistic ' Nótese DocPendientes viene del Stored Procedure If rs!DocPendientes > 1 Then MsgBox "Crédito No Procede!!! Nro Doc Pendientes =" & Str(rs!DocPendientes) Else MsgBox "Crédito Procede!!! Nro Doc Pendientes =" & Str(rs!DocPendientes) End If Set rs = Nothing End Sub
Ing. Ricardo Mendoza Rivera
Puede ejecutarlo directamente desde el Analizador de Consultas de esta forma:
Usando parámetros en Stored Procedures Los SP tienen la capacidad de recibir parámetros y de entregar valores.
Parámetros de Entrada
ve r
si on
Son aquellos que reciben los valores mandados desde la aplicación, pueden incluirse valores por defecto los mismos que entrarían a trabajar en el caso no hayan definido al momento de su llamado. En el caso de que hayan sido definidos como cadena, tomarán la longitud del parámetro en el SP.
tri
al
CREATE PROCEDURE spCom_VerificaCredito @codigo CHAR(4) -- es un parámetro de entrada desde la aplicación AS -- deben ser definidos con su tipo de dato respectivo
ne
Formas de ejecutar un Stored Procedure desde el Analizador de Consultas:
fM ac hi
EXEC spCom_VerificaCredito 'CLI1' ó
-- Llamado por posición
EXEC spCom_VerificaCredito @codigo= 'CLI1'
-- Llamado por nombre de parámetro, recomendada
pd
Retornando Valores usando parámetros de salida: CREATE PROCEDURE Formula @m1 smallint, @m2 smallint, @resultado smallint OUTPUT -- parámetro de salida AS SET @resultado = @m1* @m2 -- el último valor de @resultado será es el devuelto DECLARE @Valor smallint EXECUTE Formula 7,5, @Valor OUTPUT SELECT 'Resultado = ', @Valor Resultado =
35
--observe OUTPUT
Ing. Ricardo Mendoza Rivera
Manejando Cursores en un Stored Procedure Existe necesidad de hacer recorridos secuenciales a un grupo de registros, ya sea por ejemplo el realizar un cálculo de planillas, en donde trabajador por trabajador vamos calculando los importes de ingresos, descuentos y cuotas patronales; o de realizar un cálculo de intereses a un grupo de clientes 1 por uno. En este caso SQL Server nos ofrece la posibilidad de realizar estos barridos secuenciales utilizando cursores. Como se verá a continuación el trabajo con cursores no es muy complicado, pero podría restar tiempos de ejecución del servidor, ya que los cáculos se realizan con los recursos directos de la memoria del servidor, por ello se recomienda trabajar con ellos cuando es necesario. El manejo de cursores se asemeja a procesar : Un recordset en Visual Basic , preguntando por el EOF (fin de archivo), con su bucle Do While para procesarlo y con MoveNext avanzar al sgte registro. Una tabla en Visual Fox, verificando el fin de archivo, con un bucle While para procesarlo y un Skip para avanzar al sgte registro. Recorrer un Data Window, verificando con la función RowCount() y con el bucle For procesarlo directamente.
· · ·
·
si on
Pasos Declarar el cursor
tri
OPEN Nombre_Cursor
Leer el cursor. Para leer el cursor es necesaria almacenar su información en variables de memoria. La cantidad de variables está en función al número de campos definidos en el SELECT. FETCH también cumple la función de preparar el avance para el siguiente registro del cursor. Por defecto avanza al siguiente registro (NEXT)
pd
fM ac hi
·
Abrir el cursor
ne
·
al
ve r
DECLARE Nombre_Cursor CURSOR FOR orden_select -- se declara a partir de una orden SELECT
FETCH [NEXT|PRIOR|FIRST |LAST] Nombre_Cursor INTO
·
Verificar que exista información en el cursor
@@fetch_status = 0 -- cuando es cero significa que existe información por procesar en el cursor
Ing. Ricardo Mendoza Rivera ·
Procesar el cursor
WHILE @@fetch_status = 0 BEGIN --- FETCH Nombre_Cursor INTO --leer, avanzar END
·
Cerrar el cursor
CLOSE Nombre_Cursor ·
Desactivarlo de memoria
DEALLOCATE Nombre_Cursor
si on
Ejemplo:
pd
fM ac hi
ne
tri
al
ve r
Suponga que desea mostrar el detalle de movimientos de un producto sus ingresos y sus salidas, lo que sería el tener un Kardex del producto