domingo, 2 de octubre de 2011

SQL y POSTGRES

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.

ª