Categoría:Informix

De ChuWiki
Saltar a: navegación, buscar

Contenido

Selección que usa otra Instancia/BD diferente a la actual

La sintaxis para referenciar tablas de BBDD externas es de la forma: bd@instancia:tabla Como en el ejemplo siguiente:

   SELECT COUNT(*)
   FROM
       registro r,
       bdext@instanc:registro r2
   WHERE
       r.id=r2.id
       AND (r.dni <> r2.dni OR r.fechact <> r2.fechact)


Diferencia de registros de la misma tabla en dos entornos diferentes:

   SELECT FIRST 1
       (SELECT COUNT(*) FROM latabla)-(SELECT COUNT(*) FROM mibd@instanc:latabla)
   FROM systables

Sub-consultas utilizando sub-conjuntos

   SELECT
       dni
   FROM
       TABLE( MULTISET (
                           SELECT
                               r.dni, c.nropasapor
                           FROM
                               registro r,
                           OUTER
                               personal c
                           WHERE
                               r.dni IS NOT NULL
                               AND r.dni[10,11] <> '00'
                               AND r.dni=c.dni
       ))
   WHERE
       nropasapor IS NULL


OUTER JOIN

Funciona como el LEFT JOIN pero posee mucho mejor rendimiento que éste sobre todo para cantidades grandes de datos, por lo que se aconseja encarecidamente el uso de OUTERs en lugar de LEFT JOINs.

   SELECT c.customer_num, c.lname, o.order_num,
        order_date, call_dtime
      FROM customer c, OUTER orders o, OUTER cust_calls x
      WHERE c.customer_num = o.customer_num
         AND c.customer_num = x.customer_num
      ORDER BY lname
      INTO TEMP service

Más sobre OUTERs en la web de IBM.

Formateando / Adaptando el resultado de una consulta

Breve resumen de funciones utilísimas para ajustar o convertir los datos según se necesite:

NVL: evitando los valores nulos

La consulta siguiente me devolverá la cadena '//sin especificar//' para los casos en que el valor del campo calle valga NULL. Para el resto de casos devolverá el valor del campo tal cual.

   SELECT
       NVL(calle, 'sin especificar') AS calle
   FROM
       personal


DECODE: devolver valor determinado segun el caso

La siguiente //query// devuelve el nombre del mes a partir de un tipo DATE.

   SELECT
       DECODE( MONTH(p.unafecha),1,"Enero",2,"Febrero",3,"Marzo",4,"Abril",5,"Mayo",6,"Junio",7,"Julio",
                                8,"Agosto",9,"Septiembre",10,"Octubre",11,"Noviembre","Diciembre") as nomes
   FROM
       latabla

Más sobre DECODE en la web de IBM.

CASE: decisiones con lógica más compleja

Existen dos maneras de utilizar CASE. La primera forma:

   SELECT
       cust_name,
       CASE
       WHEN number_of_problems = 0
         THEN 100
       WHEN number_of_problems > 0 AND number_of_problems < 4
         THEN number_of_problems * 500
       WHEN number_of_problems >= 4 and number_of_problems <= 9
         THEN number_of_problems * 400
       ELSE
         (number_of_problems * 300) + 250
       END as cust_problems,
      cust_address
   FROM
       custtab

La segunda forma de usar CASE es como sigue:

   SELECT
       title,
       CASE movie_type
           WHEN 1 THEN 'HORROR'
           WHEN 2 THEN 'COMEDY'
           WHEN 3 THEN 'ROMANCE'
           WHEN 4 THEN 'WESTERN'
           ELSE 'UNCLASSIFIED'
       END,
       our_cost
   FROM
       movie_titles

Más sobre CASE en la web de IBM.

Escribiendo en las tablas

Inserción simple

   INSERT INTO proceso (tipo, descripcion)
   VALUES ('02', 'ESTANDAR TIPO B') ;


Inserción desde otra tabla

   INSERT INTO envios
           (proceso, dni, nropasapor, sexo, lote,   correo, calle, codpostal, fecha, envio, estado)
   SELECT   proceso, dni, nropasapor, sexo, '0001', ,     calle, codpostal, TODAY, 1,     '001'
   FROM
       personal
   WHERE NOT EXISTS(
           SELECT * FROM envios WHERE proceso=personal.proceso AND dni=personal.dni
       )
       AND proceso='P123' AND municipio='2500'


Actualización simple

   UPDATE
       proceso
   SET
       descripcion='CRUCES COMPAÑIA SEGURSO'
   WHERE
       tipo='01' ;


Actualización de valores desde otras tablas

Desde una tabla solo:

   UPDATE
       registro
   SET
       (registro.fechact, registro.fechacrea) = (
           (   SELECT fechact, fechacrea
               FROM bdext@instanc:registro
               WHERE id=registro.id
           )
       )


Desde varias tablas:

   UPDATE
       registro
   SET
       registro.dni = (SELECT dni FROM tabla1 WHERE id=registro.id),
       registro.fechact = (SELECT fechact FROM otra WHERE id=registro.id)
   WHERE
       registro.dni IS NULL


Modificar Estructura / Campos de una Tabla

Agregar una nueva columna a una tabla

   ALTER TABLE envios
       ADD fecha DATE DEFAULT TODAY NOT NULL ;

Para insertar la nueva columna en una posición u orden determinado antes de un campo ya existente usar BEFORE :

   ALTER TABLE items
      ADD (item_weight DECIMAL(6,2) NOT NULL BEFORE total_price)

Modificar un campo existente

   ALTER TABLE apartados
       MODIFY ( nombre VARCHAR(100) NOT NULL ) ;

Eliminar un campo de una tabla

   ALTER TABLE latabla DROP fecha ;


Renombrar una tabla

   RENAME TABLE nombreant TO nuevonom ;


Renombrar un campo

   RENAME COLUMN latabla.campoant TO camponuevo ;


Copias de seguridad (solo desde DB–Access)

Descargar el contenido de una tabla a un fichero de texto:

   UNLOAD TO personal.txt SELECT * FROM personal ;

Restaurar el contenido de una tabla desde un fichero de texto con LOAD :

   LOAD FROM personal.txt INSERT INTO personal ;


BLOBs

Volcar el contenido de un campo BLOB a un fichero físico en disco:

   SELECT LOTOFILE (documento, 'c:\tmp\00137100', 'client')
   FROM nw_repositorio
   WHERE cddni= '00137100'

Para copiar valores/ficheros LOB de un campo a otro se usa LOCOPY.

Para insertar ficheros en campos LOB de una tabla se utiliza la función FILETOBLOB.



Triggers

Ejemplo de disparador que registra la fecha, hora y usuario de ultima modificación de cualquier campo de una tabla concreta. Suponiendo que dicha tabla contendrá los siguientes campos para contener la susodicha información de //Data Warehousing//:

   fechact    DATE
   usuario    VARCHAR(30)

Y definiendo un procedimiento auxiliar que se limite simplemente a devolvernos dichos datos tal y como sigue:

   CREATE PROCEDURE pr_current_user() RETURNING DATETIME YEAR TO SECOND, VARCHAR(30)
      RETURN CURRENT, USER;
   END PROCEDURE;

Entonces la definición del trigger de registro de dichos campos quedaría:

   CREATE TRIGGER tu_tabla
   UPDATE ON tabla
   FOR EACH ROW (
       EXECUTE PROCEDURE pr_current_user() INTO tabla.fechact, tabla.usuario
   )

Para ejecutar más de una instrucción por cada fila implicada en el trigger se separan éstas por comas:

   CREATE TRIGGER trig_tabusers INSERT ON tabusers
   REFERENCING NEW AS new_ins
      FOR EACH ROW (
          EXECUTE PROCEDURE pr_crear_cuenta(new_ins.login, new_ins.nombre, new_ins.apellidos),
   
          INSERT INTO auditoria( tabla, operacion, clave, detalles )
          VALUES ( 'tabusers', 'I', new_ins.login, new_ins.nombre||' - '||new_ins.apellidos )
      )

La categoría no contiene actualmente ningún artículo o archivo multimedia.