Unidad 9. Programación en TRANSACT SQL (VI)


9.8. WAITFOR

Bloquea la ejecución de un lote, un procedimiento almacenado o una transacción hasta alcanzar la hora o el intervalo de tiempo especificado, o hasta que una instrucción especificada modifique o devuelva al menos una fila. Nosotros estudiaremos los dos primeros casos.


    WAITFOR {DELAY  'tiempo_a_transcurrir' 

               |TIME 'fechaHora_de_ejecucion'}  

DELAY permite indicar un período de tiempo especificado (hasta un máximo de 24 horas) que debe transcurrir antes de la ejecución de un lote, un procedimiento almacenado o una transacción.
'tiempo_a_transcurrir' Es el período de tiempo que hay que esperar, se puede especificar en uno de los formatos aceptados para el tipo de datos datetime o como una variable local. No se pueden especificar fechas; por lo tanto, no se permite la parte de fecha del valor datetime.
TIME permite indicar la hora especifica a la que se ejecuta el lote, el procedimiento almacenado o la transacción.
'fechaHora_de_ejecucion' Es la hora a la que termina la instrucción WAITFOR por tanto a la que empieza la ejecución de las instrucciones siguientes a WAITFOR. Se puede especificar en uno de los formatos aceptados para el tipo de datos datetime o como una variable local. No se pueden especificar fechas; por lo tanto, no se permite la parte de fecha del valor datetime.
Cada instrucción WAITFOR tiene un subproceso asociado. Si se especifica un gran número de instrucciones WAITFOR en el mismo servidor, se pueden acumular muchos subprocesos a la espera de que se ejecuten estas instrucciones. SQL Server supervisa el número de subprocesos asociados con las instrucciones WAITFOR y selecciona aleatoriamente algunos de estos subprocesos para salir si el servidor empieza a experimentar la falta de subprocesos.

Ejemplo:


    PRINT  CONVERT(CHAR(8),Getdate(),108);

    WAITFOR DELAY '00:00:03'

    PRINT CONVERT(CHAR(8),Getdate(),  108);

    WAITFOR DELAY '00:03'

    PRINT CONVERT(CHAR(8),Getdate(), 108); 

Visualiza la hora actual, espera 3 segundos y vuelve a visualizar la hora actual, después espera 3 minutos y vuelve a visualizar la hora actual. Se ha utilizado la función CONVERT con el estilo 108 para que aparezca sólo la hora y con segundos.

9.9. GOTO

Altera el flujo de ejecución y lo dirige a una etiqueta.
Las etiquetas se indican mediante un nombre seguido del carácter:

GOTO NombreEtiqueta

Ejemplo:

IF Condicion GOTO etiq 

    ----

    Etiq:

    ----

    ----

Es una instrucción a evitar porque puede llevar a redactar programas no estructurados.

9.10. TRY... CATCH

Definición

La estructura TRY…CATCH implementa un mecanismo de control de errores para Transact-SQL, permite incluir un grupo de instrucciones Transact-SQL en un bloque TRY. Si se produce un error en el bloque TRY, el control se transfiere a otro grupo de instrucciones que está incluido en un bloque CATCH.


    BEGIN TRY

       {sentencia_sql|bloque_sql} 

    END TRY

    BEGIN CATCH

        [{sentencia_sql|bloque_sql}]

    END CATCH [  ; ] 

Una construcción TRY…CATCH no puede abarcar varios bloques de instrucciones Transact-SQL (varios bloques BEGIN…END de instrucciones Transact-SQL) ni  una construcción IF…ELSE.

Si no hay errores en el código incluido en un bloque TRY, cuando la última instrucción de este bloque ha terminado de ejecutarse, el control se transfiere a la instrucción inmediatamente posterior a la instrucción END CATCH asociada. Si hay un error en el código incluido en el bloque TRY, el control se transfiere a la primera instrucción del bloque CATCH asociado. Si la instrucción END CATCH es la última instrucción de un procedimiento almacenado o desencadenador, el control se devuelve a la instrucción que llamó al procedimiento almacenado o activó el desencadenador.
Las construcciones TRY…CATCH se pueden anidar.
Las construcciones TRY…CATCH capturan los errores no controlados de los procedimientos almacenados o desencadenadores ejecutados por el código del bloque TRY. Alternativamente, los procedimientos almacenados o desencadenadores pueden contener sus propias construcciones TRY…CATCH para controlar los errores generados por su código. Por ejemplo, cuando un bloque TRY ejecuta un procedimiento almacenado y se produce un error en éste, el error se puede controlar de las formas siguientes:

  • Si el procedimiento almacenado no contiene su propia construcción TRY…CATCH, el error devuelve el control al bloque CATCH asociado al bloque TRY que contiene la instrucción EXECUTE.
  • Si el procedimiento almacenado contiene una construcción TRY…CATCH, el error transfiere el control al bloque CATCH del procedimiento almacenado. Cuando finaliza el código del bloque CATCH, el control se devuelve a la instrucción inmediatamente posterior a la instrucción EXECUTE que llamó al procedimiento almacenado.

No se pueden utilizar instrucciones GOTO para entrar en un bloque TRY o CATCH pero se puede utilizar para saltar a una etiqueta dentro del mismo bloque TRY o CATCH, o bien para salir de un bloque TRY o CATCH.
TRY…CATCH no se puede utilizar en una función definida por el usuario.

Febrero-2010
Pág. 9.6

Atrás  Inicio  Adelante






.