lunes, 14 de marzo de 2016

CAPTURA DE EXCEPCIONES DESDE INFORMIX 4GL - Capture of exceptions from Informix 4gl

Si usamos habitualmente procedimientos almacenados, es probable que bajo determinadas circunstancias deseemos provocar una excepción voluntariamente con el código -746.
Si el procedimiento es llamado desde 4gl tenemos que encontrar la forma de capturar esa excepción y mostrar un mensaje en pantalla.

Pongamos un ejemplo de un procedimiento que recibe un parametro con un pedido de un determinado articulo. Lo primero que hace es comprobar que hay suficiente stock para poder atenderlo y, en caso contrario, provocar una excepcion.

CREATE PROCEDURE 'user'.sp_controlStock (
        articulo LIKE tablaArticulos.id_articulo,
        cantidad INTEGER)

    DEFINE stockArticulo LIKE tablaAlmacen.stockDisponible;

    SELECT stockDisponible INTO stockArticulo
         FROM tablaAlmacen
       WHERE id_articulo = articulo;

    IF stockArticulo < cantidad THEN
        RAISE EXCEPCION -746,0,'No hay stock disponible!!';
    END IF;

END PROCEDURE;


Para controlar la excepcion -746 desde 4gl tendriamos que deshabilitar el control de las excepcion con WHENEVER ERROR CONTINUE, tratar el error que deseamos controlar y por ultimo volver a habilitar el control de las excepciones.

WHENEVER ERROR CONTINUE
EXECUTE sp_controlStock USING articulo, cantidad
IF STATUS = 0 THEN
    pedidoOk =TRUE
ELSE
    IF STATUS = -746 THEN
       MESSAGE "No hay stock disponible para atender el pedido!!"
       pedidoOk = FALSE
    ELSE
       CALL controlErrores()
    END IF 
END IF 
WHENEVER ERROR CALL controlErrores



Hasta la próxima...

martes, 8 de marzo de 2016

CONOCER LAS CONSTRAINTS FOREIGN KEY DE UNA TABLA - Knowing the foreign keys of a Informix table by Sql

Si queremos conocer las constraints de tipo Foreign Key que apuntan a una determinada tabla por SQL, podemos utilizar esta query en la que sólo debeis sustituir "my_table_name" por el nombre de la tabla que querais inspeccionar.


SELECT d.tabname primaria, i.colname columna,
       a.tabname secundaria, f.colname columna,
       b.constrname constraint, b.owner propietario, b.constrtype tipo,
       CASE c.delrule
          WHEN 'C' then 'SI'
          WHEN 'R' then 'NO'
       END cascade_delete
  FROM systables a,
       sysconstraints b,
       sysreferences c,
       systables d,
       sysindexes e,
       syscolumns f,
       sysconstraints g,
       sysindexes h,
       syscolumns i
 WHERE d.tabname = "my_table_name"
   AND c.ptabid = d.tabid
   AND b.constrid = c.constrid
   AND g.constrid = c.primary
   AND b.constrtype = 'R'
   AND a.tabid = b.tabid
   AND e.idxname = b.idxname -- Indice tabla secundaria
   AND h.idxname = g.idxname -- Indice tabla primaria
   AND i.tabid = g.tabid -- Columnas tabla primaria
   AND f.tabid = b.tabid -- Columnas tabla secundaria
   AND ((f.colno = e.part1 AND i.colno = h.part1) or
        (f.colno = e.part2 AND i.colno = h.part2) or
        (f.colno = e.part3 AND i.colno = h.part3) or
        (f.colno = e.part4 AND i.colno = h.part4) or
        (f.colno = e.part5 AND i.colno = h.part5) or
        (f.colno = e.part6 AND i.colno = h.part6) or
        (f.colno = e.part7 AND i.colno = h.part7) or
        (f.colno = e.part8 AND i.colno = h.part8) or
        (f.colno = e.part9 AND i.colno = h.part9) or
        (f.colno = e.part10 AND i.colno = h.part10) or
        (f.colno = e.part11 AND i.colno = h.part11) or
        (f.colno = e.part12 AND i.colno = h.part12) or
        (f.colno = e.part13 AND i.colno = h.part13) or
        (f.colno = e.part14 AND i.colno = h.part14) or
        (f.colno = e.part15 AND i.colno = h.part15) or
        (f.colno = e.part16 AND i.colno = h.part16))

Los tipos de constrains reflejados en la columna constrtype de la tabla sysconstraints pueden ser:

  • C Constraint de tipo Check
  • P Constraint Primary Key
  • R Constraint Reference (Foreign Key)
  • U Constraint Unique
  • N Constraint NOT NULL 
Espero que os sea de utilidad.

martes, 1 de marzo de 2016

CONOCER LAS TABLAS QUE MAS ESPACIO OCUPAN EN UN DBSPACE DESDE SQL - Knowing the size of a Informix table in a Dbspace by Sql

TABLAS DE UN DBSPACE

Si queremos ir equilibrando la ocupacion de los dbspaces que componen nuestra base de datos, es interesante tener una herramienta que nos permita conocer qué tablas son las que mas espacio ocupan en un determinado dbspace para ver si nos conviene pasarlas a otro.

Desde sql ejecutamos la instrucción:

DATABASE sysmaster;
SELECT 
   t2.name dbspace,
   t1.tabname table,
   t1.owner owner,
   TRUNC(t3.nrows,0) rows,
   TRUNC(t3.rowsize,0) row_size,
   TRUNC(t3.nrows*t3.rowsize/1024/1024,2) MB
FROM systabnames t1,sysdbspaces t2, segeua:systables t3
WHERE t2.dbsnum=trunc(t1.partnum/1048576)
  AND t2.name='dbspace_01'
  AND t1.tabname = t3.tabname
ORDER BY 6 DESC


Obtendremos una lista como esta:














DBSPACE DE UNA TABLA

Con una pequeña modificación de la query anterior podemos conocer el dbspace en el que se encuentra una determinada tabla:

DATABASE sysmaster;
SELECT
    t2.name dbspace,
    t1.tabname table,
    t1.owner owner,
    TRUNC(t3.nrows,0) rows,
    TRUNC(t3.rowsize,0) rowsize,
    TRUNC(t3.nrows*t3.rowsize/1024/1024,2) MB
FROM systabnames t1,sysdbspaces t2, segeua:systables t3
WHERE t2.dbsnum=trunc(t1.partnum/1048576)
  AND t1.tabname='tabla_01'
  AND t1.tabname = t3.tabname


A mi me han sido de utilidad y continuan siendolo.
Hasta la próxima.