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.