En esta oportunidad se explicara el uso de algunas sentencias en SQL en el manejo de datos dentro del POSTGRES, para lo cual, usaremos como ejemplo leer los registros de una tabla. Nota: para este ejemplo, se uso el POSTGRES 9.0 y la referencia esta en el manual de ayuda de POSTGRES que se encuentra en:
C:\Archivos de programa\PostgreSQL\9.0\doc\postgresql\html\sql-commands.html
El “programa” o la consulta en SQL a analizar es (se dividió en secciones para un mejor entendimiento y todo texto que viene seguido de “--” es un comentario y no afecta al programa / consulta):
--Nuestra tabla "PERU_CAPITALES_DEPARTAMENTOS" tiene 4 columnas:
--name (VARCHAR), que es el nombre de las capitales de los departamentos del Perú
--type (VARCHAR), que es el tipo de capital (departamento o CAP PERU)
--longitude (NUMERIC), que es la longitud donde está ubicado cada capital de departamento
--latitude (NUMERIC), que es la latitud donde está ubicado cada capital de departamento
--usaremos un arreglo (que la declararemos FILADep) para guardar los 4 valores de cada columna
-- y usaremos un arreglo (que la declararemos TABLADep) para guardar los arreglos FILADep
--Inicio declaración de las variables--
DO $$DECLARE r record; -- declaración de una variable de tipo registro(s)
NombreCapDep VARCHAR;-- declaración de una variable de tipo texto
Tipo VARCHAR; -- declaración de una variable de tipo texto
NumRec INTEGER:=1; -- declaración de una variable de tipo entero e inicializado en 1
i INTEGER:=1; -- declaración de una variable de tipo entero e inicializado en 1
Longitud numeric; -- declaración de una variable de tipo numérico (acepta decimales)
Latitud numeric; -- declaración de una variable de tipo numérico (acepta decimales)
TMP VARCHAR; -- declaración de una variable de tipo texto
FILADep VARCHAR[]; -- declaración de una arreglo (array) de tipo texto
TABLADep VARCHAR[]; -- declaración de una arreglo (array) de tipo texto
--Fin declaración de las variables--
--Inicio del programa--
BEGIN -- palabra reservada que indica el inicio de la ejecución
FOR r IN SELECT "name", "type", "longitude" , "latitude" FROM "PERU_CAPITALES_DEPARTAMENTOS" --con esta sentencia se obtiene los registros de la consulta indicada
LOOP --inicio de la lectura de un registro, leera los registros de la variable r hasta el ultimo
FILADep[1]:= r.name;
FILADep[2]:= r.type;
FILADep[3]:= r.longitude;
FILADep[4]:= r.latitude;
TABLADep[NumRec]:=FILADep;
NumRec:= NumRec + 1;
END LOOP; --fin de la lectura de un registro
while NumRec > i loop --comienzo de la lectura del arreglo TABLADep
FILADep:=TABLADep[i];
NombreCapDep := FILADep[1];
Tipo := FILADep[2];
Longitud :=FILADep[3];
Latitud := FILADep[4];
TMP := NombreCapDep || Tipo || Longitud || Latitud;
RAISE NOTICE 'RESULTADO: %',TMP;
i := i + 1;
end loop; --fin de la lectura del arreglo TABLADep
END$$; --Fin del programa--
Ahora se explicara lo que se hizo (el codigo integro se encuentra al final de este post)
Para declarar variables se usa DO $$DECLARE, y todo lo que viene antes del BEGIN son las variables para el programa / consulta:
DO $$DECLARE r record; -- declaración de una variable de tipo registro(s)
NombreCapDep VARCHAR;-- declaración de una variable de tipo texto
Tipo VARCHAR; -- declaración de una variable de tipo texto
NumRec INTEGER:=1; -- declaración de una variable de tipo entero e inicializado en 1
i INTEGER:=1; -- declaración de una variable de tipo entero e inicializado en 1
Longitud numeric; -- declaración de una variable de tipo numérico (acepta decimales)
Latitud numeric; -- declaración de una variable de tipo numérico (acepta decimales)
TMP VARCHAR; -- declaración de una variable de tipo texto
FILADep VARCHAR[]; -- declaración de una arreglo (array) de tipo texto
TABLADep VARCHAR[]; -- declaración de una arreglo (array) de tipo texto
Después de declarar las variables, se procede a escribir el programa / consulta SQL:
BEGIN -- palabra reservada que indica el inicio de la ejecución
FOR r IN SELECT "name", "type", "longitude" , "latitude" FROM "PERU_CAPITALES_DEPARTAMENTOS" --con esta sentencia se obtiene los registros de la consulta indicada, e inmediatamente después se hace la lectura --de cada registro de esta sentencia con un LOOP
LOOP --inicio de la lectura de un registro, leera los registros de la variable r hasta el ultimo
FILADep[1]:= r.name;-- lectura de la columna “name” y se guarda en la 1ra posición del arreglo FILADep
FILADep[2]:= r.type;-- lectura de la columna “type” y se guarda en la 2da posición del arreglo FILADep
FILADep[3]:= r.longitude; -- lectura de la columna “longitude” y se guarda en la 3ra posición del arreglo FILADep
FILADep[4]:= r.latitude; -- lectura de la columna “latitude” y se guarda en la 4ta posición del arreglo FILADep
TABLADep[NumRec]:=FILADep; -- se guarda el arreglo FILADep en el arreglo TABLADep
NumRec:= NumRec + 1; -- contador de los arreglos FILADep guardados en TABLADep
END LOOP; --fin de la lectura de un registro
Ahora se lee los arreglos FILADep que están guardados en TABLADep
while NumRec > i loop --se leera las posiciones desde “i” hasta “NumRec” del arreglo TABLADep
FILADep:=TABLADep[i]; -- leo el arreglo FILADep que está en la posición “i” del arreglo TABLADep
NombreCapDep := FILADep[1]; --leo los nombres de las capitales y los guardo en NombreCapDep
Tipo := FILADep[2]; --leo los Tipos de las capitales y los guardo en Tipo
Longitud :=FILADep[3]; --leo los Longitudes de las capitales y los guardo en Longitud
Latitud :=FILADep[4]; --leo las Latitudes de las capitales y los guardo en Latitud
TMP := NombreCapDep || Tipo || Longitud || Latitud; --Acá junto los 4 datos anteriores en una sola cadena de texto
RAISE NOTICE 'RESULTADO: %',TMP; -- imprimo el valor de TMP
i := i + 1; -- aumento a una unidad el valor de “i”
end loop; --fin de la lectura del arreglo TABLADep
END$$; --Fin del programa--
El resultado es como se muestra en el siguiente dibujo (en la parte baja del mismo):
Con más detalle, se encuentra acá:
NOTICE: RESULTADO: CERRO DE PASCODepartamento-76.254902000000000-10.681626000000000
NOTICE: RESULTADO: TUMBESDepartamento-80.446455000000000-3.556674000000000
NOTICE: RESULTADO: TACNADepartamento-70.247912000000000-18.009956000000000
NOTICE: RESULTADO: MOQUEGUADepartamento-70.941361000000000-17.194016000000000
NOTICE: RESULTADO: PIURADepartamento-80.611527000000000-5.192492000000000
NOTICE: RESULTADO: CHICLAYODepartamento-79.826663000000000-6.768909000000000
NOTICE: RESULTADO: TRUJILLODepartamento-79.023801000000000-8.100448000000000
NOTICE: RESULTADO: HUARÁZDepartamento-77.534741000000000-9.528399000000000
NOTICE: RESULTADO: LIMACAP PERU-77.040211000000000-12.088541000000000
NOTICE: RESULTADO: ICADepartamento-75.724155000000000-14.070739000000000
NOTICE: RESULTADO: AREQUIPADepartamento-71.585255000000000-16.418539000000000
NOTICE: RESULTADO: IQUITOSDepartamento-73.254509000000000-3.746301000000000
NOTICE: RESULTADO: CAJAMARCADepartamento-78.496204000000000-7.158952000000000
NOTICE: RESULTADO: CHACHAPOYASDepartamento-77.842963000000000-6.216036000000000
NOTICE: RESULTADO: MOYOBAMBADepartamento-76.973934000000000-6.026461000000000
NOTICE: RESULTADO: HUÁNUCODepartamento-76.236927000000000-9.926996000000000
NOTICE: RESULTADO: HUANCAYODepartamento-75.204273000000000-12.073146000000000
NOTICE: RESULTADO: HUANCAVELICADepartamento-74.976647000000000-12.787557000000000
NOTICE: RESULTADO: PUERTO MALDONADODepartamento-69.191816000000000-12.598876000000000
NOTICE: RESULTADO: PUNODepartamento-70.033639000000000-15.836606000000000
NOTICE: RESULTADO: ABANCAYDepartamento-72.874359000000000-13.634084000000000
NOTICE: RESULTADO: AYACUCHODepartamento-74.225872000000000-13.162889000000000
NOTICE: RESULTADO: PUCALLPADepartamento-74.552291000000000-8.381353000000000
NOTICE: RESULTADO: CUSCODepartamento-71.971511000000000-13.519884000000000
NOTICE: RESULTADO: CALLAODepartamento-77.138198000000000-12.053769000000000
Esta en forma desordenada, pero se nota los resultados de las 4 columnas mencionadas
El codigo sin comentarios es:
DO $$DECLARE r record;
NombreCapDep VARCHAR;
Tipo VARCHAR;
NumRec INTEGER:=1;
i INTEGER:=1;
Longitud numeric;
Latitud numeric;
TMP VARCHAR;
FILADep VARCHAR[];
TABLADep VARCHAR[];
BEGIN
FOR r IN SELECT "name", "type", "longitude" , "latitude" FROM "PERU_CAPITALES_DEPARTAMENTOS"
LOOP
FILADep[1]:= r.name;
FILADep[2]:= r.type;
FILADep[3]:= r.longitude;
FILADep[4]:= r.latitude;
TABLADep[NumRec]:=FILADep;
NumRec:= NumRec + 1;
END LOOP;
while NumRec > i loop
FILADep:=TABLADep[i];
NombreCapDep:= FILADep[1];
Tipo:= FILADep[2];
Longitud:=FILADep[3];
Latitud:=FILADep[4];
TMP := NombreCapDep || Tipo || Longitud || Latitud;
RAISE NOTICE 'RESULTADO: %',TMP;
i := i + 1;
end loop;
END$$;
Esperando que sea útil el tema de este mes, nos vemos hasta noviembre, hasta la vista.