5.4 Recuperación de datos en DBTG
El lenguaje de manipulación de datos de la
propuesta DBTG consiste en un número de órdenes que se incorporan en un lenguaje
principal.
La mayor parte de
los comandos de manejo de datos en DBTG de CODASYL tienen dos pasos. En primer lugar, se
emite un comando FIND para identificar el registro sobre el cual se va a actuar. El
comando FIND no lee, procesa el registro indicado;sólo identifica un registro para que lo
localice el DBMS. Una vez identificado el registro, un segundo comando DML puede emitirse
para que se lleve a cabo una operación sobre él. Patrones típicos son FIND, GET, o
bien, FIND, MODIFY; o bien FIND, ERASE.
Cuando el programa emite un comando FIND, se localiza un registro y su identidad permanece almacenada en una variable especial llamada indicador de posición. Después, cuando se emite un comando GET, MODIFY, ERASE o bien otro, el DBMS hace referencia al indicador de posición para determinar cuál es el registro sobre el que ha de actuar. Los indicadores de posición también se utilizan como puntos de referencia para los comandos del procesamiento secuencial como son FIND NEXT o FIND PRIOR.
Las operaciones utilizadas para la recuperación de datos son :
Find: Que localiza a un registro en la base de datos y da valores a
los punteros de actualidad correspondientes
Get: Copia el registro al que apunta el actual de unidad de ejecución
de la base de datos ala plantilla adecuada en el área de trabajo de programa.
La orden FIND tiene varias formas, en este caso estudiaremos 2 ordenes find diferentes
para localizar los registro individuales de la base de datos; La orden más sencilla es de
la forma:
find any < tipo
de registro > using < campo de registro >
Esta orden
localiza un registro del tipo <tipo registro> cuyo valor de < campo de
registro> es el mismo que el del valor de <campo de registro> en la plantilla del
<tipo de registro> en el área de trabajo del programa. Una vez que se encuentra ese
registro se modifican los siguientes punteros para que apunten a ese registro:
El
puntero actual de unidad de ejecución
El
puntero de actualidad de tipo de registro que corresponde a <tipo de registro>
Para
cada conjunto en el que participe ese registro, el puntero de actualidad de conjunto
apropiado.
Para
ilustrar lo anterior, construyamos una consulta en DBTG que nos muestre el número de
control del alumno Luis A. (consideremos el modelo alumno-materia ).
Alumno.nombre:="Luis A.";
find any
Alumno using NombreA;
get Alumno:
print("Alumno.control");
Pueden
existir varios registros con el valor especificado. La orden find localiza el primero de ellos en un orden previamente
especificado. Para localizar otros registros de la base de datos que pudieran tener el
mismo campo <campo de registro, utilizamos la orden
find duplicate <tipo
de registro> using <campo de registro>
Que localiza al siguiente registro (según un orden que depende del
sistema) que tiene el valor de <campo registro>.ejemplo:
Alumno.NombreA:="Luis
A.";
find any Alumno using NombreA;
while DB-Status = 0 do
begin
get Alumno;
print (Alumno.control);
find duplicate Alumno using NombreA;
end;
Se ha encerrado parte de la consulta en un ciclo while ya que no sabemos por adelantado cuántos nombres Luis A. pueden existir. Salimos del bucle cuando DB-Status<>0, esto indica que la última operación find duplicate falló, lo que implica que ya hemos agotado todos los registros con esos datos.