Firebird Tutorial

download Firebird Tutorial

of 55

Transcript of Firebird Tutorial

  • 7/23/2019 Firebird Tutorial

    1/55

    CREATE TABLEprueba (

    clave integer not null primary key,

    hora time,

    fecha date,

    todo timestamp)

    ird http://infoback.com.ar/buhardilla/firebird/fir

    76 29/06/2012 0

  • 7/23/2019 Firebird Tutorial

    2/55

    Firebird................................................................................................................................................... 1

    Introduccin............................................................................................................................................ 5

    Descripcin y caractersticas generales.................................................................................................... 5

    Arquitectura....................................................................................................................................... 7

    Servidor........................................................................................................................................ 7

    Cliente.......................................................................................................................................... 7

    Bloqueos, versiones y generaciones................................................................................................ 7

    Operaciones con mltiples tablas.............................................................................................................. 9

    Transacciones.................................................................................................................................... 9

    Concurrencia 1: niveles de aislamiento de transacciones................................................................. 11

    Concurrencia 2: modo de bloqueo de una transaccin..................................................................... 12

    Bloqueos pesimistas..................................................................................................................... 14

    Mantener el contexto................................................................................................................... 15

    Integridad referencial........................................................................................................................ 15

    Instalacin y puesta en marcha............................................................................................................... 17

    Descarga desde Internet................................................................................................................... 17

    Probar la instalacin.......................................................................................................................... 17

    ISQL.......................................................................................................................................... 18

    Herramientas................................................................................................................................... 19

    IBServer..................................................................................................................................... 19

    IBGuardian.................................................................................................................................. 19

    ISQL.......................................................................................................................................... 19

    Gbak........................................................................................................................................... 19

    IBConsole................................................................................................................................... 19

    Ejecutar sentencias SQL en IBConsole.................................................................................... 21

    IBOConsole................................................................................................................................ 22

    IB_SQL...................................................................................................................................... 23

    SQL..................................................................................................................................................... 24

    El lenguaje de consulta...................................................................................................................... 24

    SQLSQL son las iniciales de......................................................................................................... 24

    Cursores vs conjuntos....................................................................................................................... 24

    Seleccin de registros: SELECT........................................................................................................ 25

    Orden en la sala........................................................................................................................... 29

    Filtrados y bsquedas................................................................................................................... 30

    Fechas/Horas en SQL.................................................................................................................. 32

    ird http://infoback.com.ar/buhardilla/firebird/fir

    76 29/06/2012 0

  • 7/23/2019 Firebird Tutorial

    3/55

    Criterios de seleccin................................................................................................................... 34

    Funciones.................................................................................................................................... 38

    Funciones de agregacin.............................................................................................................. 38

    Subconsultas................................................................................................................................ 41

    Comparacin con el resultado de una subconsulta.......................................................................... 43

    Uniones....................................................................................................................................... 45

    Consulta de varias tablas relacionadas........................................................................................... 45

    Creacin, modificacin y borrado de objetos............................................................................................ 52

    Lenguaje de Definicin de Datos (DDL)............................................................................................ 52

    Bases de Datos........................................................................................................................... 52

    Creacin de una base de datos................................................................................................. 52

    El tamao no importa (perdn, Godzilla!)................................................................................... 53

    Pginas.................................................................................................................................. 53

    El juego de caracteres............................................................................................................. 54

    Modificacin de una base de datos........................................................................................... 57

    Borrado de una base de datos.................................................................................................. 58

    Tablas......................................................................................................................................... 58

    Creacin de una tabla.............................................................................................................. 58

    Nombres de objetos................................................................................................................. 59

    Tipos de datos soportados por Firebird...................................................................................... 59

    Condiciones para los campos................................................................................................... 60

    Campos calculados.................................................................................................................. 61

    Restricciones.......................................................................................................................... 62

    Modificacin de la estructura de una tabla................................................................................ 63

    Borrado de una tabla completa................................................................................................. 65

    Dominios..................................................................................................................................... 65

    Creacin de dominios.............................................................................................................. 65

    Modificacin de dominios......................................................................................................... 66

    Borrado de dominios................................................................................................................ 66

    Indices........................................................................................................................................ 66

    Crear un ndice....................................................................................................................... 66

    Modificar un ndice.................................................................................................................. 66

    Borrar un ndice...................................................................................................................... 67

    Restricciones.................................................................................................................................... 67

    PK.............................................................................................................................................. 67

    UQ............................................................................................................................................. 67

    FK.............................................................................................................................................. 67

    Check......................................................................................................................................... 67

    ird http://infoback.com.ar/buhardilla/firebird/fir

    76 29/06/2012 0

  • 7/23/2019 Firebird Tutorial

    4/55

    Not Null...................................................................................................................................... 67

    Generadores..................................................................................................................................... 67

    Crear un generador...................................................................................................................... 68

    Modificar un generador................................................................................................................ 68

    Borrar un generador..................................................................................................................... 69

    Excepciones..................................................................................................................................... 69

    Definir excepciones..................................................................................................................... 69

    Modificar excepciones................................................................................................................. 69

    Borrar excepciones...................................................................................................................... 69

    Programacin del servidor...................................................................................................................... 70

    Scripts............................................................................................................................................. 70

    Procedimientos almacenados............................................................................................................. 71

    Procedimientos de accin............................................................................................................. 71

    Triggers................................................................................................................................................ 72

    Funciones del usuario (UDF).................................................................................................................. 73

    Libreras estndar de funciones externas............................................................................................ 73

    Crear funciones externas en Delphi................................................................................................... 73

    Acceso desde Delphi............................................................................................................................. 74

    BDE................................................................................................................................................ 74

    IBX................................................................................................................................................. 74

    DBX................................................................................................................................................ 74

    ADO............................................................................................................................................... 74

    IBO................................................................................................................................................. 74

    UIB................................................................................................................................................. 74

    Optimizacin......................................................................................................................................... 75

    Plan de ejecucin.............................................................................................................................. 75

    Creacin de ndices........................................................................................................................... 75

    Selectividad...................................................................................................................................... 75

    Restricciones declarativas vs. activas................................................................................................. 75

    Restriccin de la cantidad de registros a traer al cliente....................................................................... 75

    Futuro................................................................................................................................................... 75

    ird http://infoback.com.ar/buhardilla/firebird/fir

    76 29/06/2012 0

  • 7/23/2019 Firebird Tutorial

    5/55

    El mundo de las Bases de Datos es ancho y ajeno, parafraseando a un escritor muy conocido. Existen muchos sistemasde stos, con caractersticas que los distinguen unos de otros. No obstante, todos comparten el mismo ncleo defuncionalidad, su objetivo bsico: sirven para almacenar y procesar datos, a veces cantidades realmente grandes.

    Las diferencias vienen despus. Cmo se almacenan los datos, qu tipos de datos pueden contener, qu tan avanzado esel lenguaje que permite consultar esos datos, caractersticas avanzadas para optimizar el proceso de grandes cantidadesde datos, por nombrar unas pocas. Aqu veremos solamente uno de estos sistemas en realidad dos, ya que sonprcticamente iguales- aunque me referir eventualmente a otros sistemas para hacer algunas comparaciones que nospermitan situarnos mejor en el tema.

    El sistema principal que es objetivo del presente se denomina Firebird, literalmente Pjaro de fuego, el Fnix querenace de sus cenizas. No tengo confirmacin oficial, pero creo que el nombre se eligi por las mltiples vidas queha tenido el proyecto Interbase, que culminaron en Firebird. Las caractersticas de este gestor de datos sonprcticamente iguales hasta la versin 1.0- a las de Interbase de Borland en su versin 6.0. Y es que Firebird fuecreado a partir de los fuentes de Interbase 6.0, liberados por Borland bajo licencia IPL. Un conjunto de excelentes yvoluntariosos programadores se impuso la tarea de llevar adelante el gestor de datos sin costo, agregando y mejorando

    caractersticas. En estos momentos (Febrero 2003) ya est disponible la beta 2 de la versin 1.5 de Firebird, que ya seaparta un poco de Interbase proveyendo caractersticas diferenciales tanto en el lenguaje de consulta como en losprocesos internos.

    Por su lado, Borland sigue avanzando tambin con Interbase pero ya no en forma gratuita. Se han liberado ya dosversiones ms de Interbase, 6.5 y 7. Las mejoras y nuevas caractersticas de estas versiones no estn disponibles enFirebird, o tienen otros nombres y sintaxis. Borland ya tom partido en cuanto a Firebird: no se va a hacer ningnesfuerzopor mantener la compatibilidad, no slo de Interbase sino tampoco en los componentes de acceso de susherramientas de desarrollo. As, por ejemplo, el controlador DBExpress de Interbase soporta las caractersticas nuevasde Interbase 7 pero no las de Firebird 1.5. Cuando hablemos de las formas de acceder por programa al servidor nosocuparemos de estos problemas y las soluciones que estn apareciendo.

    Firebird es un Gestor de Bases de Datos Relacionales. Es decir que trabaja con el esquema relacional surgido en loslaboratorios de IBM, de la mano de E. F. Codd y Chris Date. Este esquema ha sido implementado con xito en formacomercial, y de hecho la mayora de las aplicaciones de Bases de Datos se utilizan gestores que trabajan con este

    modelo[1]

    .

    Firebird es pequea una instalacin completa ocupa alrededor de 10 Mb incluyendo libreras, ejemplos deprogramacin y BD de muestra-, fcil de instalar y ejecutar, y an as muy poderosa. Puede trabajar muy bien concantidades de datos que van desde unos pocos hasta varios millones de registros por tabla. Generalmente no esnecesario tomar medidas especiales para optimizar el rendimiento del servidor, aunque tenemos la posibilidad de tocaralgunas variables para sacar ms provecho a situaciones particulares.

    Se puede ejecutar en una amplia variedad de sistemas operativos: Windows en todas sus encarnaciones, Linux, Solaris,

    MacOS y otros[2]

    .

    Por su tamao, rendimiento y poca necesidad de mantenimiento es un gestor ideal para aplicaciones pequeas ymedianas, que se puede llevar sin problemas a trabajar en situaciones ms exigentes y con mayor carga de trabajo y

    ird http://infoback.com.ar/buhardilla/firebird/fir

    76 29/06/2012 0

  • 7/23/2019 Firebird Tutorial

    6/55

    datos.

    Fsicamente, Firebird trabaja con uno o varios archivos adonde almacena todos los datos y estructuras: no msproliferacin de archivos como tenamos con Paradox o Dbase. Los archivos de Firebird 1.0 al igual que los deInterbase 6.0- pueden tener hasta 2 Gb de tamao cada uno.

    Firebird posee la mayora de las caractersticas avanzadas de los gestores modernos:

    Transacciones

    Posibilidad de definir ndices ascendentes o descendentes, con restriccin de unicidad Posibilidad de definir restricciones a los datos en la declaracin de las tablas, como ser

    o Integridad referencial

    o Unicidad

    o Controles de validacin (Check)

    o Columnas computadas, slo de lectura

    Posibilidad de programacin del servidor mediante disparadorestriggers- yprocedimientos almacenadosstored procedures.

    Posibilidad de definir procedimientos almacenados que devuelvan tablas virtuales Posibilidad de definicin de vistas

    Generadores de nmeros secuenciales, independientes de las transacciones

    Excepciones

    Eventos

    Funciones definidas por el usuario

    Dominios

    Un lenguaje SQL amplio y potente, que contempla funciones avanzadas como ser

    o Subconsultas

    o Uniones

    o Funciones de agregacin

    o Ordenamiento por columnas calculadas, etc

    o Vectores multidimensionales (matrices)

    En el apndice

  • 7/23/2019 Firebird Tutorial

    7/55

    El servidor es la parte que hace el trabajo: almacena los datos, los procesa, ejecuta los procedimientos almacenados yaplica las validaciones. Debe existir uno por lo menos en la red.

    Cliente

    El cliente es la parte que se encarga de la comunicacin entre las aplicaciones y el servidor. Maneja los protocolos,enva y recibe datos, enva comandos, etc. Es una capa mnima una librera de enlace dinmico, algunos archivosauxiliares y entradas en el registro de servicios del sistema- pero necesaria para la comunicacin con el servidor. Debeinstalarse en todoslos equipos que vayan a acceder al servidor, incluido el equipo adonde resida fsicamente el mismoservidor si se va a usar como terminal.

    Bloqueos, versiones y generaciones

    La principal caracterstica que distingue a Firebird/Interbase del resto de los gestores comerciales conocidos comoOracle, SQLServer o MySQL es su arquitectura generacional.

    La mayora de los gestores de datos relacionales implementan un mecanismo de transacciones, y Firebird no es laexcepcin; la diferencia est en cmose implementa el mecanismo. Generalmente se utilizan bloqueosde diferentesniveles registro, pgina, tabla- para impedir que otras transacciones modifiquen datos que se estn procesando. Estotiene la desventaja de que esas transacciones quedarn imposibilitadas de trabajar con los datos bloqueados hasta que latransaccin que impuso el bloqueo termine.

    Pensemos en el siguiente ejemplo: una empresa tiene que consolidar los datos de los inventarios de sus sucursales, paralo cual tiene que leer los valores de cada sucursal y acumularlos. La aplicacin que har la consolidacin comienza unatransaccin y va leyendo y sumando los datos de cada sucursal; no modifica nada, por lo que no seran necesarios losbloqueos termina de sumar todo, almacena o muestra el resultado y termina la transaccin. Todos contentos.

    Ahora pensemos qu pasara si en el medio del clculo una sucursal transfiere productos a otra, o simplemente losvende.

    Claro que la operacin debe quedar registrada en la base de datos, por lo que cambian los datos que se estnsumando si no tomamos medidas, podemos llegar a sumar varias veces los mismos productos, o a dejar algunoafuera.

    Estas situaciones se controlan mediante los distintos niveles de aislamiento de las transacciones, que indican lo que una

    transaccin ver de los cambios que produce otra transaccin que se activa al mismo tiempo. Para que los datos de latransaccin que acumula sean fidedignos, se debe usar el nivel de aislamiento ms alto posible: esta transaccin nodeberaver los cambios hechos por las dems en todo el tiempo que dure. Este nivel se denomina generalmente delecturas repetibles.

    Para lograr este nivel de aislamiento sera necesario bloquearlos cambios a todos los registros a considerar, o haceruna copia(una nueva generacinde datos) de los registros usados para la acumulacin, que entonces podran ser ledoscuantas veces fuera necesario. La mayora de los gestores de bases de datos utilizan el primer mecanismo; Firebird usael segundo.

    En breve: cada vez que se hace una modificacin a un registro, se crea una nueva versino generacindel mismo

    marcndola con un nmero que identifica a la transaccin que realiz el cambio. Con la ayuda de otra estructura de laque hablaremos enseguida, este mecanismo permite a Firebird lograr el nivel de lecturas repetibles sin usar bloqueos,as como evitar el uso de archivos de registro de operaciones (log).

    Las transacciones existentes en un determinado momento en la base de datos pueden estar en uno de tres estados[3]

    :

    Activa

    Aceptada (Committed)

    Cancelada (Rolled back)

    ird http://infoback.com.ar/buhardilla/firebird/fir

    76 29/06/2012 0

  • 7/23/2019 Firebird Tutorial

    8/55

    El estado de todas las transacciones existentes en la BD es mantenido en las Pginas de Inventario de TransaccionesoTIP(Transaction Inventory Pages). Es una lista de todas las transacciones que tienen datos en la base en cadamomento, acompaadas de su estado.

    Cuando comienza una transaccin, se le asigna un nmero nico que la identifica (llamado UTN, Unique TransactionNumber) y se le entrega una lista de todas las transacciones que tienen datos en la base y sus estados a ese momento:una copia de la TIP.

    Los nmeros identificadores de las transacciones (UTNs) son enteros crecientes en el tiempo; es decir, si unatransaccin comienza despus de otra es seguro que recibir un UTN ms grande que la primera. La consecuenciainversa ser muy usada en el mecanismo de versiones: si hay dos versiones de un mismo registro, la que tenga la UTNms grande ser posterior a la otra.

    Cuando una transaccin tiene que actualizar un registro, busca en su TIP si haba otras transacciones activas almomento de comenzar. Si no hay ninguna otra, entonces actualiza el registro sin ms. Pero si encuentra al menos unatransaccin activa en la TIP, no modifica el registro original: crea una nueva versin almacenando las diferencias (paraahorrar espacio) y su propio nmero de transaccin, el UTN.

    Ahora bien, si una transaccin quiere leer un registro, compara su propio identificador con el de la ltima versin delregistro. Si el UTN de la ltima versin es mayor al de la transaccin en cuestin, se toma la versin anterior delregistro. As se recorre la cadena de versiones hasta encontrar una cuyo UTN sea menor que el de la transaccin, y queadems est marcada como Aceptada en el inventario (TIP). Cualquier otra versin es pasada por alto.

    Ejemplo. Supongamos que tenemos la siguiente secuencia temporal:

    La transaccin 100 modifica un registro. Se crea una versin con UTN=100.1.

    Se acepta la transaccin 100 (estado: committed)2.

    Comienza la transaccin 103, que modifica el mismo registro. Se crea una nueva versin con UTN=103.3.

    Se cancela la transaccin 103 (estado: rolled back)4.

    Comienza la transaccin 110, que modifica el registro. Se crea una nueva versin con UTN=110. La transaccin

    no termina todava (estado: active)

    5.

    Comienza la transaccin 112.6.

    Comienza la transaccin 115, que modifica el registro. Se crea una nueva versin con UTN=115.7.

    Se acepta la transaccin 115 (estado: commited)8.

    La transaccin 112 lee el registro en cuestin. Cul es la versin que recupera?9.

    La versin 115 es posterior a su propio UTN, por lo que no se considera. Busca el anterior.

    La versin 110 corresponde a una transaccin que no ha terminado (estado = active) por lo que tambin seignora.

    La versin 103 corresponde a una transaccin cancelada, por lo que tambin se ignora.

    Finalmente, la versin 100 es correcta y es la que se recupera.

    Con este mecanismo se obtienen dos beneficios directos:

    Se trabaja en un nivel de aislamiento de lecturas repetibles sin bloquear las actualizaciones concurrentes a lalectura

    No se necesita llevar un registro de las operaciones para recuperar la base de datos de fallos; toda lainformacin est incluida en las versiones y la TIP. Lo nico que necesita hacer el servidor para recuperar unabase de datos despus de un fallo de alimentacin por ejemplo, es recorrer la TIP y marcar como canceladas atodas las transacciones que figuran como activas. De esta manera, los cambios que se haban producido son

    ird http://infoback.com.ar/buhardilla/firebird/fir

    76 29/06/2012 0

  • 7/23/2019 Firebird Tutorial

    9/55

    ignorados en subsecuentes operaciones.

    Por supuesto que tambin hay alguna contra: la base de datos va acumulando basura en la forma de versiones que noson utilizables. Esto obliga a ejecutar una accin de limpieza a intervalos, proceso que se denomina sweep. Esteproceso elimina las versiones anteriores de los registros, dejando solamente la ltima valida, pero puede impactarnegativamente en la performance del servidor. Por defecto se ejecuta automticamente cada 20.000 transacciones. Sepuede configurar esta cantidad en los parmetros del servidor, y tambin se puede ejecutar manualmente la limpieza.

    [ERC1]

    [ERC2]

    En el modelo relacional tenemos que lidiar con operaciones que involucran varias tablas. Por ejemplo, el tpico caso deun pedido o una factura: tendremos por lo menos dos tablas, una para los datos que identifican al pedido (fecha, cliente,

    nro, etc) y la otra con los datos de cada item que compone el pedido (cantidad, codigo, precio unitario, etc). Cuando seingresa una factura, tambin generalmente modificaremos datos en otras tablas: stock o inventario, cuenta corriente delcliente, etc. Sera muy problemtico si por cualquier causa como un corte de conexin- se interrumpe el proceso deactualizacin de algunas tablas despus de terminar con otras: pueden quedar registros hurfanos, por ejemplo itemsque no tienen factura, o datos desactualizados como el total de la cuenta corriente del cliente.

    Hay varias tcnicas para combatir estos problemas, un par de las cuales veremos ahora: transaccionesy restricciones deintegridad referencial.

    Transacciones

    Una transaccin es un conjunto de operaciones que se aceptan (Commit) o rechazan (Rollback) como una sola. Soncomo parntesis que encierran las operaciones que se deben realizar o cancelar juntas: todas las operaciones quedan ensuspenso hasta que se termina la transaccin. No se podrn ver desde ninguna otra transaccin, lo cual es una de lasmayores sorpresas cuando uno empieza a trabajar de esta manera (si no tenemos esto en cuenta, los cambios realizadosen una estacin no se vern desde otra hasta que se cierre y se vuelva a abrir la aplicacin).

    Las transacciones deben tener los siguientes atributos, reconocidos generalmente el acrnimo ACID, por sus inicialesen ingls:

    Apor Atomicity (Atomicidad). Las operaciones incluidas en una transaccin se manejan como un todoindivisible. Todas las operaciones se aceptan juntas, o ninguna.

    Cpor Consistency (Consistencia). Las transacciones siempre llevan la base de datos desde un estadoconsistente a otro; no pueden quedar datos inconsistentes, por ejemplo dos registros en la misma tabla con elmismo valor en la clave primaria. Sipueden darse inconsistencias duranteel desarrollo de una transaccin; pero lasdems transacciones simultneas que existan no vern este estado, y todas las inconsistencias debern resolverse almomento de terminar la transaccin.

    Ipor Isolation (aIslamiento). Cada transaccin se ejecuta como si estuviera sola en la base de datos; loscambios producidos por otras transacciones concurrentes no deben verse desde las dems.

    Dpor Durability (Durabilidad opersistencia). Una vez que una transaccin se acepta, sus cambios quedanfijos en la base de datos an en caso de una falla del sistema o cada de la conexin. Como un corolario, tambin se

    ird http://infoback.com.ar/buhardilla/firebird/fir

    76 29/06/2012 0

  • 7/23/2019 Firebird Tutorial

    10/55

    asegura que los cambios no se mantendrn en caso de una cada prematura del sistema, antes que la transaccin seaaceptada con Commit.

    La implementacin de transacciones de Firebird cumple con todas estas propiedades.

    Debido al diseo de Firebird, todoslos comandos deben ejecutarse en el contexto de una transaccin; si no lacontrolamos nosotros, se empieza una automticamente antes de ejecutar cada comando y se termina tambinautomticamente al finalizar el comando. Cuando queremos agrupar varias acciones en una sola transaccin, debemoscomenzarla y terminarla explcitamente. La accin de aceptar todos los cambios de la transaccin se denomina eningls Commit, mientras que el proceso de rechazar los cambios, volviendo atrs todas las acciones realizadas, sedenominaRollback.

    El lenguaje de programacin de Firebird no tiene sentencias de manejo de transacciones; esto es as porque todos losaccesos a Interbase deben hacerse dentro del contexto de una transaccin,yno se aceptan transacciones anidadas. Esdecir que todos los procedimientos almacenados o triggers que puedan llegar a ejecutarse lo harn siempre dentro de latransaccin del cliente que los ejecuta; en otras palabras, la responsabilidad es toda nuestra!

    En base a lo discutido, podemos ya entrever algunos problemas comunes en las aplicaciones y sus causas:

    Los datos se pierden al cerrar la aplicacin

    Se aceptaron los cambios en la aplicacin, pero no se ha aceptado la transaccin. Los datos estn en suspenso enla Base de Datos hasta que se ejecute Commit, de tal manera que si nuestra aplicacin no lo hace y cierra laconexin, el servidor asumir que se produjo algn problema y har unRollbackautomtico; todas lasmodificaciones realizadas en esa transaccin se perdern..

    Los cambios hechos en una estacin no se reflejan en otras que acceden simultneamente a los mismos datos

    Esto es una consecuencia de las propiedades de Consistencia y Aislamiento. Como dijimos antes, lasmodificaciones realizadas dentro de una transaccin deben ser aceptadas o canceladas en conjunto. Hasta ese

    momento, quedan en un limbo informtico y nadie se enterar de su existencia. Incluso despus de terminadacorrectamente una transaccin puede haber diferencias en lo que se ve en una y otra estacin de trabajo dependedel nivel de aislamientode las distintas transacciones concurrentes, un tema que veremos en breve.

    Problemas de bloqueos en registros que ya se modificaron

    Cuando se trabaja con mltiples usuarios a la vez es importante mantener las transacciones de corta duracin. Porqu? Porque como hemos visto, los otros usuarios no vern nuestros cambios hasta que cerremos nuestratransaccin; pero adems, los registros modificados son bloqueados para la edicin desde otras terminales bloqueoque se mantiene mientras dura la transaccin. Imaginemos que desde un puesto de venta se comienza una factura,se actualiza el stock, y antes de terminar la transaccin el empleado se detiene a tomar un caf no se podrnvender los mismos productos desde otras terminales hasta que vuelva y termine con su transaccin!

    Tambin hay un problema con el recolector de basurade Firebird, pero ese problema es menos urgente que losanteriores (se nota despus de un tiempo). En breve, el sistema recolector de basura de Firebird se activa despusde N transacciones (un parmetro de configuracin del servidor) y se encarga de eliminar los objetos auxiliares quecrea el servidor mientras procesa los datos. Si dejamos pasar mucho tiempo sin que se active este sistema, se puederalentizar mucho la operacin del servidor.

    Concurrencia 1: niveles de aislamiento de transacciones

    ird http://infoback.com.ar/buhardilla/firebird/fir

    76 29/06/2012 0

  • 7/23/2019 Firebird Tutorial

    11/55

    Cuando se trabaja en modo multiusuario[4]

    , accediendo desde varias estaciones a la misma Base de Datos, hay quetener especial cuidado con las transacciones concurrentes de los clientes. El servidor define varios niveles deaislamiento de transacciones concurrentes, que indican cmo se relacionan las transacciones simultneas entre s.

    Como un ejemplo, consideremos la siguiente situacin: un usuario empieza una transaccin y hace algunos cambios.Mientras todava su transaccin est activa, otro usuario empieza una segunda transaccin.El segundo usuario no verlos cambios que realice el primero, a menos que est en el modo ms bajo de aislamiento (que no existe en Firebird,ver a continuacin). Este comportamiento puede confundir al ms pintado, ya que posiblemente las dos transacciones

    se hagan... en la misma mquina! Entonces sera posible realizar un cambio en una ventana y no verlo desde otra;incluso re-ejecutando la consulta.

    Los niveles de aislamiento de transacciones de Firebird son los siguientes:

    read commited(lectura de lo aceptado): si estamos en una transaccin con este nivel de aislacin, podremos ver loscambios de los dems cuando ellos terminen su transaccin concommit(nosotros tendremos que repetir la consulta, osea cerrar y volver a abrir el conjunto de datos). No es necesario que terminemos nuestra transaccin para ver lasmodificaciones.

    snapshot(lectura repetible[5]

    ): se garantiza que el usuario que est en una transaccin de este tipo ver siempre los

    mismos datos, aunque otros usuarios hagan cambios y los acepten. No veremos los cambios hasta que cerremos nuestratransaccin y comencemos una nueva. Este nivel de aislamiento es ideal para los reportes, ya que en un entornomultiusuario puede darse que cambien los datos entre el momento de la vista previa en pantalla y la impresinpropiamente dicha.

    snapshot table stability(lectura repetible forzada): igual que la anterior, pero adems desde el momento queaccedemos a una tabla sta se bloquea para escritura. Este nivel es propio de Interbase, y no es muy usado porqueimpone una restriccin muy severa a los otros usuarios, que slo estarn habilitados para leer de todas las tablas quetoquemos mientras estemos en la transaccin.

    Hay un nivel ms de aislamiento que es comn en los sistemas de bases de datos locales: el llamado dirty reado delectura sucia. En este nivel se pueden ver los cambios de las dems transacciones, inmediatamente. Se pueden

    producir problemas por leer datos que no han sido todava aceptados; si el usuario que hizo la modificacin finalmenterechaza los cambios, hemos ledo datos inexistentes se denominan comnmentefilas fantasma, phantom rows. Estenivel no cumple con las propiedades de aislamiento y consistencia, por lo que no se permite en Firebird.

    Concurrencia 2: modo de bloqueo de una transaccin

    Cuando se modifica un registro desde una transaccin, ste se bloqueapara modificaciones desde otra transaccin; elbloqueo impide que se haga una segunda modificacin sobre los mismos datos mientras todava no se han aceptado orechazado los primeros.

    Hay dos metodologas de bloqueo: optimista y pesimista.

    Los servidores que implementan bloqueos pesimistas asumen que es muy probable que dos usuarios accedansimultneamente a los datos para modificarlos; entonces toman una postura preventiva y cuando un usuarioempieza a editar un registro ste queda inmediatamente bloqueado para la edicin desde cualquier otra terminal.Este modo de trabajo es muy comn en los sistemas de bases de datos de escritorio.

    Los servidores SQL asumen en cambio que no es tan probable que se produzcan ediciones simultneas a losmismos registros; basndose en este supuesto, solamente bloquea un registro cuando se ha realizado realmente unamodificacin en el mismo notificando a la base de datos mediante Post, por ejemplo. Note que no hemosterminado todava la transaccin. Mientras tanto, el mismo registro puede estar siendo modificado en la memoria

    ird http://infoback.com.ar/buhardilla/firebird/fir

    76 29/06/2012 0

  • 7/23/2019 Firebird Tutorial

    12/55

    interna de varias terminales a la vez.La primera terminal que guarde el registro (post) bloquea los cambios de lasdems. Cmo reaccionarn las aplicaciones que se encuentran con el bloqueo, depende de la configuracin de lascorrespondientes transacciones como veremos a continuacin.

    El parmetro que se indica cmo reaccionar una transaccin al encontrarse un registro bloqueado se denomina nivel debloqueo, y se configura al momento de comenzar la transaccin. Firebird tiene las siguientes opciones:

    Modo en espera (WAIT): si hay un conflicto con otra transaccin (por ejemplo, las dos tratan de modificar elmismo registro y aceptar los cambios), el ltimo proceso queda bloqueado hasta que se termina la primeratransaccin.

    Modo sin espera (NO WAIT): si hay un conflicto con otra transaccin, el proceso recibe un mensaje de errorinmediatamente.

    Cul es la razn de ser del primer modo? Pues que el conflicto puede ser temporal. Supongamos que un usuario (1)empieza una transaccin en la cual agrega un registro con un valor A en la clave primaria. Antes que este usuario haga

    Commit, otro usuario (2) trata de ingresar un registro tambin con el valor A en la clave primaria. Si la segundatransaccin se hace en modo WAIT, el usuario 2 queda bloqueado hasta que el primero termine su transaccin. Si (1)hace Commit, (2) recibe un mensaje de error porque la clave primaria estara duplicada; pero si (1) cancela sutransaccin con Rollback, (2) puede insertar su registro sin problemas. En el caso que la segunda transaccin fuera NOWAIT, el usuario (2) recibe el mensaje de error al momento de querer insertar el registro, aunque luego (1) cancele loscambios.

    Los distintos modos de aislamiento junto con los niveles de bloqueo se configuran mediante parmetros en la llamada ala API interna del servidor que comienza la transaccin. Podemos ver algunos ejemplos en la configuracin de losniveles de aislamiento pre-configurados en los componentes Interbase Express (IBX):

    Snapshot: no se ven los cambios realizados por las otras transacciones, pero se permite el acceso de las mismas a los

    datos que estamos mirando o modificando; igualmente, podemos ver los datos que otra transaccin est trabajando almismo tiempo, aunque vemos la versin que exista al momento de iniciar nuestra transaccin. Parmetros por defecto:concurrency, nowait. Ideal para reportes.

    Read Commited: los cambios realizados por los otros usuarios se ven despus que acepten sus transacciones.Parmetros por defecto: read_commited, rec_version, nowait.

    El parmetro rec_versionhace que slo veamos la ltima versin estable (aceptada) de los registros. La alternativa esno_rec_version, con lo que indicamos al servidor que solamente se puede ver un registro si no hay versionespendientes de aceptacin (ms sobre esto luego, cuando tratemos la arquitectura multigeneracional). En el caso que

    desde otra transaccin se haya modificado un registro pero todava no se haya realizado commit, el servidor no nosdejara modificar el registro.

    Read-Only Table Stability: esta transaccin no puede accedera datos que hayan sido cambiados desde que empez,ni permite a otras transacciones que accedan a los datos que sta haya ledo. Parmetros por defecto: read(slo lectura,en este modo no se pueden modificar los datos), consistency(garantiza que los datos vistos por esta transaccin nocambien, bloqueando los registros para escritura).

    Read-Write Table Stability: igual que la anterior, pero ahora la transaccin bloquea los registros tanto para lectura

    ird http://infoback.com.ar/buhardilla/firebird/fir

    76 29/06/2012 0

  • 7/23/2019 Firebird Tutorial

    13/55

    como para escritura. Parmetros por defecto: write, consistency.

    Los modos ms usados son el Snapshoty el ReadCommitted, ya que permiten el acceso concurrente a los mismosdatos (sin bloqueos innecesarios).

    Por ejemplo supongamos una tabla Mascotas con los siguientes datos:

    Mascotas

    Nombre Categoria Raza Edad Id

    Lul

    Perro

    Caniche

    5

    89

    Tom

    Gato

    Angora

    3

    908

    Pinky

    Ratn

    Estupidis mousiis

    6

    346

    Supongamos que esta base de datos se accede desde dos terminales a la vez, A y B. Veamos algunos casos tpicos (lasacciones se suponen en la secuencia dada). Para el caso no importa si usamos un componente IBTable, IBQuery conIBUpdateSQL o un IBDataset. Indique despus de cada accin qu datos ve cada usuario:

    A inicia una transaccin en modo Snapshot.

    B inicia una transaccin en modo ReadCommitted y lee los datos de la tabla de mascotas.

    A pide el contenido de la tabla Mascotas. Qu obtiene?

    Lo mismo que est arriba

    B modifica la tabla de mascotas, arreglando la edad de Tom que no es 3 sino 4. B hace Commity vuelve aabrir la tabla.

    A ve lo mismo. B ve los datos de Tom modificados

    A actualiza la vista de los datos cerrando y abriendo la tabla pertinente, pero sin salir de su transaccin.

    A: lo mismo (no ve los cambios)

    A modifica la edad de Lul, que no es 5 sino 4. Hace Commity vuelve a abrir la tabla.

    A ve ahora el cambio anterior de B. B todava no ve el cambio de A.

    B cierra y abre la tabla.

    Ahora B puede ver los cambios de A

    B emite la instruccin Sel ect * f r om Mascot as wher e Edad=4

    ird http://infoback.com.ar/buhardilla/firebird/fir

    76 29/06/2012 0

  • 7/23/2019 Firebird Tutorial

    14/55

    B obtiene los datos de Lul y Tom.

    B agrega un registro a la tabla de Mascotas, con los siguientes valores: Paco, Loro, Aptrida, 10, 79. HaceCommit. A actualiza la vista cerrando y abriendo la tabla.

    A no ve los cambios hasta que no cierre su propia transaccin.

    A borra el registro de Tom. Hace Commit.B tiene que cerrar y abrir la tabla para ver los cambios.

    Qu pasa si B modifica el registro que A acaba de borrar?

    Bloqueos pesimistas

    A partir de Firebird 1.5, se puede usar un modo de bloqueo pesimista, indicando explcitamente en la sentenciaSELECT que se desea bloquear los registros resultado de la consulta. Veremos algunos ejemplos cuando estudiemos lasentencia SELECT ms adelante; por ahora simplemente digamos que este agregado se hizo para simplificar lasolucin de algunos problemas. No es la forma recomendada de trabajar con los datos, y tiene adems variasrestricciones. Citando las notas de la versin 1.5:

    "No est disponible en subconsultas, ni para joins. No se puede especificar con el operador DISTINCT, la clusulaGROUP BY o cualquier otra operacin de agregacin de registros. No puede utilizarse con o en una vista, ni con tablasexternas, ni con los resultados de un procedimiento almacenado llamado desde un SELECT."

    Mantener el contexto

    Una caracterstica que a veces es molesta: cuando cerramos una transaccin ya sea con Commito con Rollback, secierran todos los controles de datos asociados a la misma. Firebird libera los recursos de la transaccin, por lo que loscomponentes de datos se desconectan. Hay que volver a abrir uno por uno todos los componentes de acceso a datos quetrabajen con esa transaccin.

    Para evitar el tener que abrir nuevamente todo, podemos indicar a Interbase que termine la transaccin pero quemantenga los recursos internos -el contextode la transaccin. De esta manera mantenemos los componentes conectadosaunque aceptamos o cancelamos la transaccin. Las operaciones se denominan CommitRetainingyRollbackRetaining.

    Hay un problema con esta manera de proceder: mientras no cerremos totalmente la transaccin, se evita que elRecolector de Basurade Interbase trabaje. El accionar del servidor se vuelve ms lento por la proliferacin deversiones la mayora ya obsoletas- de registros. Esto no debera ser un problema a menos que la aplicacin se

    mantenga funcionando de esa manera durante horas, das, tal vez semanas... en cuyo caso podemos acomodar las cosashaciendo una copia de seguridad (backup) seguida de una restauracin sobre la misma base (restore). Cuando se haceun Backup se eliminan los datos temporales (la basura) y al recuperar la Base de Datos sta queda limpia de polvo ypaja.

    Integridad referencial

    ird http://infoback.com.ar/buhardilla/firebird/fir

    76 29/06/2012 0

  • 7/23/2019 Firebird Tutorial

    15/55

    La integridad referencial se refiere al estado de las referencias entre tablas. Es importante que las referencias semantengan, para asegurar que los datos se puedan acceder correctamente. Por ejemplo, si tenemos en una tabla losdatos de una factura, y en otra el detalle de los productos pedidos. En la tabla de detalle seguramente tendremossolamente una referenciaa la factura si hemos normalizado la base de datos. El valor del campo de referencia (porejemplo, el Nro de factura) se debe corresponder al valor de algn campo clave en la tabla de facturas, con lo cualpodemos recuperar el resto de los datos. Ahora pensemos qu sucedera si se modifica el valor del campo de enlace encualquiera de las puntas de la relacin.

    Si modificamos el nro de factura en la tabla de detalle, estaremos referenciando a otra factura: esto puede estar

    bien, de hecho es la nica manera de corregir un error en la asignacin.

    Si modificamos el nro. de factura en la tabla de facturas, pues eso s puede representar un problema, ya quetodos los registros de detalle quedaran hurfanos, sin que sepamos a qu factura corresponden. Esto no sepuede permitir, ya que no tendremos forma de restaurar la relacin.

    Las comprobaciones que impidan estos problemas y mantengan la integridad referencial se pueden llevar a cabo en elcliente o en el servidor; hablaremos ahora de esta ltima opcin.

    Firebird implementa la restriccin denominada clave externaen forma declarativa: se crea la restriccin como unapropiedad ms de una tabla, y el servidor se encargar de hacerla cumplir cuando sea necesario. En contraste, podemoshacer un control activo escribiendo triggers que controlen explcitamente las referencias.

    Las restricciones de clave externa (foreign key) se declaran en la tabla detallede la relacin, en la tabla que referenciaa la maestra. En nuestro ejemplo, la tabla de facturas sera la maestra, y la de detalles

    Para declarar una restriccin de clave externa necesitamos lo siguiente:

    Un campo o conjunto de campos del mismo tipo en las dos tablas. Los valores de estos campos en la tabla detallereferenciarn los valores de los campos correspondientes en la tabla maestra (el nro. de factura del detalle, ennuestro ejemplo)

    Una restriccin de unicidad sobre los campos de la relacin en la tabla maestra. Puede ser una clave primaria o unarestriccin UNIQUE; cualquiera de las dos posibilidades implica que los campos de la relacin deben serdeclarados como no null(no nulables).

    NO es necesario un ndice sobre los campos de la tabla detalle; s es conveniente para acelerar las operaciones deseleccin de datos sobre las dos tablas, por lo que Firebird crea un ndice automticamente sobre estos campos.

    Firebird permite especificar la accin a tomar cuando se intenta violar la integridad referencial (por ejemplo cuandoborramos un cliente que est referenciado en una factura), tanto para las operaciones de borrado como de actualizacin.Las opciones son (los nombres son parte de la sintaxis de la instruccin SQL de declaracin):

    No action: la operacin se rechaza de plano.

    Cascade: la accin se realiza tambin en los registros referenciados, automticamente. Por ejemplo si

    cambiamos el nro. de un cliente y ste tiene hechas dos facturas, en las dos facturas se actualizar el nro. decliente para que la referencia siga siendo vlida. Si borramos el cliente, se borrarn las facturas que loreferencian sin ningn avisopor parte del servidor, as que cuidado!

    Null: el campo de la tabla maestraen el que se referencia al dato modificado o borrado toma el valor NULL, esdecir, pierde la referencia.

    Default: el campo de la tabla maestraen el que se referencia al dato modificado o borrado toma el valor pordefecto declarado para ese campo.

    Las ms usadas son las dos primeras. Firebird incluso nos permite indicar una accin para un caso y otra para el

    ird http://infoback.com.ar/buhardilla/firebird/fir

    76 29/06/2012 0

  • 7/23/2019 Firebird Tutorial

    16/55

    restante, por ejemplo una combinacin muy usada es NoActionen borrados, Cascadeen modificaciones. El servidorentonces mantendr las referencias aunque cambiemos el campo en la tabla de detalle, mientras que impedir queeliminemos registros de detalle que estn siendo referenciados.

    Esta forma de mantener la integridad referencial es muy prctica y valiosa, aunque a veces lleva a un comportamientono ptimo en el que las operaciones llevan ms tiempo del necesario. Esto es debido a la selectividad de los ndices,tema que trataremos ms adelante. En esos casos en que el comportamiento no sea el adecuado, tendremos que recurrira una verificacin activa de las relaciones usando triggers. Lo veremos tambin ms adelante.

    En la prctica, las restricciones de integridad referencial se aplican generalmente cuando se va a poner en produccin elsistema, no antes. Por qu? Pues porque el servidor no nos dejar modificar la estructura de una tabla que forme partede una restriccin de integridad referencial, y es muy comn que la estructura vare en el perodo de diseo yprogramacin del sistema. As, se crean todas las tablas y dems objetos, se trabaja con esta base de datos, y finalmentese agregan las restricciones para que no haya sorpresas. Es muy fcil generar un archivo script con las instruccionesSQL necesarias para declarar las restricciones a posterioride la creacin de las tablas. No obstante, hay que tener encuenta que las restricciones se comprueban en el momento de su declaracin esto es, si tenemos datos que no cumplancon las restricciones no se podrn crear estas ltimas.

    ird http://infoback.com.ar/buhardilla/firebird/fir

    76 29/06/2012 0

  • 7/23/2019 Firebird Tutorial

    17/55

    La instalacin y puesta en marcha de Firebird es muy simple. Se incluye un programa instalador al estilo expertoquenos guiar paso a paso en la instalacin; slo tendremos que seleccionar qu partes instalar y adnde.

    A continuacin veremos el proceso completo desde la descarga de los archivos de Internet, la instalacin paso por paso

    y daremos un primer saludo a las herramientas que se incluyen con el paquete.

    Descarga desde Internet

    Firebird es de cdigo abierto, y como tal se lo puede encontrar en Internet para su descarga libre y gratuita. Noobstante, es un motivo comn de confusin la existencia de distintas versiones, tanto de Firebird como de Interbase.Aqu tratar de aclarar el lo.

    Se puede descargar el cdigo fuente de FB/IB, en cuyo caso ser necesario compilarlo, o bien el paquete de instalacinya compilado lo que denominaremosformato binario. El proceso de compilacin de los fuentes quedar para otros

    escritos; aqu me limitar a hablar del gestor ya compilado.

    El primer sitio donde Interbase estuvo disponible en su version Open Source fue, por supuesto, el de Borland. No hepodido verificar si sigue disponible, por lo que pienso que no.

    Hay otro sitio relacionado con Interbase desde sus inicios: http://mers.com[ERC3]. Es una compaa canadiense quedesarrolla software usando herramientas de Borland. El primer grupo de soporte a usuarios de Firebird estuvolocalizado en sus servidores hasta que el presidente de la compaa, Robert Schiek, fue contratado por Borland dondese desempaa ahora como administrador de la comunidad de Interbase (http://bdn.borland.com/interbase[ERC4]). La lista desoporte ahora funciona en Yahoo! Groups, pero todava hay un ndice de las preguntas y respuestas en Mers, que sepuede consultar con un buscador. En el sitio de la compaa se puede encontrar la versin 6.0.2 de Interbase Open, paraWindows y Linux.

    Y llegamos a Firebird. El proyecto comenz apenas una semana despus de la liberacin de Interbase, en SourceForge(http://sourceforge.net/projects/firebird) [ERC5]-donde todava se lo puede encontrar. El sitio oficial es ahorahttp://www.firebirdsql.org[ERC6], un sitio derivado de IBPhoenix (http://www.ibphoenix.com[ERC7]), de donde se pueden obtener lasdistintas versiones de Firebird as como herramientas, artculos, etc. La versin actual (estable) es la 1.0.2.908 [ERC8], yse puede descargar tambin una versin 1.5 Alpha (no para produccin, inestable y sin garantas). Se espera que prontose ponga en marcha la versin beta de Firebird 1.5.

    Entonces, hagamos un resumen:

    Versin URL para descarga

    Interbase 6.0.2 http://mers.com

    Firebird 1.0.3 http://www.firebirdsql.org

    Firebird 1.5.1 http://www.firebirdsql.org

    La instalacin es muy sencilla cuando todo funciona :-P. en Windows, corremos el archivo ejecutable; en Linux,instalamos el paquete rpm o bien ejecutamos el script si descargamos la version no compilada. Las opciones sonmnimas y se reducen a seleccionar los componentes a instalar. Cuando hay algun problema, bueno habr queempezar a preguntar. El mejor lugar para encontrar respuestas es el foro de soporte firebird-support enyahoogroups.com.

    ird http://infoback.com.ar/buhardilla/firebird/fir

    76 29/06/2012 0

  • 7/23/2019 Firebird Tutorial

    18/55

    Probar la instalacin

    ISQL

    Con la distribucin estndar de Firebird se incluye una utilidad para ejecutar sentencias SQL contra el servidor, ymostrar sus resultados. Esta utilidad es de lnea de comandos y se encuentra en el archivo isql.exe.

    Se puede usar isql para probar la instalacin del servidor de la siguiente manera:

    Abra una ventana de terminal en la carpeta bin de la distribucin de Firebird

    Ejecute el programa escribiendo i sql

    Isql responder con un indicador (prompt) especial 'SQL>' como se ve en la siguiente imagen:

    Escriba

    Connect " l ocal host : c: \ archi vos de pr ogr ama\ f i r ebi r d\ exampl es\ empl oyee. gdb" user"sysdba" password "mast erkey" ;

    para conectar con la base de datos de ejemplo. Note que puede cortar la sentencia en dos o ms lneassimplemente presionando ; isql indicar que una lnea contina una sentencia anterior cambiando elindicador (prompt) por 'CON>'.Las sentencias se terminan con punto y coma (;).

    Si la conexin se puede establecer, isql responder con un mensaje indicando que est ahora conectado a la basede datos. A partir de ese momento se pueden ejecutar sentencias SQL sobre esa base de datos, o usar algunoscomandos especficos de isql como Show Tables. En la parte de herramientashablaremos ms en profundidadsobre la utilidad isql.

    ird http://infoback.com.ar/buhardilla/firebird/fir

    76 29/06/2012 0

  • 7/23/2019 Firebird Tutorial

    19/55

    Herramientas

    IBServer

    IBGuardian

    ISQL

    Gbak

    IBConsole

    IBConsole es un producto realizado utilizando acceso directo a la API de Interbase (con los componentes IB Express,de los que hablaremos luego), por lo que su rendimiento es muy bueno. Tambin es simple de usar y nos da laposibilidad de realizar las tareas administrativas comunes como ser: creacin y destruccin de bases de datos;

    ird http://infoback.com.ar/buhardilla/firebird/fir

    76 29/06/2012 0

  • 7/23/2019 Firebird Tutorial

    20/55

    administracin de usuarios y permisos; realizacin de backups; verificacin de integridad de la Base de Datos;ejecucin de sentencias y scripts SQL, etc.

    A partir de la versin 1.5 de Firebird esta utilidad no se incluye ms en la distribucin. Se puede encontrar encodecentral.borland.com en sus versiones para Windows y Linux; no obstante, no se recomienda IBConsole comoherramienta de administracin para bases de datos Firebird, en parte porque est compilado con el conjunto decomponentes IBX que no garantizan compatibilidad con las nuevas versiones de Firebird.

    Accederemos a una Base de Datos de ejemplo que se incluye en el paquete (si no instal los ejemplos, hgalo ahora; labase de datos de empleados utiliza tcnicas que vale la pena estudiar). Usaremos la base de datos llamadaEmployee.gdbo su versin internacional (que contiene caracteres no ingleses) llamada Intlemp.gdb. Cualquiera de lasdos sirve para nuestros ejemplos porque lo nico que cambia es el contenido de las tablas, no su definicin.

    Para usar la base de datos, debemos registrarla en IBConsole. Los pasos necesarios son los siguientes:

    registrar el servidor local con la opcin correspondiente delmen Server

    ird http://infoback.com.ar/buhardilla/firebird/fir

    76 29/06/2012 0

  • 7/23/2019 Firebird Tutorial

    21/55

    en el men contextual del rbol de objetos de la izquierda seleccionamos Register

    en el cuadro de dilogo que aparece a continuacin, completamos la informacin de registro de la base de datosy aceptamos. La nueva Base de Datos debera aparecer en el rbol de objetos.

    Hasta ahora lo nico que hemos hecho es crear un aliaspara la Base deDatos; es decir, registrar con IBConsole la ubicacin fsica del archivo ylos datos de conexin, as como un nombre ms descriptivo que el nombredel archivo. Para acceder a los datos debemos conectarnosa la base dedatos. Normalmente en el momento del registro IBConsole conectaautomticamente con la base de datos, como podemos observar en el rbolque se abre y el grfico de la BD tiene una marca verde.

    De aqu en adelante, podemos conectarnos haciendo simplemente dobleClick sobre el nodo en el rbol o seleccionando la opcin pertinente delmen contextual.

    El solo hecho de lograr la conexin ya indica que el servidor est

    funcionando correctamente. Todava se pueden presentar problemas en elacceso a travs de la red, pero nos ocuparemos de eso a su debido tiempo.

    Ejecutar sentencias SQL en IBConsole

    Para ejecutar cualquier sentencia SQL utilizamos la herramienta conocida como Interactive SQL. En IBConsole est

    integrada al producto, y se accede desde el men Tools o el botn . La ventana tiene el siguiente aspecto:

    ird http://infoback.com.ar/buhardilla/firebird/fir

    76 29/06/2012 0

  • 7/23/2019 Firebird Tutorial

    22/55

    Las sentencias SQL se escriben en el editor superior, se ejecutan con CTRL+E o el botn , y el resultado se obtieneinmediatamente en la parte inferior (datos, plan de ejecucin y estadsticas de ejecucin).

    Por ejemplo, la siguiente imagen muestra el resultado de pedir el contenido de la tabla employee:

    IBOConsole

    Esta herramienta es como un clon de IBConsole, pero construida con los componentes IB Objects. Es gratuita y sepuede descargar de , y en general es ms estable que las versiones deIBConsole que he probado. Se maneja de la misma manera, la interfaz es prcticamente igual, y podemos esperar que

    ird http://infoback.com.ar/buhardilla/firebird/fir

    76 29/06/2012 0

  • 7/23/2019 Firebird Tutorial

    23/55

    sea til con las nuevas versiones de Firebird, ya que los componentes IBO soportan todas las caractersticas de estosservidores.

    IB_SQL

    ird http://infoback.com.ar/buhardilla/firebird/fir

    76 29/06/2012 0

  • 7/23/2019 Firebird Tutorial

    24/55

    El lenguaje de consulta

    Tal vez el problema mayor que se presenta a los programadores viejos, los que usaban sistemas de datos orientados aarchivos como Clipper, Dbase o Cobol, sea el de cambiar la forma de acceder a los datos. Lo que antes requerarecorrer toda una tabla buscando coincidencias o armar tablas temporales con datos de distintas tablas relacionadas,ahora se hace con una sola sentencia de un lenguaje especial diseado para eso: el Lenguaje Estructurado de Consulta oSQL.

    Una de las caractersticas que distinguen a este lenguaje es su orientacin a conjuntosde datos. As por ejemplo, enSQL no pedimos recorre todos los registros y cuando encuentres uno cuyo campo Nombre comience con A, me lomuestras; en su lugar, pedimos una tabla temporal formada por todos los registros que cumplan la condicion: elcampo Nombre empieza con A. Lleva un tiempo acostumbrarse a pensar en conjuntos de datos, pero se logra.Trataremos aqu de dar la mayor cantidad posible de ejemplos y ejercicios para que esta forma de pensar se haga casinatural.

    SQL son las iniciales de Structured Query Language o Lenguaje Estructurado de Consulta. Es un lenguaje noprocedural inventado en IBM a principios de los aos 70, para implementar el modelo relacional de Codd. Inicialmentese le llam SEQUEL (Structured English Query Language), luego pas a ser SEQUEL/2 y finalmente SQL (esperemosque no siga la tendencia y en unos aos se termine llamando S). Hoy en da es el lenguaje de consulta ms utilizado porlos gestores de Bases de Datos de todos los tamaos, desde Dbase o Paradox pasando por Oracle, Informix o SQLServer, hasta los gestores de datos utilizados en supercomputadoras.

    Hay definidos tres estndares oficiales por el Instituto Nacional de Estndares Americano (American NationalStandards Institute, ANSI): SQL-86, SQL-89 y SQL-92.

    La mayora de los gestores de consultas implementan a su manera las recomendaciones del estndar. Estudiaremoslos comandos ms comunes, que se aplican a los motores de consulta ms utilizados, y cuando sea pertinente

    comentaremos diferencias en distintos servidores.A continuacin veremos en detalle el lenguaje SQL que implementa Firebird. Los ejemplos utilizan la base de datos deejemplo que viene con el servidor, llamada EMPLOYEE.GDB, y se ejecutan en IBConsole o IBOConsole.

    Cursores vs conjuntos

    Los gestores de datos tipo Dbase o Paradox trabajaban con el concepto de cursor; el lenguaje SQL trabaja conconjuntos.

    Los cursoresse pueden ver como una cinta sobre la que se encuentran los registros, con un sealador que se mueveadelante y atrs para marcar el registro activo o actual. Las operaciones sobre ms de un registro se realizan recorriendoel cursor con el sealador y actuando sobre los registros a medida que son sealados.

    Veamos dos operaciones tpicas con este modelo:

    Seleccin de un subconjunto de registros, que cumplen un criterio determinado, por ejemplo mostrar los productosde un rubro

    El sealador se posiciona en el primer registro; comprueba si ese registro cumple con el criterio; si lo cumple semuestra, si no se saltea; el sealador pasa al siguiente registro, y repite la comparacin hasta que no hay ms registrosen el cursor.

    ird http://infoback.com.ar/buhardilla/firebird/fir

    76 29/06/2012 0

  • 7/23/2019 Firebird Tutorial

    25/55

    Modificacin de un subconjunto de registros, por ejemplo modificar el precio de todos los productos dedeterminado rubro

    La operatoria es prcticamente la misma, slo que en lugar de mostrar los registros que cumplen el criterio se editan, secambia el precio, y se vuelven a grabar. Hay que tener en cuenta que si el cursor est ordenado por algn ndice, elcambio puede hacer que los registros se reubiquen y el sealador seguir al registro que modific, por lo que puede ira parar al final del cursor, o recomenzar al principio! En el ejemplo de los precios, seguramente el orden ser por rubropor lo que la modificacin de precios no afectar la posicin de los registros.

    Un servidor SQL como Firebird, en cambio, trabajar sobre conjuntos de registros en una sola operacin. As, lasmismas operaciones del ejemplo anterior se haran mucho ms simples:

    Seleccin de un subconjunto de registros que cumplen determinado criterio

    Simplemente se emite una sentencia SELECT y el servidor generar un cursor compuesto solamente con los registrosque cumplen el criterio. Para mostrar estos registros se hace el mismo bucle anterior, pero solamente se recorren losregistros que cumplen el criterio.

    Modificacin de un subconjunto de registros que cumplen un criterio

    Se emite una sentencia UPDATE que incluye la operacin a realizar y el criterio de seleccin, y el servidor modificarel subconjunto que cumpla el criterio sin ms intervencin nuestra.

    Seleccin de registros: SELECT

    La sentencia estrellade SQL es, sin ninguna duda, SELECT. Esta instruccin permite obtener datos de una o variastablas, con un poder y flexibilidad increbles. Si SQL no tuviera ms que esta instruccin, igualmente valdra la penaaprenderlo.

    La sintaxis bsica de SELECT es como sigue[6]

    :

    SELECT col umnas | *

    FROM t abl as

    [ WHERE condi ci n]

    [ ORDER BY col umnas]

    ird http://infoback.com.ar/buhardilla/firebird/fir

    76 29/06/2012 0

  • 7/23/2019 Firebird Tutorial

    26/55

    Hay muchas variaciones y agregados sobre este esqueleto bsico, pero todo a su tiempo.

    En palabras, esta instruccin devolver una tabla virtual compuesta por las columnas especificadas (el asterisco * sereemplaza por todas las columnas de todas las tablas), con las filas de las tablas dadas que cumplan la condicin(opcional), y todo ordenado por las columnas indicadas (opcional).

    Por ejemplo, para obtener los nombres de los empleados podemos escribir:

    SELECT FI RST_NAME

    FROM EMPLOYEE

    Y veremos en la ventana de ISQL:

    La sentencia SQL desaparece del editor, que queda listo para escribir otra; pero puede recuperarse con el botno la opcin de men Query|Previous.

    Algunas preguntas comunes a esta altura:

    Importa si las instrucciones se escriben en maysculas o minsculas?

    No. Para el servidor es lo mismo SELECT que select. En la parte que shay que tener cuidado es en losnombres de campos y tablas, ya que hay dialectos SQL que distinguen entre maysculas y minsculas. EnFirebird, con el dialecto 1 de SQL no hay diferencias; con dialecto 3, las hay nicamente cuando se usan losnombres entre comillas dobles ().

    En qu orden se recuperan los registros si no especificamos una clusula ORDER BY?

    En orden natural, lo que significa que no podemos asegurar nada. El motor de consultas obtiene los datos enel orden que sea ms eficiente.

    Es posible indicar algn formato en el resultado, por ejemplo el ancho de las columnas?

    No. El lenguaje SQL es un lenguaje de consulta, no considera la parte de presentacin de los resultados.

    Se pueden usar espacios en los nombres de campos y tablas?

    Depende del servidor. En Interbase, nicamente podemos usar espacios con Dialecto 3 y si encerramos el

    ird http://infoback.com.ar/buhardilla/firebird/fir

    76 29/06/2012 0

  • 7/23/2019 Firebird Tutorial

    27/55

    nombre entre comillas dobles. Los servidores actuales tienden a ser consecuentes con esta norma: si est entrecomillas, puede contener cualquier caracter. No obstante, recomendamos noutilizar caracteres especiales niespacios debido a los potenciales problemas con los diferentes conjuntos de caracteres. En general sereemplazan los espacios por el caracter de subrayado (underscore, _) como en el campo FIRST_NAME usadoen el ejemplo.

    Vamos a extender la tabla de resultados para que muestre otras columnas: el apellido (last_name) y el pas de trabajo(job_country). La sentencia queda como sigue

    SELECTFIRST_NAME, LAST_NAME, JOB_COUNTRY

    FROMEMPLOYEE

    Cmo hara para que aparezca primero el apellido y despus el nombre?

    Cuando queremos todaslas columnas de la tabla en el resultado, en el mismo orden que estn definidas, podemos usarel comodn* (asterisco):

    SELECT*

    FROMEMPLOYEE

    Notemos en el resultado de esta sentencia que hay una columna la ltima- que combina el contenido de los camposFirst_Name y Last_Name para mostrar el nombre completo. En el caso de esta tabla, este campo est definido as,como un campo calculadopor el servidor. Nosotros podemos lograr el mismo efecto usando operadorespara construircampos nuevos, no existentes en la tabla original.

    Por ejemplo, vamos a mostrar una columna con el Nro. de empleado (emp_no), un guin, el nombre y el apellido:

    SELECTemp_no || ' ' || first_name || ' ' || last_name

    FROMemployee

    ird http://infoback.com.ar/buhardilla/firebird/fir

    76 29/06/2012 0

  • 7/23/2019 Firebird Tutorial

    28/55

    ird http://infoback.com.ar/buhardilla/firebird/fir

    76 29/06/2012 0

  • 7/23/2019 Firebird Tutorial

    29/55

    Hemos utilizado aqu el operador de concatenacin|| (dos barras verticales), que permite juntar cadenas decaracteres. El resultado es otra cadena. Notemos que podemos usar tanto nombres de campos como cadenas constantes,con comillas simples.

    Un problema comn cuando se utilizan columnas formadas por expresiones es el nombrede estas columnas. Porejemplo, la columna generada en el ejemplo anterior se llama F_1. Quin puso este nombre? El servidor. Es posiblecambiarlo? Si, asignando un aliasal campo por medio de la partcula as:

    SELECT emp_no | | ' - ' | | f i rst _name | | ' ' | | l ast_nameAS Empl eadoFROM empl oyee

    Si ejecutan esta sentencia, vern el mismo resultado que antes pero ahora la columna se llama Empleado, lo cual esmucho ms fcil de recordar.

    Antes de continuar sumergindonos en las complejidades de SELECT, realice los siguientes ejercicios para afirmar loanterior.

    Ejercicios

    1) Obtenga los siguientes datos (y en este orden) de los empleados: Nombre, Apellido, Nro. de empleado, salarioy pas de trabajo.

    2) Ahora muestre tres columnas llamadas Apellido, Nombre, Salario. En la primera muestre el apellido, en lasegunda el nombre, y en la tercera la informacin siguiente (los ngulos indican que es el nombre de uncampo):

    , nivel (U$S )

    3) De la tabla de proyectos: una columna llamada Proyecto con el siguiente formato

    ()

    otra columna con el tipo de producto (product), y una tercera con el Nro. de empleado del lder del proyecto(team_leader)

    Orden en la sala

    El orden en que el servidor devuelve los datos depende de varios factores; en general, no se puede asumir un ordendeterminado por lo que hay que indicarlo explcitamente usando la clusula ORDER BY.

    La clusula ORDER BY es muy simple de usar: es seguida por una lista de campos (que deben figurar en la lista decolumnas a mostrar) por los que se ordenar.

    Por ejemplo, para obtener datos de los empleados ordenados por pas de trabajo, podemos hacer

    SELECT*

    FROMemployee

    ORDERBYjob_country

    Como podrn ver, hay muchos empleados que trabajan en cada pas, que no guardan entre s un orden predecible. As,si tenemos que buscar un empleado por nombre en el listado anterior suponiendo que sabemos en qu pas trabaja,

    ird http://infoback.com.ar/buhardilla/firebird/fir

    76 29/06/2012 0

  • 7/23/2019 Firebird Tutorial

    30/55

    tendramos que recorrer todos los empleados de ese pas hasta encontrar el que buscamos.

    Para simplificar la bsqueda, podemos indicar al servidor que queremos los resultados ordenados, si, por pas; pero mstodava, el conjunto de empleados de cada pas lo queremos ordenado por apellido y nombre. Pruebe la siguientesentencia:

    SELECT*

    FROMemployee

    ORDER BYjob_country, last_name, first_name

    Ya se comienza a notar la potencia del lenguaje. Esta instruccin nos devuelve una tabla con todos los empleadosorganizados por pas, dentro de cada pas por apellido, y si hay apellidos repetidos, se ordenan por nombre.

    Una variacin posible es el sentidode la ordenacin: si es ascendente o descendente. Por defecto Firebird devuelve losdatos ordenados en forma ascendente; para indicar lo contrario agregamos la partcula desc despus del nombre delcampo de ordenacin. Por ejemplo,

    SELECT*

    FROMemployee

    ORDER BYjob_country desc

    Nos devolver los empleados ordenados en forma descendente por pas de trabajo.

    Este modificador es vlido slo para la columna a la cual sigue; cada una de las columnas de ordenamiento debe tenersu indicador de direccin o se tomar el ascendente por defecto. Tambin se puede explicitar el orden ascendenteusando asc.

    SELECT*FROMemployee

    ORDER BYjob_country desc, last_name asc, first_name desc

    Devolver un conjunto ordenado por pas en forma descendente, dentro de cada pas los empleados se ordenarn porapellido en forma ascendente, y si hay apellidos repetidos, se ordenarn por nombre en forma descendente.

    NOTA: como veremos en los ejemplos siguientes, la clusula ORDER BY siempre se coloca al finalde la instruccin,despus de todas las dems clusulas optativas.

    Filtrados y bsquedas

    Todos los ejemplos que hemos hecho hasta ahora devuelven el total de los registros de la tabla en cuestin. Como sehabrn imaginado, el lenguaje SQL tiene una clusula que sirve para reducir el conjunto de registros resultado a unsubconjunto que cumpla con ciertas condiciones. Para hacer uso de esta opcin solamente tenemos que agregar a lasentencia SELECTFROM la clusula WHERE .

    La condicin debe ser una expresinque devuelva un valor booleano: aquellos registros para los cuales la expresin seevale a Verdadero aparecern en el conjunto resultado, el resto no.

    Por ejemplo, si queremos un listado de los empleados que trabajan en Canada solamente, haramos

    ird http://infoback.com.ar/buhardilla/firebird/fir

    76 29/06/2012 0

  • 7/23/2019 Firebird Tutorial

    31/55

    SELECT*

    FROMemployee

    WHEREjob_country = 'Canada'

    Podemos ordenar el resultado agregando al finalla clusula order by:

    SELECT*

    FROMemployee

    WHEREjob_country = 'Canada'

    ORDER BYlast_name, first_name

    Esta instruccin nos permitir encontrar rpidamente un empleado de Canad. Pero podemos tambin usar losoperadores lgicos para afinar la bsqueda; por ejemplo, si queremos ver los empleados de Canada de categora 4,haramos

    SELECT*

    FROMemployee

    WHERE(job_country = 'Canada') AND(job_grade = 4)

    Notemos que el 4 no est rodeado de comillas; es un nmero, no una cadena. Los parntesis no son necesarios en esteejemplo, pero pueden servir para aclarar el orden de evaluacin.

    El orden de evaluacinpuede determinar el resultado de una expresin: por ejemplo, no es lo mismo evaluar 1+2*3 de

    izquierda a derecha (1+2=3, 3*3=9) que asociando por precedencia como hacemos en matematicas: 1+(2*3) = 7. Lasiguiente tabla indica el orden de precedencia de los operadores en Firebird. Algn servidor puede diferir con esteorden, pero en general todos lo consideran de la misma manera. La precedencia va de mayor a menor, ledos de arribahacia abajo (por ejemplo, se evala primero una concatenacin que una multiplicacin; pero esta ltima se evala antesque una suma).

    Tipo Operador Comentario

    Cadenas | | Concatenacin

    Matemticos *

    /

    +

    -

    Multiplicacin

    Divisin

    Suma

    Resta

    Comparacin =, ==

    , [ERC9] ! =,~=, =

    >

    =

    Igualdad

    Desigualdad

    Mayor

    Menor

    Mayor o igual

    ird http://infoback.com.ar/buhardilla/firebird/fir

    76 29/06/2012 0

  • 7/23/2019 Firebird Tutorial

    32/55

    Tipo Operador Comentario

    , ~>, >

    !

  • 7/23/2019 Firebird Tutorial

    33/55

    PM, esto es, 23:59:59.5964 PM.

    TIMESTAMP: almacena fecha y hora, como dos nmeros enteros de 32 bits; la parte de fecha es igual al tipo DATE,la parte de hora igual a un campo de tipo TIME

    Entonces, cmo podemos usar fechas en criterios de seleccin? Ciertamente, no calculando la cantidad de daspasados desde el da cero, 17 de Noviembre de 1858. Firebird puede convertir un tipo de dato en otro, yparticularmente con las fechas hace la conversin automticamente si el formato del texto con la fecha coincide con

    alguno de los reconocidos:CCYY- MM- DD

    MM- DD- CCYY MM- DD- YYMMM- DD- CCYY MMM- DD- YYDD- MMM- CCYY DD- MMM- YYCCYY- MM- DD HH: Mi n: SS: nnnn

    MM- DD- CCYY HH: Mi n: SS: nnnn MM- DD- YY HH: Mi n: SS: nnnnMMM- DD- CCYY HH: Mi n: SS: nnnn MMM- DD- YY HH: Mi n: SS: nnnnDD- MMM- CCYY HH: Mi n: SS: nnnn DD- MMM- YY HH: Mi n: SS: nnnn

    donde

    CC= sigloYY= aoMM= mesDD= daHH= horaMi n= minutosSS= segundosnnnn= milisegundos

    El separador de las fechas puede ser '-', '/ ' o '. '. Para las fechas se puede usar el formato americano (MM/ DD) o eleuropeo (DD. MM), reconocindose por el separador: el punto para el formato europeo, cualquier otro para el americano.

    Por ejemplo, para ver todos los empleados contratados en 1990 podemos escribir:

    SELECT*

    FROMemployee

    WHERE(hire_date >= '1990-01-01')

    AND(hire_date < '1991-01-01')

    Se definen en Firebird algunas literales que son reemplazadas por los valores que representan en el momento de laevaluacin:

    NOW: fecha y hora actuales

    TODAY: fecha actual

    YESTERDAY: fecha de ayer

    TOMORROW: fecha de maana

    Estas literales se utilizan encerradas entre comillas simples, como en el siguiente ejemplo:

    ird http://infoback.com.ar/buhardilla/firebird/fir

    76 29/06/2012 0

  • 7/23/2019 Firebird Tutorial

    34/55

    SELECT*

    FROMemployee

    WHEREhire_date < 'TODAY'

    Que nos devolver todos los empleados contratados antes del da de hoy.

    Asimismo, cuando trabajamos en Dialecto 3 podemos usar las funciones current_date, current_time y current_datetime

    (sin comillas) para referirnos a la fecha y hora actuales en los tres formatos: DATE, TIME y TIMESTAMPrespectivamente.

    Podemos tener una idea del tratamiento que da Firebird a las fechas creando una tabla con un campo de cada tipo, yprobando los distintos valores. Las instrucciones de creacin e insercin no han sido explicadas an, pero consideroimportante el ejemplo en este momento.

    Vamos a crear una tabla llamada Prueba, con los siguientes campos:

    Campo Tipo de dato

    Clave Integer

    Hora Time

    Fecha Date

    Todo Timestamp

    La sentencia SQL necesaria aparece en el cuadro de la derecha. No nos preocupemos por ahora de esta sentencia; lonico que tenemos que saber es que crear la tabla deseada. Ahora emitimos los siguientes comandos, uno por vez, parallenar la tabla con datos:

    INSERT INTOprueba VALUES(1,'09:00','TODAY','NOW')

    INSERT INTOprueba VALUES(2,'10:00','YESTERDAY','yesterday')

    INSERT INTOprueba VALUES(3,'11:00','tomorrow','time')

    INSERT INTOprueba VALUES(4,'12:00',current_date,'now')

    INSERT INTOprueba VALUES(5,'13:00','2002-05-24','now')

    INSERT INTOprueba VALUES(5,'13:00','2002-05-24','2002-05-24 12:35')

    Si ahora pedimos los datos introducidos, con un SELECT comn

    SELECT *

    FROM prueba

    veremos cmo interpret Firebird cada uno de los literales y funciones usados, en cada tipo de campo. Tambinpodemos probar otras combinaciones para ganar un entendimiento mayor de las expresiones que son vlidas y las queno.

    Ejercicios

    En la base de datos donde cre la tabla Pruebas anterior:

    ird http://infoback.com.ar/buhardilla/firebird/fir

    76 29/06/2012 0

  • 7/23/2019 Firebird Tutorial

    35/55

    1) devuelva los registros donde es menor que hoy

    2) devuelva los registros donde es menor que el momento actual

    3) devuelva los registros donde sea igual a la fecha de ayer

    4) devuelva los registros donde es menor que las 12 del medioda, ordenados por fecha

    Criterios de seleccin

    Hay una serie de funciones que se pueden usar en las expresiones de criterios de seleccin. Como de costumbre, estasfunciones dependen del servidor de bases de datos, y veremos aqu en detalle las de Firebird.

    LIKE : comparacin de cadenas con comodines. Es similar al operador de igualdad (=)

    pero solamente puede usarse con cadenas y permite el uso del comodn % para indicar cualquier carcter (ceroo ms) y _ para reemplazar un solo carcter que sin embargo debe existir. Se distingue entre maysculas yminsculas.

    Por ejemplo, la siguiente sentencia devolver todos los empleados cuyo nombre empieza con A (mayscula):

    SELECT *FROM empl oyeeWHERE f i r st _name LIKE ' A%'

    Mientras que la siguiente sentencia devolver todos los empleados que contengan una a minscula en cualquierposicin de su apellido:

    SELECT *FROM empl oyeeWHERE l ast _name LIKE ' %a%'

    Pruebe a cambiar la a de la condicin por una A.

    STARTING WITH : devuelve TRUE si la cadena comparada comienza con el valorpasado. Es equivalente a LIKE ; pero el optimizador de consultas puede usar un ndice (si existe) conSTARTING WITH, mientras que con LIKE no.

    Como ejemplo, veamos el mismo ejemplo que antes: los empleados cuyo nombre comienza con A:

    SELECT *FROM empl oyeeWHERE f i r st _name STARTINGWITH ' A'

    CONTAINING : devuelve TRUE si la cadena comparada contiene el valor dado. Esequivalente a LIKE , pero tiene la ventaja de poder usarse con campos BLOB.

    Como ejemplo, veamos el mismo ejemplo que antes: los empleados cuyo apellido contiene una a:

    ird http://infoback.com.ar/buhardilla/firebird/fir

    76 29/06/2012 0

  • 7/23/2019 Firebird Tutorial

    36/55

    SELECT *FROM empl oyeeWHERE l ast _name CONTAINING ' a'

    Tambin existe la versin negada, es decir que devuelve TRUE cuando el valor NO contiene la cadena:

    SELECT *FROM empl oyeeWHERE l ast _nameNOT CONTAINING ' a'

    BETWEEN AND : devuelve TRUE cuando el valorcomparado (que puede ser de cualquier tipo salvo BLOB) se encuentra entre y ,ambos inclusive. Estos lmites deben ser del mismo tipo que el valor a comparar.

    Por ejemplo, la siguiente sentencia devolver los datos de los empleados que cobran entre U$S 50.000 y U$S 72.000:

    SELECT *

    FROM empl oyeeWHERE sal ar y BETWEEN 50000AND 72000

    La siguiente instruccin traer los empleados contratados en 1990 (equivalente a la que vimos en un ejemplo anterior):

    SELECT *FROM empl oyeeWHERE hi r e_dat e BETWEEN ' 1990- 01- 01' AND ' 1990- 12- 31'

    Y la siguiente recuperar todos los empleados cuyo nombre empiece con A, B o C:

    SELECT *FROM empl oyeeWHERE f i r st _name BETWEEN ' A' AND ' Cz'

    Notemos el uso de Cz para el lmite superior; cualquier cadena que empiece con C y siga con un carcter comnser menor o igual que esta cadena, por lo que entran en la seleccin todos los apellidos comenzados en C.

    La versin negada devuelve TRUE cuando el valor no est en el rango dado:

    SELECT *FROM empl oyeeWHERE hi r e_dat eNOT BETWEEN ' 1990- 01- 01' AND ' 1990- 12- 31'

    Devolver los empleados que no fueron contratados en 1990.

    IN : devuelve TRUE si el valor existe en el conjunto dado. El conjunto puede serespecificado por extensin, como una lista de valores separados por comas y encerrados entre parntesis, o comouna subconsulta que devuelva un solo campo del tipo correcto.

    ird http://infoback.com.ar/buhardilla/firebird/fir

    76 29/06/2012 0

  • 7/23/2019 Firebird Tutorial

    37/55

    Por ejemplo, para ver aquellos empleados de USA, Canada y Alemania (Germany) podemos hacer:

    SELECT *FROM empl oyeeWHERE j ob_count r y IN ( ' USA' , ' Canada' , ' Ger many' )

    Mientras que para ver los empleados que son lderes de algn proyecto podramos hacer:

    SELECT *FROM empl oyeeWHERE emp_no IN ( SELECT t eam_l eader FROM pr oj ect)

    La consulta interior, encerrada entre parntesis, se denomina subconsultay es una poderosa posibilidad de SQL en laque ahondaremos en breve.

    Tambin existe la versin negada, como se habrn imaginado:

    SELECT *FROM empl oyeeWHERE emp_noNOT IN ( SELECT t eam_l eader FROM pr oj ect)

    Devuelve los empleados que no son lderes de proyectos.

    IS NULL: devuelve TRUE si el valor es nulo; tambin puede usarse la forma IS NOT

    NULL, que devolver TRUE en el caso contrario. Estas instrucciones fueron creadas especialmente para lidiarcon los valores nulos, y generalmente no equivalen a comparar simplemente un campo con el valor NULLaunque tambin depende del servidor. Veamos un par de ejemplos:

    SELECT *FROM empl oyeeWHERE phone_ext IS NULL

    Devuelve los empleados cuya extensin de telfono es desconocida. Pruebe a ejecutar la siguiente sentencia, queparece ser equivalente:

    SELECT *FROM empl oyeeWHERE phone_ext =NULL

    Este comportamiento es parte de las extravaganciasde los nulos, de las que hablaremos muchas veces.

    Si queremos ver los que s tienen almacenada una extensin, haremos

    SELECT *FROM empl oyeeWHERE phone_ext IS NOT NULL

    ird http://infoback.com.ar/buhardilla/firebird/fir

    76 29/06/2012 0

  • 7/23/2019 Firebird Tutorial

    38/55

    (1.5) CASE

    A partir de la versin 1.5 de Firebird, se puede generar una consulta condicionalcuyas columnas tomarn valor en baseal resultado de la evaluacin de una expresin. La sintaxis es la siguiente:

    Se pueden clasificar las sentencias CASE en dos formas:

    1) simple: se define la expresin despus de la palabra CASE y los distintos valores se asignan en base a los distintosresultados de la evaluacin de esta expresin

    CASE < expr esi on val or >

    . . .