Vous êtes sur la page 1sur 15

Bases de Datos 3º Informática de Sistemas

TEMA 7.- EL ESTANDAR SQL.


El Sublenguaje de Manipulación.
El Sublenguaje de Definición.
El Sublenguaje de Control.
El Sublenguaje Huésped.

1. El Sublenguaje de Manipulación.
(Se verá en la clase de problemas)

2. El Sublenguaje de Definición.

Permite definir cada relación que pertenece a la base de datos


relacional, incluyendo:

• El esquema de cada relación.


• El dominio de valores permitido a cada atributo.
• Restricciones de Integridad.
• El conjunto de índices que se crean para cada relación.
• Información de seguridad y autorización de cada relación.
• La estructura de almacenamiento físico de cada relación en el
disco.

2.1. Definir una relación.

¾ Para crear una relación mediante SQL, se utiliza la sentencia create


table:

CREATE TABLE [Esquema.]NombreTabla (


{NombreColumna TipoColumna [NOT NULL],}+,
{CONSTRAINT NombreRestricción
{UNIQUE ([NombreColumna,]+) |
CHECK (Condicion) |
PRIMARY KEY ([NombreColumna,]+) |
FOREIGN KEY (NombreColumna) REFERENCES
NombreTabla(NombreColumna)},}*)

El Estándar SQL Página 1 de 15


Bases de Datos 3º Informática de Sistemas

¾ Principales tipos en SQL de ORACLE (TipoColumna).

9 varchar2 (n). Cadena de caracteres de longitud variable, con


un máximo de n caracteres.

9 number. Números sin restricción en la precisión.

9 number (l, d). Números, donde “l” es la longitud y “d” el


número de dígitos decimales.

9 date. Fecha.

9 Blob. Objeto binario de hasta 4 Gb.

2.2. Definir las Restricciones de Integridad en SQL de ORACLE


(CONSTRAINT NombreRestricción).

9 NOT NULL. Establece la obligatoriedad de que la columna tenga


un valor no nulo. Se debe especificar junto a la columna a la que
afecta.

9 UNIQUE. Evita valores repetidos en una o varias columnas,


permitiendo valores nulos.

9 CHECK. Comprueba que se cumpla una condición determinada al


rellenar esa o esas columnas. La condición sólo puede estar
construida con columnas de esta misma tabla.

El Estándar SQL Página 2 de 15


Bases de Datos 3º Informática de Sistemas

9 PRIMARY KEY. Establece el conjunto de columnas que forman la


clave primaria de esta tabla. La restricción garantiza la unicidad y
la obligatoriedad. Sólo puede existir una clave primaria por tabla.

9 FOREIGN KEY. Establece que los valores válidos de la o las


columnas son o bien valores presentes en la o las columnas
referenciadas o bien valores nulos. No hay límite para el número
de claves ajenas en una tabla.

Se puede forzar que cuando una fila de la tabla referenciada sea


borrada, todas las filas de esta tabla cuya clave ajena coincida con
la clave borrada se borren también. Esto se consigue añadiendo la
coletilla ON DELETE CASCADE en la definición de la clave
ajena.

Ejemplo de Sentencia Create Table:

REM
REM Tabla Departamento con un código de departamento, un nombre y
REM una localización.
REM
create table departamento (
codigo_dep varchar2 (3),
nombre varchar2 (15) not null,
localidad varchar2 (15),
constraint dep_pk primary key (codigo_dep),
constraint dep_local check
(localidad in (‘Valladolid’, ‘Soria’, ‘Palencia’))
);

El Estándar SQL Página 3 de 15


Bases de Datos 3º Informática de Sistemas

REM
REM Tabla Empleado
REM
create table empleado (
codigo_emp varchar2 (3),
nombre varchar2(10) not null,
oficio varchar2(11),
fecha_alta date,
salario number(10,2),
codigo_dep varchar2(3)
constraint emp_pk primary key (codigo_emp),
constraint emp_fk foreign key (codigo_dep)
references departamento (codigo_dep) on delete cascade,
constraint emp_ck check (salario > 0)
);

2.3. Modificar o Borrar una Relación.


¾ Para borrar una relación con SQL, se utiliza la sentencia drop table:

DROP TABLE [Esquema.]NombreTabla;


La sentencia borra toda la información de la tabla: el esquema y
todas las tuplas.

¾ Para modificar el esquema de una relación con SQL, se utiliza la


sentencia alter table:

ALTER TABLE [Esquema.]NombreTabla {ADD | MODIFY}


({NombreColumna TipoColumna [NOT NULL],}+);

Esta sentencia permite añadir o modificar atributos de una relación.

ALTER TABLE [Esquema.]NombreTabla {ADD | DROP}


CONSTRAINT NombreRestricción DefiniciónRestricción;

Esta sentencia permite añadir o borrar una restricción.

El Estándar SQL Página 4 de 15


Bases de Datos 3º Informática de Sistemas

2.4. Más Restricciones de Integridad con el SQL de ORACLE.

¾ Triggers

• Un trigger (disparador) define una acción que la base de datos


siempre debería realizar cuando ocurre algún tipo de
acontecimiento que la afecta.

• Se utilizan para
ƒ mantener la integridad referencial,
ƒ asegurar reglas de negocio complejas y
ƒ auditar cambios en los datos.

• Para definir un trigger se debe:


ƒ Especificar las condiciones bajo las que el trigger será
ejecutado.
ƒ Especificar las acciones que se realizarán cuando el trigger
se ejecute.

• Para crear un trigger mediante SQL, se utiliza la sentencia


create trigger:

CREATE TRIGGER NombreTrigger

{before | after | instead of}


{delete | insert | update [of NombreColumna
[, NombreColumna] ...] }
[or {delete | insert | update [of NombreColumna
[, NombreColumna] ...] } ] ...

on {NombreTabla | Nombre-Vista}

[ [referencing { old [as] NombreViejo | new [as] NombreNuevo} ...]


for each {row | statement} [when (Condición)] ] Bloque pl/sql

El Estándar SQL Página 5 de 15


Bases de Datos 3º Informática de Sistemas

¾ Ejemplo de Trigger.

• Supongamos que un banco decide trabajar con los descubiertos


de las cuentas como sigue:

ƒ Pone el saldo de la cuenta a cero.


ƒ Crea una tupla en la tabla Préstamo con la cantidad del
descubierto. Da a este préstamo un número de préstamo
idéntico al número de cuenta que tiene el descubierto.
ƒ Crea una tupla en la tabla de Tomadores de préstamo con
la información del cliente que ha hecho el descubierto.

• La condición para ejecutar el trigger es una modificación en la


relación Cuenta que produzca un valor del atributo Saldo
negativo.

• La sentencia para la creación del trigger es:

create trigger Descubierto


instead of update on Cuenta
for each row when (new.Saldo < 0)
begin
insert into Prestamos values
(old.Id_Sucursal, old.Id_Cuenta, −new.Saldo);
insert into Tomador
(select Nombre_Cliente, Id_Cuenta
from Cliente
where Cliente.Id_Cuenta = old.Id_Cuenta);
update Cuenta
set new.Saldo = 0
where new.Id_Cuenta = old.Id_Cuenta;
end;

El Estándar SQL Página 6 de 15


Bases de Datos 3º Informática de Sistemas

2.5. Crear una vista.

Una vista es la implementación de un esquema externo, según la


Arquitectura ANSI/SPARC, en el Modelo Relacional.

Una vista
• es una tabla virtual,
• no hay ninguna tupla que pertenezca a ella,
• el SGBD sólo conoce su definición.

Una vista se define utilizando al instrucción create view, se le da un


nombre a la vista y se indica la consulta que la va a calcular.

CREATE VIEW NombreVista [(Nombre de Atributos)] AS


<Sentencia de Consulta>;

Cuando se utiliza la vista (quizás como parte de alguna sentencia


SELECT) es cuando el SGBD realiza la consulta que define la vista y
presenta aquellas tuplas que forman parte de la vista.

Las actualizaciones en las vistas están muy restringidas por los


problemas que pueden originar en la consistencia de la información de la
base de datos.

El Estándar SQL Página 7 de 15


Bases de Datos 3º Informática de Sistemas

3. El Sublenguaje de Control.
Los usuarios que han creado objetos en la base de datos (tablas,
vistas, ...) pueden conceder privilegios sobre ellos a otros usuarios por
medio de la orden GRANT.

También pueden conceder la capacidad de hacer concesiones sobre


sus objetos con la opción with grant option.

La sintáxis es:
GRANT Privilegio [, Privilegio ...]
ON Objeto
TO { Usuario | Papel | PUBLIC } [, {Usuario | Papel | PUBLIC}
...]}
[WITH GRANT OPTION]

Los privilegios pueden ser:


SELECT
INSERT
DELETE
UPDATE [(Lista de Columnas)]
ALL

Para denegar los privilegios otorgados, se utiliza la orden REVOKE:

REVOKE Privilegio [, Privilegio ...]


ON Objeto
FROM { Usuario | Papel | PUBLIC } [, {Usuario | Papel |
PUBLIC} ...]}

El Estándar SQL Página 8 de 15


Bases de Datos 3º Informática de Sistemas

4. El Sublenguaje Huésped.

4.1. El lenguaje de programación de Oracle, PL/SQL.

Es un lenguaje estructurado en bloques. Un bloque agrupa declaraciones


y sentencias lógicamente relacionadas.

Un bloque PL/SQL puede tener tres partes:

• La declarativa, [DECLARE <Declaraciones>],


se declaran variables y objetos. Las variables tienen un nombre y son de
un tipo (o son del mismo tipo que un atributo definido en la base de
datos o son de un tipo del SQL):
v_nombre empleado.nombre%TYPE;
v_apellidos VARCHAR2(30);

• La ejecutiva, BEGIN <Sentencias>,


se manipulan esas variables y se procesan los datos. Se pueden utilizar
sentencias condicionales, iterativas o secuenciales, IF-THEN-ELSE,
FOR-LOOP, WHILE-LOOP, ...

• La de excepciones, [EXCEPTION <Excepciones>],


se procesan las excepciones y errores que se producen durante la
ejecución. Las excepciones pueden ser cualquier error definido por el
usuario o bien errores o excepciones de la base de datos. Se detiene la
ejecución normal y se transfiere el control a esta parte.

El Estándar SQL Página 9 de 15


Bases de Datos 3º Informática de Sistemas

Ejemplo: Aumentar en un 10% el salario de aquellos empleados cuyo


salario esté por debajo de la media. Recalcular la media e imprimirla si
es mayor que 50.000€.

EJEMPLO1:
DECLARE salario_med NUMBER;
BEGIN
SELECT avg(salario) INTO salario_med
FROM empleado;
UPDATE empleado
SET salario = salario * 1,1
WHERE salario < salario_med;
SELECT avg(salario) INTO salario_med
FROM empleado;
IF salario_med > 50000 THEN
dbms_output.put_line (‘El salario medio
es ‘ || salario_med);
END IF;
COMMIT;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line (‘Error en la
actualización’);
ROLLBACK;
END;

El Estándar SQL Página 10 de 15


Bases de Datos 3º Informática de Sistemas

4.2. Cursores en PL/SQL.

Cuando una consulta devuelve varias filas, es necesario declarar un


cursor para procesar cada una de ellas individualmente.

Un cursor es similar a una variable de fichero o puntero de fichero, que


señala a una única fila del resultado obtenido.

Se declaran en la parte declarativa del bloque PL/SQL y se manejan y


controlan mediante tres sentencias:

OPEN: Ejecuta la consulta asociada al cursor, se obtienen las filas y se


sitúa el cursor en una posición antes de la primera fila: fila en curso.

FETCH: Introduce los valores de la fila en curso en las variables del


bloque declaradas en el bloque.

CLOSE: Se libera el cursor.

Ejemplo: Mostar el NSS de los empleados cuyo salario es mayor que el


salario de su supervisor.

EJEMPLO2:
salario_emp NUMBER;
salario_superv_emp NUMBER;
nss_emp VARCHAR2(9);
nss_superv_emp VARCHAR2(9);
CURSOR cursor_salario IS
SELECT nss, salario, nss_superv FROM
empleado;

El Estándar SQL Página 11 de 15


Bases de Datos 3º Informática de Sistemas

BEGIN
OPEN cursor_salario;
LOOP
FETCH cursor_salario INTO nss_emp,
salario_emp, nss_superv_emp;
EXIT WHEN cursor_salario%NOTFOUND;
IF nss_superv_emp is NOT NULL THEN
SELECT salario INTO salario_superv_emp
FROM empleado
WHERE nss = nss_superv_emp;
IF salario_emp > salario_superv_emp THEN
dbms_output.put_line (nss_emp);
END IF;
END IF;
END LOOP;
IF cursor_salario%ISOPEN THEN
CLOSE cursor_salario;

EXCEPTION
WHEN NO_DATA_FOUND THEN
dbms_outut.put_line (‘Errores con el NSS
‘ || nss_emp);
IF cursor_salario%ISOPEN THEN
CLOSE cursor_salario;
END;

El Estándar SQL Página 12 de 15


Bases de Datos 3º Informática de Sistemas

4.3. SQL embebido.

En SQL embebido (o huésped) la ejecución de una consulta la realiza el


SGBD y el resultado de la misma se hace disponible al programa, tupla a
tupla (registro a registro).

Un programa con SQL embebido debe tratarse con un precompilador


especial antes de la compilación:

• Las consultas de SQL embebido se sustituyen por declaraciones


escritas en el lenguaje anfitrión y por llamadas a procedimientos
que permiten la ejecución del acceso a la base de datos.
• Tras esta operación, el programa resultado se compila con el
compilador del lenguaje anfitrión.

Para identificar las consultas de SQL embebido, se utiliza la instrucción


EXEC SQL:

EXEC SQL < Instrucción de SQL embebido > END-EXEC

• A las sentencias SQL se les incorpora la cláusula INTO para


indicar las variables de programa sobre las cuales se leerán los
valores de los atributos.

• Se pueden utilizar variables compartidas por el lenguaje huésped y


el SGBD.
- Dentro de las sentencias SQL se identifican con : (dos
puntos) delante del nombre de la variable.

El Estándar SQL Página 13 de 15


Bases de Datos 3º Informática de Sistemas

Ejemplo: Leemos un número de seguridad social y a continuación


obtenemos la tupla EMPLEADO que tiene ese número de seguridad
social:
...
char vnombrep[15], vapellido[15];
int num-seg-soc;

... /* lectura de num-seg-soc del usuario */

EXEC SQL
SELECT nombre, apellido
INTO :vnombrep, :vapellido
FROM empleado
WHERE nss = :num-seg-soc;

sql_error ()
{
EXEC SQL WHENEVER SQLERROR CONTINUE;
printf (“Error detectado \n”);
}

El Estándar SQL Página 14 de 15


Bases de Datos 3º Informática de Sistemas

4.4. Cursores en SQL embebido.

De nuevo, aquí también el resultado de una consulta puede ser un


conjunto de tuplas. Este conjunto se puede manejar de igual modo que se
manipula un fichero, utilizando cursores que nos permiten desplazarnos
por el conjunto.

• La declaración de un cursor se hace para una consulta específica, y


obedece a la siguiente sintaxis:
EXEC SQL DECLARE < cursor > CURSOR FOR < query >

Ejemplo:
EXEC SQL DECLARE emp CURSOR FOR
SELECT nss, nombrep, apellido
FROM Empleado
WHERE nd = :numerod;

• Apertura del Cursor.


EXEC SQL OPEN < cursor >;

• Se accede a cada tupla con la sentencia FETCH.


EXEC SQL FETCH <cursor> INTO :<lista variables>;

El Estándar SQL Página 15 de 15

Vous aimerez peut-être aussi