Obtener los metadatos de un ResultSet

Las definiciones de tablas, vistas, índices, permisos, procedimientos almacenados, etc. son metadatos que también reciben el nombre de esquema o estructura de la base de datos.

Con el API JDBC podemos acceder y manipular los metadatos de la BD así como los datos que almacena. Un empleo muy común es la consulta de las definiciones de las columnas de una tabla.

El método getMetaData() de un objeto ResultSet devuelve una referencia a un objeto de tipo ResultSetMetaData() que encapsula los metadatos del ResultSet. El interfaz ResultSetMetaData declara métodos que nos van a permitir obtener elementos de los metadatos.

El método getColumnCount() devuelve el número de columas del resultado como un valor int. Al llamar a los métodos getColumnName() y getColumnType() para cada columna se obtienen los nombres y tipos de cada una. En ambos casos se debe especificar la columna mediante un índice. El nombre de la columna se obtiene como un objeto de tipo String y el tipo de columna como un valor int correspondiente al tipo SQL de la columna. La clase Types de java.sql define los campos públicos de tipo int de los distintos tipos SQL, que además tienen los mismos nombres que en SQL (CHAR, DOUBLE, VARCHAR, INT, TIME, etc.). El siguiente fragmento de código lista los nombres de las columnas de un resultset que sean de tipo DATE:

ResultSetMetaData metadatos = Empleados.getMetaData();

int columnas=metadatos.getColumnCount();

for (int i=1; i<=columnas; i++)

{

if (metadatos.getColumnType(i)==Types.DATE)

System.out.println(metadatos.getColumnName(i));

}

Donde Empleados es el resultset del cual queremos obtener los metadatos.

También podemos mostrar el valor de los datos contenidos en cada fila de un objeto ResultSet que en nuestro caso, sean del tipo DATE:

ResultSetMetaData metadatos = Empleados.getMetaData();

int columnas=metadatos.getColumnCount();

int fila=0;

while (Empleados.next()){

System.out.print(«\nFila » + (++fila) + «:»);

for (int i=1; i<=columnas; i++)

{

if (metadatos.getColumnType(i)==Types.DATE)

System.out.print(» » + Empleados.getDate(i));

}

}

También podemos obtener el nombre del tipo de una columna con el método getColumnTypeName() que requiere como argumento el número de columna. Otro método muy útil es getColumnDisplaySize() que devuelve el número máximo de caracteres que necesitaré para mostrar los datos de la columna cuyo índice pasemos como argumento.

* Transcripción del libro «Fundamentos de bases de datos con Java» publicado por Wrox/Anaya

Número variable de argumentos en C

Para indicar al compilador que puede aparecer un número variable de parámetros, el prototipo de la función finaliza con puntos suspensivos. Por ejemplo: int suma(int a, int b, …).

Esto le indica al compilador que la función suma tiene dos parámetros de tipo int que deben aparecer como mínimo, pero que puede recibir más de cualquier tipo.

Para acceder a esos parámetros no definidos en la cabecera, el estándar ANSI C define tres funciones y un tipo incluidos en el archivo de cabecera stdarg.h. El tipo que define es un array que contiene información necesaria para las funciones. Dichas funciones son:

void va_start(va_list ap, lastfix): inicializa el array ap. Esta función debe ser llamada antes de acceder a los parámetros variables. El parámetro lastfix ha de ser el nombre del último parámetro fijo que recibe la función.

tipo va_arg(va_list ap, tipo): devuelve el siguiente parámetro de tipo tipo, de la lista de parámetros. Asimismo incrementa la posición de ap de forma que apunte al siguiente parámetro al que devuelve.

void va_end(va_list ap): elimina la información en el array ap. Debe ser llamada cuando ya no se va a acceder más veces a los parámetros, pero antes de salir de la función.

Vamos a verlo con un ejemplo:

/* Ejemplo de función con numero variable de parámetros */

#include <stdio.h>

#include <stdarg.h>

/* Declaración Prototipo de la función PedirNum */

int PedirNum(void);

/* Declaración Prototipo de la función suma */

long suma(unsigned char Numero, long Num1, long Num2, …);

int main()

{

/* Definimos tres enteros */

long Num1,Num2,Num3;

/* Pedimos valores para esas variables */

Num1=PedirNum();

Num2=PedirNum();

Num3=PedirNum();

/* Realizamos la operacion */

printf(«%li+%li=%li\n»,Num1,Num2,suma(2,Num1,Num2));

printf(«%li+%li=%li\n»,Num1,Num3,suma(2,Num1,Num3));

printf(«%li+%li=%li\n»,Num2,Num3,suma(2,Num2,Num3));

printf(«%li+%li+%li=%li\n»,Num1,Num2,Num3,suma(3,Num1,Num2,Num3));

return(0);

}

/* Definicion de PedirNum */

int PedirNum(void)

{

int Num;

printf(«Introduzca un numero: «);

scanf(«%i»,&Num);

return(Num);

}

/* Definición de Suma */

long suma(unsigned char Numero,long Num1,long Num2,…)

{

long Res;

va_list Param;

Res=Num1+Num2;

Numero-=2;

va_start(Param,Num2);

while (Numero>0)

{

Res+=va_arg(Param,long);

Numero++;

}

va_end(Param);

return(Res);

}

Este ejemplo solo nos vale si el número de argumentos es igual o inferior al primer parámetro, porque de no ser así, la función no tiene forma alguna de determinar el número de argumentos recibidos.