lunes, 8 de agosto de 2011

PROCEDIMIENTO

Un procedimiento es un programa dentro de la base de datos que ejecuta una acción o conjunto de acciones especificas.
    Un procedimiento tiene un nombre, un conjunto de parámetros (opcional) y un bloque de código.
    En Transact SQL los procedimientos almacenados pueden devolver valores (numerico entero) o conjuntos de resultados.
    Para crear un procedimiento almacenado debemos emplear la sentencia CREATE PROCEDURE.



CREATE PROCEDURE <nombre_procedure> [@param1 <tipo>, ...]AS-- Sentencias del procedure


    Para modificar un procedimiento almacenado debemos emplear la sentencia ALTER PROCEDURE.



ALTER PROCEDURE <nombre_procedure> [@param1 <tipo>, ...]AS-- Sentencias del procedure 


    El siguiente ejemplo muestra un procedimiento almacenado, denominado spu_addCliente que inserta un registro en la tabla "CLIENTES".



CREATE PROCEDURE spu_addCliente @nombre varchar(100),				@apellido1 varchar(100),				@apellido2 varchar(100),				@nifCif varchar(20),				@fxNaciento 
AS
INSERT
datetime INTO CLIENTES(nombre, apellido1, apellido2, nifcif, fxnacimiento) VALUES(@nombre, @apellido1, @apellido2, @nifCif, @fxNaciento)


    Para la ejecutar un procedimiento almacenado debemos utilizar la sentencia EXEC. Cuando la ejecución del procedimiento almacenado es la primera instrucción del lote, podemos omitir el uso de EXEC.
    El siguiente ejemplo muestra la ejecución del procedimiento almacenado anterior.



DECLARE
set @fecha_nacimiento datetime @fecha_nacimiento = convert(datetime, '13/05/1975', 103)EXEC spu_addCliente 'Pedro', 'Herrarte', 'Sanchez', 
		    '00000002323', @fecha_nacimiento


    Siempre es deseable que las instrucciones del procedure esten dentro de un bloque TRY CATCH y controlados por una transacción.



ALTER PROCEDURE spu_addCliente  @nombre varchar(100),				@apellido1 varchar(100),				@apellido2 varchar(100),				@nifCif varchar(20),				@fxNaciento 
AS
BEGINdatetime TRY
END BEGIN
BEGIN TRAN INSERT INTO CLIENTES(nombre, apellido1, apellido2, nifcif, fxnacimiento) VALUES (@nombre, @apellido1, @apellido2, @nifCif, @fxNaciento) COMMIT TRY CATCH
ROLLBACKPRINT ERROR_MESSAGE()END CATCH


    Si queremos que los parámetros de un procedimiento almacenado sean de entrada-salida debemos especificarlo a través de la palabra clave OUTPUT , tanto en la definición del procedure como en la ejecución.
    El siguiente ejemplo muestra la definición de un procedure con parámetros de salida.



CREATE
@saldo  PROCEDURE spu_ObtenerSaldoCuenta @numCuenta varchar(20), decimal(10,2) output AS
BEGIN
SELECT @saldo = SALDO FROM CUENTASWHERE NUMCUENTA = @numCuentaEND


     Y para ejecutar este procedure:



DECLARE @saldo decimal(10,2)EXEC
PRINT spu_ObtenerSaldoCuenta '200700000001', @saldo output @saldo 


    Un procedimiento almacenado puede devolver valores numericos enteros a través de la instrucción RETURN. Normalmente debemos utilizar los valores de retorno para determinar si la ejecución del procedimiento ha sido correcta o no. Si queremos obtener valores se recomienda utilizar parámetros de salida o funciones escalares (se verán mas adelante en este tutorial).
    El siguiente ejemplo muestra un procedimiento almacenado que devuelve valores.



CREATE PROCEDURE spu_EstaEnNumerosRojos @numCuenta varchar(20)AS
BEGIN
IF (SELECT SALDO FROM CUENTAS WHERE NUMCUENTA = @numCuenta) < 0BEGIN RETURN 1ENDELSE RETURN 0END


    El siguiente ejemplo muestra como ejecutar el procedure y obtener el valor devuelto.



DECLARE
EXEC @rv int @rv = spu_EstaEnNumerosRojos '200700000001'PRINT @rv 


    Otra caracteristica muy interesante de los procedimientos almacenados en Transact SQL es que pueden devolver uno o varios conjuntos de resultados.
    El siguiente ejemplo muestra un procedimiento almacenado que devuelve un conjunto de resultados.



CREATE PROCEDURE spu_MovimientosCuenta @numCuenta varchar(20)AS
BEGIN
SALDO_ANTERIOR SALDO_POSTERIOR IMPORTE FXMOVIMIENTO
SELECT @numCuenta, , , , FROM MOVIMIENTOSINNER JOIN CUENTAS ON MOVIMIENTOS.IDCUENTA = CUENTAS.IDCUENTAWHERE NUMCUENTA = @numCuentaORDER BY FXMOVIMIENTO DESCEND


    La ejecución del procedimiento se realiza normalmente.



EXEC spu_MovimientosCuenta '200700000001' 


    El resultado de la ejecucion ...
NUMCUENTA     SALDO_ANTERIOR SALDO_POSTERIOR  IMPORTE FXMOVIMIENTO
------------  -------------- ---------------- ------- -----------------------
200700000001  50.99          100.99           50.00   2007-08-25 16:18:36.490
200700000001  0.99           50.99            50.00   2007-08-23 16:20:41.183
200700000001  50.99          0.99             50.00   2007-08-23 16:16:29.840
200700000001  0.99           50.99            50.00   2007-08-23 16:14:05.900

0 comentarios:

Publicar un comentario

Suscribirse a Enviar comentarios [Atom]

<< Inicio