Aunque actualmente existen herramientas como OAT, que nos permiten visualizar graficamente la ocupación de los Dbspaces definidos en nuestra base de datos Informix, es conveniente poder obtener esta información por SQL por si queremos incluir está información en un registro para hacer un seguimiento detallado.
Para obtener información de nuestros Dbspaces, asi como de los Chunks que los forman debemos recurrir a dos tablas de la Base de datos sysmaster:
La forma de calcular el espacio que ocupan, asi como el espacio libre varía en función de si es un dbspace normal, o es un blobspace o es un sbspace.
Lo he resuelto haciendo tres querys unidas por la clausula UNION:
DATABASE sysmaster;
--
-- Dbspace 'normal'
--
SELECT
d.name[1,10] Name,
d.nchunks Chunks,
SUM(k.chksize*2/1024) Total,
SUM(k.nfree*2/1024) Free,
100-(SUM(k.nfree*2/1024)*100)/(SUM(k.chksize*2/1024)) Perc
FROM sysdbspaces d, syschunks k
WHERE d.dbsnum=k.dbsnum
AND d.is_blobspace=0
AND d.is_sbspace=0
GROUP BY 1,2
UNION
--
-- Blobspaces
--
SELECT
d.NAME[1,10] Name,
d.nchunks Chunks,
SUM(k.chksize*2/1024) Total,
SUM(k.nfree*8/1024)Free,
100-(SUM(k.nfree*8/1024)*100)/(SUM(k.chksize*2/1024)) Perc
FROM sysdbspaces d, syschunks k
WHERE d.dbsnum=k.dbsnum
AND d.is_blobspace=1
GROUP BY 1,2
UNION
--
-- Sbspaces
--
SELECT
d.NAME[1,10] Name,
d.nchunks Chunks,
SUM(k.chksize*2/1024) Total,
SUM(k.udfree*2/1024) Free,
100-(SUM(k.udfree*2/1024)*100)/(SUM(k.chksize*2/1024)) Perc
FROM sysdbspaces d, syschunks k
WHERE d.dbsnum=k.dbsnum
AND d.is_sbspace=1
GROUP BY 1,2
ORDER BY 1
El resultado es una tabla como esta:
Hasta la próxima.
Como hemos visto en entradas anteriores, la declaración de un cursor, ya sea en 4GL o en SPL, esta intimamente ligada a una query SQL que nos proporciona los resultados deseados.
Pues bien, tambien podemos ligar la declaración de un cursor a los resultados proporcionados por un procedimientotanto en r4GL como en SPL.
Imaginemos un procedimiento que nos proporcione una lista de los clientes de un determinado pais. Si deseamos obtener información detallada de todos los paises haremos lo siguiente:
* En R4GL:
##
## Lo primero que debemos hacer es preparar el procedimiento que vamos a
## utilizar.
## En la definición del procedimiento incluimos un interrogante por cada
## parámetro de entrada, en nuestro ejemplo recibirá el id del país
## y nos proporcionará el id y nombre de cada uno de los clientes.
##
PREPARE procClientes FROM "EXECUTE PROCEDURE procClientes(?)"
##
## A continuación declaramos un cursor de la tabla de paises tal como hemos visto en entradas anteriores:
##
DECLARE cursorPais CURSOR FOR
SELECT id_pais, nombre_pais FROM paises
ORDER BY nombre_pais
FOREACH cursorPais INTO idPais, nombrePais
##
## Le paso el idPais al procedimiento y nos devuelve una lisa de clientes
##
FOREACH procClientes USING idPais INTO idCliente, nombreCliente
----
----
END FOREACH;
END FOREACH
* En SPL:
FOREACH
SELECT id_pais, nombre_pais INTO idPais, nombrePais
FROM paises
ORDER BY nombre_pais
--
-- En Spl no hace falta preparar el procedimiento.
-- Lo utilizamos directamente pasandole los parámetros
-- de entrada entre parentesis
--
FOREACH
EXECUTE PROCEDURE procCLientes (idPais)
INTO idCliente, nombreCliente;
RETURN nombrePais, nombreCliente WITH RESUME;
END FOREACH;
END FOREACH;
Espero que os sea de utilidad.
Hasta la próxima.
Una de las herramientas mas potentes en Informix 4gl es el uso de cursores para obtener información de la base de datos. Voy a comentaros cómo se declaran y las formas que conozco de explotarlos.
La forma de declararlos es muy sencilla:
DECLARE myCursor CURSOR FROM
SELECT * FROM tabla
WHERE condiciones
Es decir, definimos un CURSOR con el nombre que queramos (myCursor en el ejemplo) asociado a una query que nos aportará los datos que necesitamos.
Existen dos formas distintas de abrir el cursor y empezar a explotar la informacion aportada:
* Uso de FOREACH:
DEFINE datosCliente RECORD LIKE clientes.*
DECLARE myCursor CURSOR FOR
SELECT * FROM clientes
WHERE condiciones
FOREACH myCursor INTO datosCliente
---
---
---
END FOREACH
FREE myCursor
* Uso de OPEN - CLOSE
DEFINE datosCliente RECORD LIKE clientes.*
DECLARE myCursor CURSOR FOR
SELECT * FROM clientes
WHERE condiciones
OPEN myCursor
FETCH myCursor INTO datosCliente
IF STATUS = 0 THEN
WHILE TRUE
---
---
---
FETCH myCursor INTO datosCliente
IF STATUS = NOTFOUND THEN
EXIT WHILE
END IF
END WHILE
END IF
CLOSE myCursor
FREE myCursor
No hay diferencias en cuanto al uso de uno u otro método, pero yo recomiendo usar OPEN - CLOSE para realizar REPORTS por una razón muy sencilla, al realizar el primer FETCH podemos averiguar si el cursor nos va a devolver alguna información. De esta forma podemos hacer el START REPORT seguros de que al menos va a tener una linea.
DECLARE myCursor CURSOR FOR
SELECT * FROM clientes
WHERE condiciones
OPEN myCursor
FETCH myCursor INTO datosCliente
IF STATUS = 0 THEN
##
## Inicio el Report cuando sé que va a tener contenido
##
START REPORT myReport TO printer
WHILE TRUE
OUTPUT TO REPORT miReport (datosCliente)
FETCH miCursor INTO datosCliente
IF STATUS = NOTFOUND THEN
EXIT WHILE
END IF
END WHILE
##
## Finalizo el Report cuando salgo del while
##
FINISH REPORT myReport
END IF
CLOSE myCursor
FREE myCursor
Espero que os sea de utilidad... hasta la próxima.