Programación y Acceso a BD con SQL

Anuncio
Programación y Acceso a
BD con SQL
Pedro Pablo Alarcón
Agustín Yagüe
Departamento de O.E.I.
Escuela Universitaria de Informática
Universidad Politécnica de Madrid
© 2001 P.P. Alarcón, A. Yagüe
? Programación
en el Servidor
1. Introducción ............................................... 2
2. Servidor de Datos ...................................... 2
3. Programación de acciones y tareas .......... 3
?
Acceso desde Clientes
4. Arquitectura cliente/servidor ......................10
5. Conectividad de datos ...............................19
6. Utilización de SQL .....................................25
© 2001 P.P. Alarcón, A. Yagüe
1
1. Introducción
?
Desarrollo de la aplicación en el Servidor :
– Definición de datos
– Manipulación de datos
– Programación de acciones y tareas
– Proporciona servicios de datos y negocio
? Desarrollo
de la aplicación en el Cliente:
– Proporciona el interface al usuario
– Dependiente del lenguaje de programación utilizado
para su implementación
– Proporciona servicios de usuario y negocio
© 2001 P.P. Alarcón, A. Yagüe
2. Servidor de Datos
?
En el servidor, habitualmente, tendremos
SGBD.
un
• Debe permitir:
• Definición de datos (LDD)
•
•
•
•
Manipulación de datos (LMD)
Control de datos (LCD)
Programación de acciones y tareas (LDD y LMD)
En la mayoría de los casos se utiliza SQL
• Debe soportar al menos un protocolo de red basado en
TCP/IP
• Número alto de clientes conectados y gestión de
transacciones y bloqueos concurrentes
© 2001 P.P. Alarcón, A. Yagüe
2
Servidor de Datos
?
Bases de Datos medias y grandes
• Oracle, DB2, Informix , Sybase, ....
(mainframes.... Windows)
?
Bases de Datos pequeñas y medias
• SQLServer (servidor solo en Windows NT)
• Interbase
• Access, FoxPro, Paradox
• MySQL (limitaciones: transacciones, integridad referencial,...)
•
......
© 2001 P.P. Alarcón, A. Yagüe
3. Programación de Acciones y Tareas
? Lenguaje
de control de flujo
• Extensiones de SQL
? Disparadores
• Pequeño programa que se almacena con el
esquema de la base de datos y que se define para
que se ejecute de forma automática como
resultado de alguna acción de actualización que
se lleva a cabo sobre la base de datos
? Procedimientos
almacenados
• Parecido a un disparador excepto que se ejecuta
cuando es llamado desde un disparador, otro
procedimiento almacenado o un programa
© 2001 P.P. Alarcón, A. Yagüe
3
Programación de Acciones y Tareas
? Disparadores
y procedimientos
almacenados
• Suelen ir asociados a la capa de negocio de la
aplicación y por tanto permiten trasladar al
servidor una parte de la lógica del negocio. La
utilización de disparadores permite disminuir el
tráfico de red de la aplicación, y facilita la lógica
del programa cliente que realiza el acceso a la
base de datos
• Pueden entenderse como un entorno basado en
LDD y LMD, ya que se almacenan en el esquema
de la base de datos
© 2001 P.P. Alarcón, A. Yagüe
Lenguaje de Control de Flujo
?
Ampliación de SQL
• DECLARE para la definición de variables
• BEGIN .. END, para la definición de bloques de
instrucciones SQL
• IF .. ELSE para la ejecución condicional
• WHILE para ejecución repetitiva o iterativa
• RETURN, para
almacenados
la
definición
de
procedimientos
• PRINT, para el envío de mensajes a los usuarios
• Comentarios
© 2001 P.P. Alarcón, A. Yagüe
4
Procedimientos Almacenados
? Compuestos
de
• instrucciones SQL
• instrucciones de control de flujo
? Son
compilados, por lo que su ejecución es
rápida
? Pueden
recibir y devolver parámetros, que
permiten modularizar o descomponer
problemas grandes y complejos
© 2001 P.P. Alarcón, A. Yagüe
Procedimientos Almacenados
CREATE PROCEDURE calcularFunSueldo @tipoFun char(3),
@resultado money output
AS
if tipoFun = “max”
select @resultado= max(sueldo) from categoria
else if tipoFun = “min”
select @resultado= min(sueldo) from categoria
else if tipoFun = “avg”
begin
select @resultado= avg(sueldo) from categoria
end
return
© 2001 P.P. Alarcón, A. Yagüe
5
Disparadores
?
Un disparador es un conjunto de acciones que
se realizan automáticamente cuando se intenta
hacer una actualización determinada sobre una
tabla específica.
?
Son similares a los procedimientos
almacenados, con la salvedad que se ejecutan
al ocurrir un evento determinado
?
Eventos: inserción, modificación y borrado.
© 2001 P.P. Alarcón, A. Yagüe
Disparadores
CREATE TRIGGER ActualizaStock
ON Pedidos
FOR insert, update , delete
Update Almacen
set stock = stock + (select cantidad from inserted
where inserted.codArt = Almacen.CodArt)
where codArt = inserted.codArt
Update Almacen
set stock = stock - (select cantidad from inserted
where deleted.codArt = Almacen.CodArt)
where codArt = deleted.codArt
© 2001 P.P. Alarcón, A. Yagüe
6
Interbase
CREATE PROCEDURE nombre [(param <tipodato> [, param <tipodato> ...])]
[RETURNS <tipodato> [, param <tipodato> ...])]
AS <cuerpo> [terminador]
<cuerpo> = [<listaVariables>] <bloque>
< listaVariables > = DECLARE VARIABLE var <tipodato>;
[DECLARE VARIABLE var <tipodato>; ...]
<bloque> =BEGIN
<sentencias>
[<sentencias> ...]
END
<sentencias> = {<bloque> | sentencia;}
EXECUTE PROCEDURE nombre [param [, param ...]];
© 2001 P.P. Alarcón, A. Yagüe
Interbase
CREATE TRIGGER nombre FOR tabla
[ACTIVE | INACTIVE] {BEFORE | AFTER}
{DELETE | INSERT | UPDATE}
[POSITION numero]
AS <cuerpo> terminador
<cuerpo> = [<lista_declaracion_variables>] <bloque>
< lista_declaracion_variables > =
DECLARE VARIABLE variable <tipodato>;
[DECLARE VARIABLE variable <tipodato>; ...]
<bloque> = BEGIN
<sentencia>
[<sentencia> ...]
END
<sentencia> = {<bloque> | sentencia;}
© 2001 P.P. Alarcón, A. Yagüe
7
Interbase
•Cursor
DECLARE cursor CURSOR FOR <select>
[FOR UPDATE OF <col> [, <col>...]];
Sentencias asociadas: OPEN, FETCH, CLOSE
•Funciones Externas
DECLARE EXTERNAL FUNCTION nombre [<tipodato> | CSTRING (int)
[, <tipodato> | CSTRING (int) ...]]
RETURNS {<tipodato> [BY VALUE] | CSTRING (int)}
ENTRY_POINT "<entryname>"
MODULE_NAME "<modulename>";
© 2001 P.P. Alarcón, A. Yagüe
SQL Server
CREATE PROC[EDURE] nombreProcedimiento [;número]
[{@parámetro tipoDatos} [VARYING] [= predeterminado] [OUTPUT]]
[,...n]
[WITH
{RECOMPILE
| ENCRYPTION
| RECOMPILE, ENCRYPTION
}
]
[FOR REPLICATION]
AS
instrucciónSQL [...n]
© 2001 P.P. Alarcón, A. Yagüe
8
SQL Server
CREATE TRIGGER nombre ON tabla
[WITH ENCRYPTION]
{ {FOR { [DELETE] [,] [INSERT] [,] [UPDATE] }
[WITH APPEND]
[NOT FOR REPLICATION]
AS
instrucciónSQL [...n] }
|
{FOR { [INSERT] [,] [UPDATE] }
[WITH APPEND]
[NOT FOR REPLICATION]
AS
{IF UPDATE (columna) [{AND | OR} UPDATE (columna)] [...n]
| IF (COLUMNS_UPDATED() {operadorNivelBit} máscaraBitsActualizada)
{ operadorComparación} máscaraBitsColumna [...n]
}
instrucciónSQL [...n]
}
}
© 2001 P.P. Alarcón, A. Yagüe
Cursores
Sintaxis de SQL-92
DECLARE nombreCursor [INSENSITIVE] [SCROLL] CURSOR
FOR instrucciónSELECT
[FOR {READ ONLY | UPDATE [OF listaColumnas [,...n]]}]
•Sintaxis extendida de Transact-SQL (SqlServer)
DECLARE nombreCursor CURSOR
[LOCAL | GLOBAL]
[FORWARD_ONLY | SCROLL]
[STATIC | KEYSET | DYNAMIC | FAST_FORWARD]
[READ_ONLY | SCROLL_LOCKS | OPTIMISTIC]
[TYPE_WARNING]
FOR instrucciónSELECT
[FOR UPDATE [OF nombreColumna [,...n]]]
© 2001 P.P. Alarcón, A. Yagüe
9
4. Arquitectura Cliente/Servidor
? Un
sistema Cliente/Servidor es aquel en el
que dos o más procesos funcionan de
forma independiente pero de forma
cooperativa.
? En un sistema Cliente/Servidor una
aplicación pide datos a otra, una vez
realizada la petición elabora la respuesta y
la devuelve a la aplicación demandante.
© 2001 P.P. Alarcón, A. Yagüe
Arquitectura Cliente/Servidor
Base de
Datos
Disco
Servidor
(SGBD)
SELECT *
FROM CLIENTES
WHERE CIUDAD=‘MADRID’
10
Arquitectura Cliente/Servidor
Servidor
(SGBD)
Cliente
Base de
Datos
Disco
SELECT *
FROM CLIENTES
100.000 filas
•Menor Tráfico en la Red
SELECT *
FROM CLIENTES
WHERE CIUDAD=‘MADRID’
•Menor complejidad en los programas
cliente
10.000 filas
•Menor ocupación de memoria
SELECT *
FROM CLIENTES
WHERE CIUDAD=‘MADRID’
AND EDAD < 18
10 filas
Modelo Cliente/Servidor de dos capas
? Paralelismo
con la implementación física
Ordenador Servidor
Ordenador Cliente
Petició n
Red
Respu
Aplicación
Servidora
esta
Petició n
Respues
ta
Aplicación
Cliente
© 2001 P.P. Alarcón, A. Yagüe
11
Modelo Cliente/Servidor de tres capas
? Componentes
agrupadas por capas
Interface
Interface
Servicios
de datos
Servicios
del negocio
Servicios
de Usuario
© 2001 P.P. Alarcón, A. Yagüe
Análisis del modelo de servicio
El modelo de servicio representa la forma lógica
de agrupar los componentes que se crean.
? El modelo de servicio es independiente de la
plataforma sobre la que se desarrolle.
? Existen tres tipos de servicios:
?
• Servicios de usuario
• Servicios de negocio
• Servicios de datos
© 2001 P.P. Alarcón, A. Yagüe
12
5. Conectividad de Bases de Datos
? ODBC
• Open Data Base Connectivity
(Conectividad de Bases de Datos)
• Anteriormente se utilizaba Sql embebido,
mediante precompiladores
• ODBC permitió que tanto ordenadores
grandes como pequeños utilizasen Sql como
vehículo
© 2001 P.P. Alarcón, A. Yagüe
SQL Embebido
Precompilador
(del SGBDR)
Program Acceso;
Var
....
Begin
.....
EXEC SQL DECLARE CURSOR cli
FOR SELECT * FROM CLIENTES
....
Programa
Fuente
Compilador
Programa
Precompilado
Programa
Objeto
End
SGBDR
BD
13
ODBC
Aplicación
Administrador de Drivers ODBC
Driver Oracle
Consulta:
Clientes
ORACLE
Driver Interbase
Origen de datos:
Albaranes
BD1.GDB
Driver Access (Jet)
Origen de datos:
Productos
BD2.MDB
© 2001 P.P. Alarcón, A. Yagüe
ODBC
Protocolo estándar para el acceso a la
información de servidores de bases de datos
SQL.
? Hay que instalar controladores de ODBC que
permitan que se realice la conexión a estos
servidores de bases de datos SQL.
?
?
La arquitectura de la aplicación/controlador en 32 bits es:
Aplicación
Administrador de
controladores ODBC
Controlador
ODBC
Fuente de
Datos
© 2001 P.P. Alarcón, A. Yagüe
14
ODBC
?
Descripción de las capas:
• Aplicación: realiza llamadas a la API de ODBC para
enviar las instrucciones ODBC y obtener los
resultados.
• Administrador de drivers: realiza dos tareas que
corresponden al modo de funcionamiento oculto y al
modo de funcionamiento mediante interface.
– Oculto: realiza la carga de los drivers por petición de cada
aplicación.
– Interface: realiza el mantenimiento de los drivers y fuentes de
datos.
© 2001 P.P. Alarcón, A. Yagüe
ODBC
?
Descripción de las capas:
• Controlador: recibe las llamadas de la aplicación
hacia las funciones de la API de ODBC y las traduce
al lenguaje nativo de cada servidor.
• Fuente de Datos: es la asociación de un nombre de
fuente con una base de datos del servidor al que se
realiza la conexión. Almacena los elementos
fundamentales de la conexión: ubicación del servidor,
nombre de la base de datos, nombre de usuario y
contraseña, etc.
© 2001 P.P. Alarcón, A. Yagüe
15
ODBC
? Cursores:
• Un cursor es un puntero a las filas resultantes de
una consulta sobre una base de datos.
• Los cursores deben situarse sobre la primera fila y
deben permitir desplazamientos bidireccionales
sobre el conjunto resultado.
• Tipos de cursores:
– Estáticos: no se actualizan.Reflejan el estado de los datos
en el momento de la consulta. (snapshot)
– Dinámicos: refrescan el estado de las memorias locales
cada vez que un usuario realiza una modificación.
– Pseudodinámicos: el refresco de los datos de un registro se
realiza cuando el usuario se sitúa sobre él.
© 2001 P.P. Alarcón, A. Yagüe
ODBC
? Configuración
de ODBC:
• Permite que las aplicaciones se conecten a fuentes
de datos sin importar posteriormente el controlador
que la base de datos lleva asociada.
• Se pueden configurar tres tipos de conexiones:
– DSN de Usuario:
• permite establecer la configuración de la conexión para el equipo
local y para el usuario actual.
– DSN de Sistema:
• permite establecer la configuración de la conexión para el equipo
local y para cualquier usuario de la máquina.
– DSN de Archivo:
• permite establecer la configuración de la conexión para cualquier
usuario con el mismo controlador.
© 2001 P.P. Alarcón, A. Yagüe
16
JDBC
JDBC es para Java lo que ODBC para
Windows.
? Es un conjunto de primitivas que los drivers
JDBC deben poder entender para acceder a
una base de datos.
? Permiten a cualquier programa Java acceder
a bases de datos. El acceso se hace a través
de un driver JDBC específico.
? Es necesario JDBC porque ODBC está
escrito en C y por lo tanto es dependiente de
la máquina.
?
© 2001 P.P. Alarcón, A. Yagüe
JDBC
?
Esquema de conectividad:
© 2001 P.P. Alarcón, A. Yagüe
17
6. Utilización de SQL
? Interacción
con la BD
? Java
? Visual
Basic
© 2001 P.P. Alarcón, A. Yagüe
Interacción con la BD
?
?
Comandos SQL interactivos en modo textual
Comandos embebidos en lenguajes ad-hoc (4gl o
similares) de los gestores
•
•
•
•
?
?
pl/sql de Oracle
Transact-sql de SqlServer
i4gl de Informix
...
Comandos de SQL embebido en programas (Pascal, C,
Cobol, Ada, etc.)
Comandos embebidos en lenguajes con objetos de
acceso a datos y conectividad con bases de datos
(ODBC, JDBC)
© 2001 P.P. Alarcón, A. Yagüe
18
SQL de modo interactivo
?
Ejemplo
SELECT Nombre, Apellidos, Sueldo
FROM Empleados
WHERE sueldo > 2000
Nombre
Apellidos
Sueldo
Rosa
Pablo
Alvarez
Pérez
3000
2500
© 2001 P.P. Alarcón, A. Yagüe
SQL embebido en un lenguaje ad-hoc
?
Ejemplo con PL/SQL de Oracle
declare Salario number;
begin
select Sueldo into Salario
from Empleados
where Code = ’1234’
for update of Sueldo;
if Salario > 500 then
update Empleados set Sueldo = Sueldo * 1.1 where Code = ‘1234’;
else
update Empleados set Sueldo = Sueldo * 1.15 whereCode = ’1234’;
end if;
commit;
exception
when no_data_found then
insert into Errors values(‘Empleado no encontrado',sysdate);
end;
© 2001 P.P. Alarcón, A. Yagüe
19
SQL embebido en un lenguaje externo
?
Ejemplo con Pascal
Write (‘categoria:?');
Readln (categoria);
EXEC SQL DECLARE E CURSOR FOR
SELECT Nombre, Apellidos, Sueldo
FROM Empleados
WHERE categoria = :categoria ;
EXEC SQL OPEN E ;
EXEC SQL FETCH E INTO :nombre, :apellidos, :sueldo;
While SQLCODE = 0 do begin
Write (‘empleado:', nombre, apellidos, ‘aumento?');
Readln (aumento);
EXEC SQL UPDATE Empleados SET Sueldo = Sueldo + :aumento
WHERE CURRENT OF E
EXEC SQL FETCH E INTO :nombre, :apellidos, :sueldo;
End;
EXEC SQL CLOSE CURSOR E;
© 2001 P.P. Alarcón, A. Yagüe
SQL embebido en un lenguaje externo
?
Ejemplo con Java
© 2001 P.P. Alarcón, A. Yagüe
public void buscarCliente (String codEmp) {
try {
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Connection conexion = DriverManager.getConnection ("jdbc:odbc:prueba", "yo", "yo");
Statement sentencia = conexion.createStatement();
sql = "SELECT Nombre,Apellidos,Sueldo FROM Cuentas WHERE E# ='" + codEmp + "'";
ResultSet rs = sentencia.executeQuery(sql);
if (rs.next()) {
String nif
= rs.getString(“Nombre");
String nombre = rs.getString(" Apellidos ");
String apellidos = rs.getString(“Sueldo");
// visualizar los datos
}
else {
System.out.println ("Codigo de empleado no encontrado");
}
rs.close();
}
catch (SQLException ex) {
System.out.println(ex.getMessage); }
}
20
SQL embebido en un lenguaje externo
?
Ejemplo con Visual Basic
Dim miconexion As New ADODB.Connection, micomando As New ADODB.Command
Dim mirecordset As New ADODB.Recordset, msql As String
miconexion.Open "DSN=mibd"
Set micomando.ActiveConnection = miconexion
msql = "SELECT Nombre, Apellidos, Sueldo FROM Empleados " & _
"WHERE E# = " & codEmp
micomando.CommandType = adCmdText
micomando.CommandText = msql
Set mirecordset = micomando.Execute
If Notmirecordset.EOF Then
nombre = mirecordset.Fields(0)
apellidos = mirecordset.Fields(1)
sueldo = mirecordset.Fields(2)
Else
msgbox “Empleado no encontrado"
End If
mirecordset.Close
miconexion.Close
© 2001 P.P. Alarcón, A. Yagüe
Java
?
?
?
?
?
Driver: Permite conectarse a la BD. Es diferente para cada gestor.
DriverManager: permite gestionar los drivers instalados.
DriverPropertyInfo: proporciona la información del driver.
Connection: Representa una conexión a la base de datos.
DatabaseMetadata: da información sobre la base de datos a la que
se acceder. (tablas, etc)
?
?
Statement: permite ejecutar sentencias SQL sin parámetros.
PreparedStatement: permite ejecutar sentencias SQL con
parámetros.
?
CallableStatements: permite ejecutar sentencias SQL con
parámetros de entrada y salida
?
?
Resultset: contiene el conjunto resultado de una consulta
ResultsetMetadata: Obtiene información del resultset.
© 2001 P.P. Alarcón, A. Yagüe
21
Java
? Conexión
(Objeto Connection)
• close()
cierra la conexión de la base de datos
• commit() y rollback()
confirma o rechaza los cambios en la base de datos
• createStatement()
crea un nuevo objeto de sentencia sql
© 2001 P.P. Alarcón, A. Yagüe
Java
? Sentencia
(Objeto Statement)
• close()
– cierra la conexión con la base de datos
• executeQuery(String)
– ejecuta la consulta representada en String
– devuelve un ResultSet con el resultado
• executeUpdate(String)
– ejecuta la sentencia representada en String
– Update, Insert, Delete o sentencias de definición
– devuelve un entero con el número de filas afectadas
© 2001 P.P. Alarcón, A. Yagüe
22
Java
?
Resultado (Objeto ResultSet)
• close()
– cierra la conexión con la base de datos
• findColumn(String)
– devuelve la posición que ocupa la columna String
• getXxxx(int)
– devuelve el valor de la columna que ocupa la columna int en la fila
actual
• getXxxx(String)
– devuelve el valor de la columna String en la fila actual
• next()
– devuelve true si hay mas filas, si no hay devuelve false
© 2001 P.P. Alarcón, A. Yagüe
Java (ejemplo)
Database mibd = new Database();
mibd.setConnection (new borland.jbc1.dataset.ConnectionDescriptor
(“jdbc:odbc:dataset curso”, “SYSDBA”, “masterkey”, false,
“sun.jdbc.odbc.JdbcOdbcDriver”));
Statement mSql = mibd.createStatement ();
ResultSet mRs = mSql.ExecuteQuery
(“select Nombre, categ FROM conductores”);
while (mRs.next()) {
String mNombre = getString(“Nombre”);
int mCateg = getInt(“categ”);
}
© 2001 P.P. Alarcón, A. Yagüe
23
Descargar