Desarrollo de Aplicaciones Java SQL Postgres
Desarrollo de Aplicaciones Java SQL Postgres
Desarrollo de Aplicaciones Java SQL Postgres
Mayo 2015
NDICE
NDICE
1
SQL E MBEBIDO EN C
PostgreSQL y C
BD1
M AY 2015
2 / 86
NDICE
BD1
M AY 2015
3 / 86
NDICE
SQL E MBEBIDO
BD1
M AY 2015
4 / 86
NDICE
C URSORES
BD1
M AY 2015
5 / 86
NDICE
BD1
M AY 2015
6 / 86
NDICE
F ORMA 1
DECLARE
...
CURSOR nombreCursor IS
instruccion SELECT
F ORMA 2
DECLARE
...
CURSOR nombreCursor ( param1 tipo1 , . . . , paramN tipoN ) IS
instruccion SELECT
BD1
M AY 2015
7 / 86
NDICE
Abrir el cursor
OPEN nombre_cursor ;
OPEN nombre_cursor ( valor1 , valor2 , . . . , valorN ) ;
Cerrar el cursor
CLOSE nombre_cursor ;
BD1
M AY 2015
8 / 86
NDICE
d e c l a r a c i o n c u r s o r
CURSOR amigas IS
SELECT Nombre FROM amigos
WHERE sexo= ' F ' ;
a b r i r c u r s o r
OPEN amigas ;
r e c o r r e r c u r s o r
FETCH amigas INTO elNombre ;
c e r r a r c u r s o r
CLOSE amigas ;
BD1
M AY 2015
9 / 86
NDICE
API
API
BD1
M AY 2015
10 / 86
NDICE
1
SQL E MBEBIDO EN C
PostgreSQL y C
BD1
M AY 2015
11 / 86
BD1
M AY 2015
12 / 86
NDICE
1
SQL E MBEBIDO EN C
PostgreSQL y C
BD1
M AY 2015
13 / 86
ODBC Y JDBC
ODBC (Open DataBase Connectivity) y JDBC (Java DataBase Connectivity) tambin permiten la integracin de SQL con lenguaje anfitrin mediante una API.
Ambos ofrecen una API y permiten el uso de un nico ejecutable
para acceder a diferentes SGBD sin re-compilacin.
Por lo tanto, una aplicacin que usa ODBC o JDBC es independiente del SGBD.
BD1
M AY 2015
14 / 86
BD1
M AY 2015
15 / 86
C ARGAR EL CONTROLADOR
BD1
M AY 2015
16 / 86
BD1
M AY 2015
17 / 86
NDICE
1
SQL E MBEBIDO EN C
PostgreSQL y C
BD1
M AY 2015
18 / 86
BD1
M AY 2015
19 / 86
BD1
M AY 2015
20 / 86
NDICE
1
SQL E MBEBIDO EN C
PostgreSQL y C
BD1
M AY 2015
21 / 86
BD1
M AY 2015
22 / 86
BD1
M AY 2015
23 / 86
BD1
M AY 2015
24 / 86
NDICE
1
SQL E MBEBIDO EN C
PostgreSQL y C
BD1
M AY 2015
25 / 86
BD1
M AY 2015
26 / 86
BD1
M AY 2015
27 / 86
NDICE
1
SQL E MBEBIDO EN C
PostgreSQL y C
BD1
M AY 2015
28 / 86
BD1
M AY 2015
29 / 86
BD1
M AY 2015
30 / 86
SQL E MBEBIDO EN C
NDICE
1
SQL E MBEBIDO EN C
PostgreSQL y C
BD1
M AY 2015
31 / 86
SQL E MBEBIDO EN C
P OSTGRE SQL Y C
NDICE
1
SQL E MBEBIDO EN C
PostgreSQL y C
BD1
M AY 2015
32 / 86
SQL E MBEBIDO EN C
P OSTGRE SQL Y C
L IBRERIA Y VARIABLE
Para almacenar los resultados provenientes de la base de datos PostgreSQL, es necesario declarar variables que permitan esta accin. Para ello la libreria anterior tiene incluido el tipo PGresult.
PGresult * variable1 , * variabl2 ;
BD1
M AY 2015
33 / 86
SQL E MBEBIDO EN C
P OSTGRE SQL Y C
BD1
M AY 2015
34 / 86
SQL E MBEBIDO EN C
P OSTGRE SQL Y C
Para verificar el estado de la conexin podemos utilizar la funcin PQstatus() la cual retorna verdadero o falso dependiendo si la conexin se
realizo correctamente o no.
E STADO DE LA CONEXIN
PQstatus ( conn )
Si deseamos terminar la conexin con la base de datos, podemos utilizar la funcin PQfinish(), la cual cortara dicha conexin.
T ERMINAR LA CONEXIN
PQfinish ( conn ) ;
BD1
M AY 2015
35 / 86
SQL E MBEBIDO EN C
P OSTGRE SQL Y C
E JEMPLO DE C ONEXIN
# i n c l u d e < s t d i o . h>
# i n c l u d e < s t d l i b . h>
# i n c l u d e < s t r i n g . h>
# i n c l u d e " / L i b r a r y / PostgreSQL / 9 . 4 / i n c l u d e / l i b p q f e . h "
# i n c l u d e < c t y p e . h>
# i n c l u d e <sys / t i m e . h>
/ / V a r i a b l e " conn " d e l Tipo Conexion PGconn
PGconn * conn ;
i n t main ( ) {
/ * * * * * * l o g i n a l a base de datos * * * * * * /
conn=PQsetdbLogin ( " l o c a l h o s t " , " 5432 " , NULL , NULL , " Prueba " , " p o s t g r e s " , " " );
printf ( " Conectando a l a BD\ n " ) ;
i f ( PQstatus ( conn ) ! = CONNECTION_BAD ) {
printf ( "DB conectada \ n " ) ;
PQfinish ( conn ) ;
fflush ( stdin ) ;
} else
printf ( " A l c o n e c t a r s e a l a BD\ n " ) ;
return 0;
}
L UIS E MILIO C ABRERA C ROT (UBB)
BD1
M AY 2015
36 / 86
SQL E MBEBIDO EN C
P OSTGRE SQL Y C
BD1
M AY 2015
37 / 86
SQL E MBEBIDO EN C
P OSTGRE SQL Y C
C OMPILAR EN L INUX
gcc dbaccess . c o EJECUTABLE I / usr / include / postgresql L / usr / include / postgresql lpq fnostackprotector
. / EJECUTABLE
C OMPILAR EN M AC
gcc dbaccess . c o EJECUTABLE I / Library / PostgreSQL / 9 . 4 / include / postgresql / L / Library / PostgreSQL / 9 . 4 / include / postgresql / lpq fnostackprotector
. / EJECUTABLE
BD1
M AY 2015
38 / 86
NDICE
1
SQL E MBEBIDO EN C
PostgreSQL y C
BD1
M AY 2015
39 / 86
C ONFIGURACIN PREVIA
NDICE
1
SQL E MBEBIDO EN C
PostgreSQL y C
BD1
M AY 2015
40 / 86
C ONFIGURACIN PREVIA
BD1
M AY 2015
41 / 86
C ONFIGURACIN PREVIA
BD1
M AY 2015
42 / 86
C ONFIGURACIN PREVIA
BD1
M AY 2015
43 / 86
C ONFIGURACIN PREVIA
BD1
M AY 2015
44 / 86
C ONFIGURACIN PREVIA
BD1
M AY 2015
45 / 86
C ONFIGURACIN PREVIA
Si php_pgsql.dll y php_pdo_pgsql.dll no estn en la carpeta de instalacin de PHP, puedes bajar el archivo comprimido y aadir la ruta directa como por ejemplo: extension=C:/php/ext/php_pgsql.dll
o copiar los archivos a la carpeta de instalacin.
El directorio de instalacin de PHP si instalaron WAMPP debera
ser: C:\wamp\bin\php\php5.3.9\ext\ y dentro de el ubicar los
archivos.
Luego reinicia apache.
BD1
M AY 2015
46 / 86
C ONFIGURACIN PREVIA
Si el comando anterior arroja algo como /usr/bin/psql Esta apuntando al path de instalacin por defecto del gestor y no ha donde acabamos de instalarlo. Para resolver ese problema tenemos que editar
nuestro archivo bash_profile.
$ nano ~ / bash_profile
BD1
M AY 2015
47 / 86
C ONFIGURACIN PREVIA
BD1
M AY 2015
48 / 86
NDICE
1
SQL E MBEBIDO EN C
PostgreSQL y C
BD1
M AY 2015
49 / 86
E STABLECIENDO LA C ONEXIN
Por lo que respecta a la utilizacin de la API para la conexin y
consulta de bases de datos, empezaremos con un ejemplo:
CONEXION . PHP
<?php
/ / Datos para l a conexion
/ / Conectarse a Postgres
$link = pg_connect ( " h o s t = l o c a l h o s t p o r t =5432 password=123456 user= p o s t g r e s dbname=Prueba " ) ;
if
( ! $link ) {
d i e ( ' E r r o r a l c o n e c t a r s e a PostgreSQL :
pg_ErrorMessage ( $link ) ) ;
' . -
}
else
echo " E x i t o ! " ;
?>
L UIS E MILIO C ABRERA C ROT (UBB)
BD1
M AY 2015
50 / 86
E STABLECIENDO LA C ONEXIN
En las lneas anteriores, se establece la conexin a la base de datos
seleccionada con que se va a trabajar y comprobamos que se ha
realizado correctamente.
El cdigo es bastante explcito y la mayora de errores al respecto
suelen deberse a una mala configuracin de los permisos del usuario
sobre la base de datos con la que debe trabajar.
Conviene estar muy atento, sobre todo a las direcciones de origen de la
conexin, ya que, aunque podemos usar localhost como nombre de
equipo, si el intrprete y el SGBD estn en el mismo servidor, suele
ocurrir que PHP resuelve localhost al nombre real del equipo e intenta
conectarse con esta identificacin.
As pues, debemos examinar cuidadosamente los archivos de registro
de PostgreSQL y los usuarios y privilegios del mismo si falla la conexin.
Para establecer una conexin persistente, debemos utilizar la funcin
pg_pconnect() con los mismos parmetros de pg_connect().
L UIS E MILIO C ABRERA C ROT (UBB)
BD1
M AY 2015
51 / 86
PARMETROS DE C ONSULTAS
MUESTRADB . PHP
<?php
$consulta = " s e l e c t * from nombres " ;
$ejecquery = pg_query ( $consulta , $link ) or d i e ( ' Consulta e r r ó ; nea : ' . pg_last_error ( ) ) ;
?>
BD1
M AY 2015
52 / 86
PARMETROS DE C ONSULTAS
Para comprobar errores, la API de PostgreSQL distingue entre un error
de conexin, y errores sobre los recursos devueltos. En el primer caso,
deberemos usar pg_connection_status(), mientras que en el
segundo podemos optar por pg_last_error() o bien
pg_result_error($recurso) para obtener el mensaje de error que
pueda haber devuelto un recurso en concreto.
La funcin pg_query() puede devolver los siguientes resultados:
FALSE si ha habido un error.
Una referencia a una estructura si la sentencia ha tenido xito.
BD1
M AY 2015
53 / 86
PARMETROS DE C ONSULTAS
Una vez obtenido el recurso a partir de los resultados de la consulta,
PHP proporciona multitud de formas de iterar sobre sus resultados o
de acceder a uno de ellos directamente. Comentamos las ms destacadas:
$fila=pg_fetch_array($recurso,<tipo_de_array>)
Esta funcin va iterando sobre el recurso, devolviendo una fila
cada vez, hasta que no quedan ms filas y devuelve FALSE. La
forma del array devuelto, depender del parmetro
<tipo_de_array> que puede tomar estos valores:
PG_NUM: devuelve un array con ndices numricos para los
campos. Es decir, en $fila[0] tendremos el primer campo del
SELECT, en $fila[1], el segundo, etc.
PG_ASSOC: devuelve un array asociativo donde los ndices son los
nombres de campo o alias que hayamos indicado en la sentencia
SQL.
PG_BOTH: devuelve un array con los dos mtodos de acceso.
L UIS E MILIO C ABRERA C ROT (UBB)
BD1
M AY 2015
54 / 86
PARMETROS DE C ONSULTAS
MUESTRADB . PHP
<?php
$consulta = " s e l e c t * from nombres " ;
$ejecquery = pg_query ( $consulta , $link ) or d i e ( ' Consulta e r r ó ; nea : ' . pg_last_error ( ) ) ;
?>
<table border= ' 1 ' >
<tr>
<td>ID < / td><td>Nombre < / td>
</tr>
<?php
w h i l e ( $reg = pg_fetch_assoc ( $ejecquery ) ) {
echo " < t r >
<td > " . $reg [ ' i d ' ] . " </ td >
<td > " . $reg [ ' nombre ' ] . " </ td >
</ t r > " ;
}
?>
</table>
BD1
M AY 2015
55 / 86
PARMETROS DE C ONSULTAS
MUESTRADB . PHP
<?php
$consulta = " s e l e c t nombre from nombres " ;
$ejecquery = pg_query ( $consulta , $link ) or d i e ( ' Consulta e r r ó ; nea : ' . pg_last_error ( ) ) ;
?>
<table border= ' 1 ' >
<?php
w h i l e ( $line = p g _ f e t c h _ a r r a y ( $ejecquery , PGSQL_BOTH)){
echo " \ t < t r > \ n " ;
f o r ( $i=0;$i< s i z e o f ( $line ) ; $i++) {
echo " \ t \ t <td > $ l i n e [ $ i ] < / td > \ n " ;
}
echo " <td >Nombre : $ l i n e [ ' nombre ' ] < / td > " ;
echo " \ t < / t r > \ n " ;
}
?> </table>
L UIS E MILIO C ABRERA C ROT (UBB)
BD1
M AY 2015
56 / 86
PARMETROS DE C ONSULTAS
$objeto=pg_fetch_object($recurso)
Esta funcin va iterando sobre los resultados, devolviendo un
objeto cada vez, de forma que el acceso a los datos de cada
campo se realiza por medio de las propiedades del objeto. Al
igual que en el array asociativo, hay que vigilar con los nombres
de los campos en consulta, evitando que devuelva campos con el
mismo nombre fruto de combinaciones de varias tablas, ya que
solo podremos acceder al ltimo de ellos.
<?php
$consulta = " s e l e c t i d , nombre from nombres " ;
$ejecquery = pg_query ( $consulta , $link ) or d i e ( ' Consulta e r r ó ; nea : ' . pg_last_error ( ) ) ;
?>
<table border= ' 1 ' >
<?php
w h i l e ( $line = p g _ f e t c h _ a r r a y ( $ejecquery , PGSQL_BOTH ) ) {
echo " \ t < t r > \ n " ;
echo " <td >ID : " . $object>id . " </ td > " ;
echo " <td >Nombre : " . $object>nombre . " </ td > " ;
echo " \ t < / t r > \ n " ;
}
?>
</table>
L UIS E MILIO C ABRERA C ROT (UBB)
BD1
M AY 2015
57 / 86
PARMETROS DE C ONSULTAS
$exito=pg_result_seek($recurso,$fila)
Esta funcin permite mover el puntero dentro de la hoja de
resultados representada por $recurso hasta la fila que
deseemos. Deben tomarse las mismas consideraciones que en la
funcin mysql_data_seek().
BD1
M AY 2015
58 / 86
BD1
M AY 2015
59 / 86
BD1
M AY 2015
60 / 86
C ERRAR LA C ONEXIN
Finalmente, comentaremos las funciones de liberacin y desconexin.
En el primer caso, PHP realiza un excelente trabajo liberando recursos
de memoria cuando la ejecucin en curso ya no se van a utilizar ms.
Aun as, si la consulta devuelve una hoja de datos muy grande, puede
ser conveniente liberar el recurso cuando no lo necesitemos.
Por lo que respecta al cierre de la conexin, tampoco suele ser necesario, ya que PHP cierra todas las conexiones al finalizar la ejecucin y, adems, el cierre siempre est condicionado a la configuracin de las conexiones persistentes. Tal como ya hemos comentado,
si activamos las conexiones persistentes (o bien hemos conectado con
pg_pconnect), esta funcin no tiene ningn efecto y, en todo caso,
ser PHP quien decida cundo se va a cerrar cada conexin.
BD1
M AY 2015
61 / 86
BD1
M AY 2015
62 / 86
Toda pagina que utilice la base de datos debe tener en el Head el include del archivo de conexin.
< !DOCTYPE h t m l >
<html>
<head>
< t i t l e >Prueba PostgreSQL< / t i t l e >
<?php
i n c l u d e _ o n c e ( " conexion . php " ) ;
?>
< / head>
BD1
M AY 2015
63 / 86
NDICE
1
SQL E MBEBIDO EN C
PostgreSQL y C
BD1
M AY 2015
64 / 86
BD1
M AY 2015
65 / 86
BD1
M AY 2015
66 / 86
NDICE
1
SQL E MBEBIDO EN C
PostgreSQL y C
BD1
M AY 2015
67 / 86
BD1
M AY 2015
68 / 86
BD1
M AY 2015
69 / 86
BD1
M AY 2015
70 / 86
BD1
M AY 2015
71 / 86
NDICE
1
SQL E MBEBIDO EN C
PostgreSQL y C
BD1
M AY 2015
72 / 86
BD1
M AY 2015
73 / 86
BD1
M AY 2015
74 / 86
BD1
M AY 2015
75 / 86
BD1
M AY 2015
76 / 86
NDICE
1
SQL E MBEBIDO EN C
PostgreSQL y C
BD1
M AY 2015
77 / 86
BD1
M AY 2015
78 / 86
BD1
M AY 2015
79 / 86
BD1
M AY 2015
80 / 86
BD1
M AY 2015
81 / 86
NDICE
1
SQL E MBEBIDO EN C
PostgreSQL y C
BD1
M AY 2015
82 / 86
BD1
M AY 2015
83 / 86
BD1
M AY 2015
84 / 86
BD1
M AY 2015
85 / 86
BD1
M AY 2015
86 / 86