Uso de Lotes y Lenguaje de Control de Flujo

download Uso de Lotes y Lenguaje de Control de Flujo

of 17

Transcript of Uso de Lotes y Lenguaje de Control de Flujo

  • 7/25/2019 Uso de Lotes y Lenguaje de Control de Flujo

    1/17

    Uso de lotes y lenguaje de control de flujo

    Transact-SQL permite agrupar una serie de instrucciones como un lote, ya sea de formainteractiva o desde un archivo del sistema operativo. Tambin se pueden utiliar lasestructuras de control de flujo ofrecidas por Transact-SQL para conectar las instruccionesutiliando estructuras de tipo de programaci!n.

    "n este cap#tulo se trata lo siguiente$ Una introducci!n general a los lotes y al lenguaje de control de flujo Las reglas asociadas con el uso de instrucciones en lotes Uso del lenguaje de control de flujo

    %efinici!n de lote y de lenguaje de control de flujoHasta aqu, cada ejemplo de la Gua del Usuario de Transact-SQL consisti de una instruccinindividual. Las instrucciones individuales se ejecutan en SQL Server de una en una, introduciendoinstrucciones y recibiendo resultados de forma interactiva. SQL Server tambin puede procesar

    instrucciones mltiples ejecutadas como un lote, tanto de forma interactiva como desde un arc!ivo."n lote de instrucciones SQL se termina mediante una se#al de fin de lote que indica a SQL Serverque contine y ejecute las instrucciones. La se#al de fin de lote para la utilidad SQL autnoma is&les la palabra $%o$ sola en una lnea. &ara obtener m's detalles, consulte el manual de pro%ramasde utilidad de SQL Server.(esde el punto de vista tcnico, una sola instruccin SQL puede constituir un lote, peronormalmente se piensa en un lote como un conjunto de instrucciones mltiples. )on frecuencia, unlote de instrucciones se escribe en un arc!ivo del sistema operativo antes de enviarse a is&l .*ransact+SQL proporciona palabras clave especiales llamadas len%uaje de control de flujo quepermiten controlar el flujo de ejecucin de las instrucciones. l len%uaje de control de flujo sepuede utili-ar en instrucciones sencillas, lotes, procedimientos almacenados y disparadores.l len%uaje de control de flujo, como if...else para la ejecucin condicional de comandos y 'hilepara la ejecucin repetitiva, permite refinar y controlar el funcionamiento de las instrucciones SQL.

    l len%uaje de control de flujo de *ransact+SQL transforma el SQL est'ndar en un len%uaje depro%ramacin de muy alto nivel.(eglas asociadas a lotesisten re%las que controlan qu instrucciones SQL pueden combinarse en un solo lote. stasre%las de lotes incluyen lo si%uiente/

    0l%unos comandos de base de datos no pueden combinarse con otras instrucciones en unlote. Se trata de los si%uientes/ create procedure create rule create default createtrigger create vie'

    Los comandos que s pueden combinarse con otras instrucciones SQL en un lote incluyen/create database 1salvo que no puede crear una base de datos y %enerar o acceder a losobjetos de la base de datos nueva en un solo lote2 create table create inde)

    Las re%las y valores predeterminados no pueden vincularse a columnas y utili-arse duranteel mismo lote. sp*bindrule y sp*bindefault no pueden estar en el mismo lote que lasinstrucciones insert que ejecutan la re%la o valor predeterminado.

    use debe ejecutarse en un lote anterior antes que las instrucciones que !acen referencia alos objetos de dic!a base de datos.

  • 7/25/2019 Uso de Lotes y Lenguaje de Control de Flujo

    2/17

    3o es posible reali-ar una operacin drop con un objeto y despus !acer referencia a steo volver a crearlo en el mismo lote.

    )ualquier opcin definida con una instruccin set tendr' efecto al final del lote. s posiblecombinar instrucciones set y consultas en el mismo lote, pero las opciones de set no seaplicar'n a las consultas de dic!o lote.

    "jemplos del uso de lotesLos ejemplos de esta seccin describen lotes que utili-an el formato de la utilidad is&l , que tieneuna clara se#al de fin de lote/ la palabra $%o$ sola en una lnea. 0 continuacin se muestra un loteque contiene dos instrucciones select en un solo lote/select count142 from titles

    select count142 from aut!ors

    %o+++++++++++++

    56

    15 ro7 affected2

    +++++++++++++

    89

    15 ro7 affected2Se puede crear una tabla y !acer referencia a ella en el mismo lote. ste lote crea una tabla,inserta una fila en ella y despus selecciona todo lo que contiene/

    create table test

    1column5 c!ar15:2, column8 int2

    insert test

    values 1$!ello$, ;

  • 7/25/2019 Uso de Lotes y Lenguaje de Control de Flujo

    3/17

    15 ro7 affected2

    "na instruccin create vie' debe ser la nica instruccin de un lote. ste lote contiene una sola

    instruccin, que crea una vista/

    create vie7 testvie7 as

    select column5 from test

    %o

    Se puede combinar una instruccin use con otras instrucciones siempre que los objetos a los que!a%a referencia en las instrucciones subsi%uientes estn en la base de datos donde empe-. stelote selecciona de una tabla de la base de datos master y despus abre la base de datospubs 2 .l lote supone que se encuentra en la base de datos master del principio. *ras la ejecucin del lote,

    pubs2 es la base de datos actual.

    select count142 from sysdatabases

    use pubs8

    %o

    +++++++++++++

    , State 5/

    Server ?!q?, Line 8/

    Bnvalid object name ?titles?.drop table test

    create table test

    1column5 c!ar15:2, column8 int2

  • 7/25/2019 Uso de Lotes y Lenguaje de Control de Flujo

    5/17

    %o=s% 8F5G, Level 5>, State 5/

    Server ?!q?, Line 8/

    a !ay un objeto llamado ?test? en la base de datos.Lotes enviados como archivosSe pueden enviar uno o m's lotes de instrucciones SQL a is&l desde un arc!ivo del sistemaoperativo. "n arc!ivo puede incluir m's de un lote, es decir, m's de una serie de instrucciones,cada uno terminado con la palabra $%o$.&or ejemplo, un arc!ivo del sistema operativo podra contener los si%uientes tres lotes/use pubs8

    %o

    select count142 from titles

    select count142 from aut!ors

    %o

    create table test

    1column5 c!ar15:2, column8 int2

    insert test

    values 1$!ello$, ;

  • 7/25/2019 Uso de Lotes y Lenguaje de Control de Flujo

    6/17

    +++++++++ +++++++++

    !ello ;

  • 7/25/2019 Uso de Lotes y Lenguaje de Control de Flujo

    7/17

    use pubs8

    %o

    select count142 from titles

    select count142 from aut!ors

    %o

    create table test

    1column5 c!ar15:2, column8 int2

    insert test

    values 1$!ello$, ;

  • 7/25/2019 Uso de Lotes y Lenguaje de Control de Flujo

    8/17

    l len%uaje de control de flujo se puede utili-ar con instrucciones interactivas, en lotes y enprocedimientos almacenados. l control de flujo y las palabras clave relacionadas y sus funcionesson/

    Tabla +-+$ ontrol de flujo y palabras clave relacionadas

    alabra

    clave/unci!n

    if (efine una ejecucin condicional.

    ...else (efine una ejecucin alternativa cuando la condicin if es falsa.

    begin )omien-o de un bloque de instrucciones.

    ...end Iinal de un bloque de instrucciones.

    'hile Cepite la ejecucin de instrucciones mientras la condicin es verdadera.

    brea0 Sale del final del si%uiente bucle 'hile m's eterior.

    ...continue Ceinicio del bucle 'hile .

    declare (eclara variables locales.

    goto label Da a un rtulo 1 label:) , una posicin en un bloque de instrucciones.return Sale de forma incondicional.

    'aitfor (efine el retardo para la ejecucin del comando.

    printBmprime un mensaje definido por el usuario o una variable local en la pantalla delusuario.

    raiserrorBmprime un mensaje definido por el usuario o una variable local en la pantalla delusuario y define un indicador del sistema en la variable %lobal KK error .

    12 coment ario

    21Bnserta un comentario en cualquier punto de una instruccin SQL.

    if ... else

    La palabra clave if , con o sin la compa#a de else , se utili-a para introducir una condicin quedetermina si se ejecutar' la instruccin si%uiente. La instruccin SQL se ejecuta si la condicin secumple, es decir, si devuelve *C" 1verdadero2.La palabra clave else introduce una instruccin SQL alternativa que se ejecuta cuando la condicinif devuelve I0LS 1falso2.

    La sintais para if y else es/if

    boolean_expression

    statement

    else

  • 7/25/2019 Uso de Lotes y Lenguaje de Control de Flujo

    9/17

    if boolean_expression M

    statement M"na epresin booleana es una epresin que devuelve *C" o I0LS. n ella se puede incluirun nombre de columna, una constante, cualquier combinacin de nombres de columna yconstantes conectados por operadores aritmticos o basados en bits, o una subconsulta, siempre

    que sta devuelva un solo valor. Si la epresin booleana contiene una instruccin select , debeincluirse entre parntesis y devolver un solo valor.0 continuacin se muestra un ejemplo del uso de if sola/

    if eists 1select postalcode from aut!ors

    7!ere postalcode N ?

  • 7/25/2019 Uso de Lotes y Lenguaje de Control de Flujo

    10/17

    set price N price 4 8

    select title, price

    from titles

    7!ere price R86

    endSin begin ni end , la condicin if slo se aplicara a la primera instruccin SQL. La se%undainstruccin se ejecutara independientemente de la primera.Los bloques begin ... end pueden anidarse dentro de otros bloques begin...end .

    'hile y brea0...continue

    'hile se utili-a para definir una condicin para la ejecucin repetida de una instruccin o un bloquede instrucciones. Las instrucciones se ejecutan reiteradamente siempre que la condicinespecificada sea verdadera.

    La sintais es/7!ile boolean_expression

    statement

    n este ejemplo, las instrucciones select y update se repiten siempre que el precio promediopermane-ca por debajo de R9:/7!ile 1select av%1price2 from titles2 R9:

    be%in

    select titleTid, price

    from titles

    7!ere price R8:

    update titles

    set price N price 4 8

    end

    brea0 y continue controlan el funcionamiento de las instrucciones dentro de un bucle 'hile .brea0 permite salir del bucle 'hile . *odas las instrucciones que aparecen despus de la palabraclave end , que marca el final del bucle, se ejecutan. continue !ace que el bucle 'hile se inicie de

    nuevo, omitiendo cualquier instruccin despus de continue menos dentro del bucle. brea0 ycontinue se activan frecuentemente mediante una prueba if .La sintais de brea0...continue es/7!ile boolean expression

    be%in

    statement

    statement M...

  • 7/25/2019 Uso de Lotes y Lenguaje de Control de Flujo

    11/17

    breaP

    statement M...

    continue

    statement M...

    end

    0 continuacin se muestra un ejemplo con 'hile , brea0 , continue e if que invierte el aumentoproducido en los ejemplos anteriores. Siempre que el precio promedio permane-ca por encima deR8:, todos los precios se reducen a la mitad. (espus se selecciona el precio m'imo. Si esinferior a RG:, se sale del bucle 'hile U en caso contrario, intenta reali-ar el bucle de nuevo.continue permite que la instruccin print se ejecute slo cuando el promedio est' por encima deR8:. (espus de que termina el bucle 'hile , se imprime un mensaje y una lista de los libros con elprecio m'imo.7!ile 1select av%1price2 from titles2 R8:

    be%in

    update titles

    set price N price V 8

    if 1select ma1price2 from titles2 RG:

    breaP

    else

    if 1select av%1price2 from titles2 R8:

    continue

    print $0vera%e price still over R8:$

    end

    select titleTid, price from titles

    7!ere price R8:

    print $3ot *oo pensive$

    Si !ay dos o m's bucles 'hile anidados, la instruccin brea0 sale al si%uiente bucle eterior.&rimero se ejecutan todas las instrucciones que aparecen despus de la palabra clave end delbucle interno y lue%o se reinicia el bucle eterno .

  • 7/25/2019 Uso de Lotes y Lenguaje de Control de Flujo

    12/17

    declare y variables locales

    "na variable es una entidad a la que se asi%na un valor. ste valor puede cambiar durante el lote oel procedimiento almacenado donde se utili-a la variable. SQL Server tiene dos tipos devariables/ locales y %lobales. Las variables locales est'n definidas por el usuario, mientras que lasvariables %lobales las suministra el sistema y est'n predefinidas.

    Las variables locales se declaran, nombran y escriben mediante la palabra clave declare , yreciben un valor inicial mediante una instruccin select . (ic!as variables deben declararse, recibirun valor y utili-arse en su totalidad dentro del mismo lote o procedimiento.Las variables locales se utili-an frecuentemente en un lote o procedimiento almacenado comocontadores de bucles 'hile o bloques if...else . )uando se usan en procedimientos almacenados,las variables locales se declaran para su uso autom'tico no interactivo por parte del procedimientocuando ste se ejecuta.Los nombres de las variables locales deben empe-ar con el smbolo $K$ y despus se%uir lasre%las para identificadores. 0 cada variable local se le debe asi%nar un tipo de datos definido por elusuario o un tipo de datos suministrado por el sistema distinto de text , image o sysname .Las variables locales se declaran con esta sintais/declare K ariable_name datatype

    , K ariable_name datatype M...

    3ariables y valores nulos

    0 las variables locales se les asi%na el valor 3"LL cuando se declaran, y se les puede asi%nar elvalor nulo mediante una instruccin select . l si%nificado especial de 3"LL requiere que lacomparacin entre variables con valores nulos y otros valores nulos se ajuste a re%las especiales.sta tabla muestra los resultados de comparaciones entre columnas con valores nulos yepresiones con valores nulos usando operadores de comparacin diferentes 1una epresinpuede ser una variable, un literal, o una combinacin de variables, literales y operadoresaritmticos2.

    )omparacin de valores nulos

    "sando los operadores N,WN o

    "sando los operadores , ,N, W o W

    omparando c olumn_value y c

    olumn_value

    I0LS I0LS

    omparando c olumn_value y e

    xpression

    *C" I0LS

    omparando e xpression y c

    olumn_value

    *C" I0LS

    omparando e xpression y expression

    *C" I0LS

    declare y variables locales

    Las variables %lobales son variables predefinidas suministradas por el sistema. Se distin%uen delas variables locales por tener dos smbolos $K$ precediendo a sus nombres, por ejemplo, !!error .stas son las variables %lobales/

  • 7/25/2019 Uso de Lotes y Lenguaje de Control de Flujo

    13/17

    Dariables %lobales de SQL Server

    Dariable ontenido@@char_convert )ontiene : si la conversin del jue%o de caracteres no est' en efecto.

    )ontiene 5 si la conversin del jue%o de caracteres est' en efecto.@@client_csname )ontiene el nombre del jue%o de caracteres del cliente. Se define como

    3"LL si el jue%o de caracteres del cliente nunca fue iniciali-adoU en

    caso contrario, contiene el nombre del ltimo jue%o de caracteresutili-ado.

    @@client_csid )ontiene la B( del jue%o de caracteres del cliente. Se define como +5 siel jue%o de caracteres del cliente nunca fue iniciali-adoU en casocontrario, contiene la id de sysc"arsets del ltimo jue%o de caracteresusado.

    @@connections )ontiene el nmero de lo%ins o intentos de lo%in.@@cpu_busy )ontiene la cantidad de tiempo, en pulsos, que la )&" emple en

    reali-ar el trabajo de SQL Server desde la ltima ve- que se inici.@@error )ontiene : si la ltima transaccin se ejecut de forma correctaU en

    caso contrario, contiene el ltimo nmero de error %enerado por elsistema. La variable %lobal !!error se utili-a %eneralmente paraverificar el estado de error, se !aya ejecutado correctamente o no, de

    la ltima instruccin emitida. "na instruccin como if 44error 56 7se%uida de return ori%ina una salida por error.

    @@identity )ontiene el ltimo valor insertado en una columna B(3*B* medianteuna instruccin insert o select into . !!identity se define cada ve-que se inserta una fila en una tabla. Si una instruccin inserta mltiplesfilas, KK identity refleja el valor B(3*B* de la ltima fila insertada.Si la tabla afectada no contiene una columna B(3*B*, !!identity sedefine en :.l valor de !!identity no se ve afectado por el fallo de una instruccininsert o select into , ni por la reversin de la transaccin que lacontena. KK identity conserva el ltimo valor insertado en unacolumna B(3*B*, aunque la instruccin que la !aya insertado no seconsi%ne.

    @@idle )ontiene la cantidad de tiempo, en pulsos, que SQL Server estuvoinactivo.

    @@io_busy )ontiene la cantidad de tiempo, en pulsos, que SQL Server emplepara efectuar operaciones de entrada y salida.

    @@isolation )ontiene el nivel de aislamiento actual del pro%rama *ransact+SQL.!!isolation toma el valor del nivel activo 15 o 92.

    @@langid (efine la B( de idioma local del idioma en uso, se%n el valor desyslanguages#langid .

    @@language (efine el nombre del idioma en uso, se%n el valor desyslanguages#name .

    @@maxcharlen )ontiene la lon%itud m'ima, en bytes, de los caracteres multibyte deljue%o de caracteres predeterminado.

    @@max_connections )ontiene el nmero m'imo de coneiones simult'neas que se puedenreali-ar con SQL Server en este entorno inform'tico. l usuario puedeconfi%urar SQL Server para cualquier nmero de coneiones menor oi%ual que el valor de !!max_connections con sp*configure $number of user connections $.

    @@ncharsize )ontiene la lon%itud media, en bytes, de un car'cter nacional.@@nestlevel )ontiene el nivel de anidacin de la ejecucin actual, inicialmente cero.

    )ada ve- que un procedimiento almacenado o disparador llama a otroprocedimiento almacenado o disparador, se incrementa el nivel deanidacin. Si se supera el m'imo de 5>, la transaccin se aborta.

  • 7/25/2019 Uso de Lotes y Lenguaje de Control de Flujo

    14/17

    @@pack_received )ontiene el nmero de paquetes de entrada ledos por SQL Server.@@pack_sent )ontiene el nmero de paquetes de salida escritos por SQL Server.@@packet_errors )ontiene el nmero de errores %enerados mientras SQL Server

    enviaba y reciba paquetes.@@procid )ontiene la B( de procedimiento almacenado del procedimiento en

    ejecucin.

    @@rowcount )ontiene el nmero de filas afectadas por la ltima consulta.!!ro$count es definida como cero por cualquier comando que nodevuelve filas, como una instruccin if .

    @@servername )ontiene el nombre de este SQL Server.@@spid )ontiene el nmero de la B( de proceso de servidor del proceso actual.@@sqlstatus )ontiene informacin de estado resultante de la ltima instruccin

    fetch .@@textcolid )ontiene la B( de columna de la columna referenciada por KK textptr .

    l tipo de datos de esta variable es tinyint .@@textdbid )ontiene la B( de base de datos de una base de datos que contiene un

    objeto con la columna referenciada por KK textptr . l tipo de datos deesta variable es smallint.

    @@textobjid )ontiene la B( de objeto de un objeto que contiene la columna

    referenciada por KK textptr . l tipo de datos de esta variable es int@@textptr )ontiene el puntero de teto de la ltima columna text o image

    insertada o actuali-ada por un proceso. l tipo de datos de estavariable es binary%&') 1no confunda esta variable con la funcin te)tptr2.

    @@textsize )ontiene el lmite del nmero de bytes de datos text o image devueltospor una instruccin select . l lmite predeterminado es 98X bytes parais&l U el valor predeterminado depende del soft7are del cliente. &uedecambiarse el lmite de una sesin mediante set te)tsie .

    @@textts )ontiene la marca !oraria de teto de la columna referenciada por KKtextptr . l tipo de datos de esta variable es arbinary%() .

    @@thresh_hysteresi

    s

    )ontiene la disminucin de espacio libre necesaria para activar unumbral. sta cantidad, tambin conocida como valor de !istresis, se

    mide en p'%inas de base de datos de 8X. (etermina la proimidad a laque se pueden colocar los umbrales en un se%mento de base de datos.

    @@timeticks )ontiene el nmero de microse%undos por pulso. La cantidad detiempo por pulso es dependiente de la m'quina.

    @@total_errors )ontiene el nmero de errores %enerados mientras SQL Serverreali-aba una lectura o escritura.

    @@total_read )ontiene el nmero de lecturas de disco reali-adas por SQL Serverdesde la ltima ve- que se inici.

    @@total_write )ontiene el nmero de escrituras de disco reali-adas por SQL Serverdesde la ltima ve- que se inici.

    @@tranchained )ontiene el modo de transaccin actual del pro%rama *ransact+SQL.!!tranc"ained devuelve : para no encadenadas o 5 paraencadenadas.

    @@trancount )ontiene el nmero de transacciones activas del usuario actual.@@transtate )ontiene el estado actual de una transaccin despus que se ejecuta

    una instruccin. Sin embar%o, !!transtate no se borra para cadainstruccin, al contrario de lo que ocurre con !!error .

    @@version )ontiene la fec!a de la versin actual de SQL Server.

  • 7/25/2019 Uso de Lotes y Lenguaje de Control de Flujo

    15/17

    goto

    La palabra clave goto ori%ina una bifurcacin incondicional a un rtulo definido por el usuario. goto

    y los rtulos pueden utili-arse en procedimientos almacenados y lotes. l nombre del rtulo debeajustarse a las re%las para identificadores e ir se%uido de un si%no de dos puntos 1/2 la primera ve-que se introduce. 3o va se%uido de un si%no de dos puntos cuando se utili-a con goto .

    0 continuacin se muestra la sintais/label /

    %oto label0 continuacin se muestra un ejemplo que utili-a goto y un rtulo, un bucle 'hile u una variablelocal como contador/declare Kcount smallint

    select Kcount N 5

    restart/

    print $yes$

    select Kcount N Kcount Y 5

    7!ile Kcount NG

    %oto restart)omo en este ejemplo, goto %eneralmente se !ace dependiente de un bucle 'hile o una prueba if, o al%una otra condicin, a fin de evitar un bucle infinito entre goto y el rtulo.

    return

    La palabra clave return sale de un lote o procedimiento de forma incondicional y puede usarse encualquier momento de un lote o procedimiento. )uando se utili-a en procedimientos almacenados,return puede aceptar un ar%umento opcional para devolver un estado al solicitante. Lasinstrucciones que aparecen despus de return no se ejecutan.La sintais es simplemente/return int_expression M

    0 continuacin se muestra un ejemplo de un procedimiento almacenado que utili-a return , ascomo if...else y begin...end /create procedure findrules Knm varc!ar19:2 N null as

    if Knm is null

    be%in

    print $ou must %ive a user name$

    return

    end

    else

  • 7/25/2019 Uso de Lotes y Lenguaje de Control de Flujo

    16/17

    be%in

    select sysobjects.name, sysobjects.id, sysobjects.uid

    from sysobjects, master..syslo%ins

    7!ere master..syslo%ins.name N Knm

    and sysobjects.uid N master..syslo%ins.suid

    and sysobjects.type N $C$

    endSi no se proporciona nin%n nombre de usuario como par'metro cuando se llama a findrules , lapalabra clave return !ace que el procedimiento se deten%a despus de que el usuario !ayarecibido un mensaje en su pantalla. Si se proporciona un nombre de usuario, los nombres de lasre%las propiedad del usuario se recuperan de las tablas del sistema correspondientes.return es similar a la palabra clave brea0 usada dentro de los bucles 'hile

    print

    La palabra clave print , utili-ada en el ejemplo anterior, muestra un mensaje definido por el usuarioo el contenido de una variable local en la pantalla del usuario. La variable local debe declararsedentro del mismo lote o procedimiento en el que se utili-a. l mensaje en s puede tener !asta 8;;bytes de lon%itud.La sintais es/print Z ormat_string [ K local_ariable [

    KK global T ariable \ , arg_list MHe aqu otro ejemplo/if eists 1select postalcode from aut!ors

    7!ere postalcode N ?

  • 7/25/2019 Uso de Lotes y Lenguaje de Control de Flujo

    17/17

    'aitfor

    La palabra clave 'aitfor especifica una !ora determinada del da, un intervalo de tiempo o unevento en el que debe tener lu%ar la ejecucin de un bloque de instrucciones, un procedimientoalmacenado o una transaccin.

    0 continuacin se muestra la sintais/7aitfor Zdelay $ time $ [ time $ time $ [ erroreit [ processeit [ mirroreit\

    La palabra clave delay indica a SQL Server que espere !asta que !aya transcurrido el tiempoespecificado. time indica a SQL Server que espere !asta la !ora especificada, proporcionada enuno de los formatos aceptables para datos datetime .