11 Manejo de datos

Anuncio
Capítulo 11 – Manejo de datos
Bases de Datos
Generalidades
El lenguaje de manipulación de datos o DML (Data Manipulation Language) es una parte central de SQL.
Cuando se quiere agregar, modificar, o eliminar datos de la base de datos, se ejecuta una sentencia DML.
Un conjunto de sentencias DML que aún no se han hecho permanentes se denomina una transacción o unidad de
trabajo lógica.
Comandos de Manejo de Datos
Comando
INSERT
UPDATE
DELETE
Descripción
Agrega una nueva fila a una tabla
Modifica filas de una tabla
Elimina filas de una tabla
Comandos de Control de Transacciones
Comando
COMMIT
SAVEPOINT
ROLLBACK
Descripción
Hace permanentes todos los cambios pendientes
Establece marcas intermedias, permitiendo hacer rollback parcial
Descarta todos los cambios pendientes de los datos
Insertar una Fila Nueva en una Tabla
Se puede agregar una nueva fila a una tabla por medio del comando INSERT.
Sintaxis
INSERT INTO tabla [(columna [, columna, ...])]
VALUES
(valor [, valor ...]);
Donde: tabla
columna
valor
es el nombre de la tabla.
es el nombre de la columna en la tabla
es la condición que combina (o relaciona) las tablas.
El comando INSERT con la cláusula VALUES inserta únicamente una fila en la tabla cada vez que se ejecuta.
La lista de columnas no es requerida en la cláusula INSERT, en caso de omitirla, los valores deben ser
ingresados de acuerdo al orden que por defecto tienen las columnas en la tabla.
Los valores de tipo carácter y fecha se deben encerrar entre comillas simples. No encerrar los valores numéricos.
Ejemplo
Combinar las tablas de empleados y departamentos para visualizar el nombre del empleado, numero y nombre
del departamento.
SQL> DESCRIBE s_dept
Nombre
------------------------------ID
NAME
REGION_ID
SQL> INSERT INTO
2 VALUES
¿Nulo?
Tipo
-------- ----NOT NULL NUMBER(7)
NOT NULL VARCHAR2(25)
NUMBER(7)
s_dept
(11, ’Finance’, 2);
1 fila creada.
11 - 1
Capítulo 11 – Manejo de datos
Bases de Datos
Insertar Filas Nuevas con Valores Nulos (NULL)
Sólo se permitirá insertar valores nulos en columnas que no tengan restricción NOT NULL.
Existen dos formas de insertar valores nulos:
Método Implícito
Omitir la columna en la lista , y por consecuencia no incorporar el valor en VALUES
Ejemplo
SQL> INSERT INTO
2 VALUES
s_dept (id, name)
(12,'Nuevo');
1 fila creada.
Método Explícito
Especificar la palabra clave NULL en la lista VALUES. Para cadenas de caracteres y fechas, también se puede
especificar una cadena vacía (‘’).
Ejemplo
SQL> INSERT INTO
2 VALUES
s_dept
(13,'Personal',NULL);
1 fila creada.
Insertar Valores Especiales Usando Funciones SQL
Se puede usar pseudocolumnas para ingresar valores especiales en una fila.
Por ejemplo USER devuelve el nombre del usuario actual, SYSDATE devuelve la fecha y hora actuales.
Si en la columna en que se ingresa la fecha no es relevante la hora actual, es aconsejable truncar la fecha antes de
insertarla para evitar tener que hacerlo cada vez que se recupere el dato.
Ejemplo
SQL>
2
3
4
INSERT INTO s_emp
(id, first_name, last_name, userid, salary, start_date)
VALUES
(26, 'Juan', 'Perez', USER, NULL, TRUNC(SYSDATE) );
1 fila creada.
Confirmación de Altas
SQL> SELECT id, first_name, last_name, userid, salary, start_date
2 FROM
s_emp
3 WHERE id = 26;
ID FIRST_NAME
LAST_NAME
USERID
SALARY START_DA
--------- ------------------------- ------------------------- -------- --------- -------26 Juan
Perez
SUSANA
23/11/99
11 - 2
Capítulo 11 – Manejo de datos
Bases de Datos
Insertar Valores Específicos de Fecha y Hora
Cuando se ingresa un valor de fecha, usualmente el formato usado es ‘dd/mm/yy’. Con este formato, se debe
recordar que el siglo por defecto es el actual. Como la fecha también información de la hora, por defecto toma la
medianoche (00:00:00).
Si se requiere ingresar una fecha en otro siglo y hora específicos, usar la función TO_DATE.
Ejemplo
Ingresar un nuevo registro en la tabla S_EMP. Registrar la fecha de ingreso en la columna START_DATE el 10
de diciembre de 1992 a la 8:00.
SQL>
2
3
4
5
INSERT INTO s_emp
(id, first_name, last_name, userid, salary, start_date)
VALUES
(27, 'Marta','Fernandez','mfernan',NULL,
TO_DATE('10/12/92 08:00','DD/MM/YY HH:MI'))
1 fila creada.
Insertar Valores Usando Variables de Sustitución
Se puede producir un comando INSERT que le permita al usuario agregar valores interactivamente usando
variables de sustitución en SQL*Plus.
Para valores de tipo carácter, el ampersand y el nombre de la variable van encerrados entre comillas simples.
Ejemplo
Grabar información para un departamento en la tabla S_DEPT. Hacer que el usuario ingrese el número de
departamento, el nombre del mismo y el número de región.
SQL>
2
3
4
INSERT INTO s_dept
(id, name, region_id)
VALUES
(&department_id, '&department_name', &region_id)
Introduzca un valor para department_id: 55
Introduzca un valor para department_name: Contaduria
Introduzca un valor para region_id: 1
antiguo
4: (&department_id, '&department_name', &region_id)
nuevo
4: (55, 'Contaduria', 1)
1 fila creada.
Archivo de Comandos para Manipular los Datos
Se puede salvar comandos con variables de sustitución a un archivo para después ejecutarlo.
Cada vez que se ejecuta el comando, solicitará nuevos valores.
Personalizar los prompts usando el comando ACCEPT de SQL*Plus.
Cuando se requiere ingresar el mismo valor en diferentes tablas, se puede solicitar el mismo sólo una vez con el
comando ACCEPT y luego usar la variable tantas veces como sea necesario, incorporando los comandos
INSERT correspondientes en el archivo de comandos.
11 - 3
Capítulo 11 – Manejo de datos
Bases de Datos
Copiar Filas desde Otra Tabla
Se puede usar la sentencia INSERT para agregar filas a una tabla donde los valores derivan de otras tablas ya
existentes.
En lugar de la cláusula VALUES, usar una subconsulta. Esto permite ingresar a la tabla tantas filas como
recupere la subconsulta.
La cantidad de columnas recuperadas por la subconsulta deberá ser igual a la cantidad de columnas a ingresar a
la tabla y deberán corresponderse en cuanto al tipo de datos.
La subconsulta puede contener funciones de fila o de grupo, join, subconsultas anidadas, etc.
No puede contener la cláusula ORDER BY.
Sintaxis
INSERT INTO tabla [(columna [, columna, ...])]
subquery;
Donde: tabla
columna
subquery
es el nombre de la tabla.
es el nombre de la columna en la tabla
es la subconsulta que devuelve las filas para llenar la tabla.
Ejemplo
Copiar las filas seleccionadas de la tabla S_EMP a la tabla S_EMP_HIST.
SQL>
2
3
4
5
6
INSERT INTO s_emp_hist
(id, nombre, cargo, salario, fecha_ingreso, fecha_baja)
SELECT id, last_name||', '||first_name, title, salary,
start_date, TRUNC(SYSDATE)
FROM
s_emp
WHERE start_date < TO_DATE('31/12/90');
10 filas creadas.
Confirmación de Altas
SQL> SELECT *
2 FROM
s_emp_hist;
ID
------1
2
4
5
7
8
11
17
22
23
NOMBRE
---------------------------Velasquez, Carmen
Ngao, LaDoris
Quick-To-See, Mark
Ropeburn, Audry
Menchu, Roberta
Biri, Ben
Magee, Colin
Smith, George
Chang, Eddie
Patel, Radha
FECHA_IN
-------03/03/90
08/03/90
07/04/90
04/03/90
14/05/90
07/04/90
14/05/90
08/03/90
30/11/90
17/10/90
CARGO
SALARIO FECHA_BA
------------------------- --------- -------President
2500 23/11/99
VP, Operations
1450 23/11/99
VP, Finance
1450 23/11/99
VP, Administration
1550 23/11/99
Warehouse Manager
1250 23/11/99
Warehouse Manager
1100 23/11/99
Sales Representative
1500 23/11/99
Stock Clerk
940 23/11/99
Stock Clerk
800 23/11/99
Stock Clerk
795 23/11/99
10 filas seleccionadas.
11 - 4
Capítulo 11 – Manejo de datos
Bases de Datos
Actualizar Filas
Para modificar filas existentes en una tabla, se usará el comando UPDATE.
Si se omite la cláusula WHERE, todas las filas de la tabla serán actualizadas.
En general es preferible usar la primary key para identificar una fila en particular. El uso de otras columnas
puede causar que inesperadamente se actualicen varias filas. Por ejemplo, identificar una fila en la tabla S_EMP
por el apellido es peligroso porque varios empleados pueden tener el mismo.
Es aconsejable probar primero la cláusula WHERE con una sentencia SELECT para asegurar que sólo se
actualizarán las filas necesarias.
Sintaxis
UPDATE
SET
[WHERE
tabla
columna = valor [,columna = valor ...]
condición] ;
Donde: tabla
columna
valor
condición
es el nombre de la tabla.
es el nombre de la columna que se desea modificar
es valor a asignar o una subconsulta para la columna
identifica las filas a ser actualizadas. Puede estar compuesta por nombres de
columnas, expresiones, constantes, subconsultas y operadores de comparación.
Ejemplo
Transferir el empleado número 2 al departamento 10. Transferir el empleado número 1 al departamento 32 y
cambiarle el sueldo a 2550. Confirmar ambos cambios.
SQL> UPDATE s_emp
2 SET
dept_id = 10
3 WHERE id = 2;
1 fila actualizada.
SQL> UPDATE s_emp
2 SET
dept_id = 32, salary = 2550
3* WHERE id = 1;
1 fila actualizada.
SQL> SELECT id, last_name, salary, dept_id
2 FROM
s_emp
3 WHERE id IN (1,2);
ID
--------2
1
LAST_NAME
SALARY
DEPT_ID
------------------------- --------- --------Ngao
1450
10
Velasquez
2550
32
Ejemplo: Subconsulta en cláusula WHERE
Incrementar un 10 % el salario para los empleados que ganen menos que el promedio de su departamento.
SQL> UPDATE s_emp e
2 SET
salary=salary*1.10
3 WHERE salary < (select avg(salary)
4
from s_emp
5
where dept_id=e.dept_id);
9 filas actualizadas.
11 - 5
Capítulo 11 – Manejo de datos
Bases de Datos
Error de Restricción de Integridad
Durante la actualización de filas, el Servidor Oracle7 verifica las restricciones de integridad, es decir que si se
intenta actualizar un registro con un valor que viola una restricción, se producirá un error.
SQL> UPDATE s_emp
2 SET
dept_id = 66
3 WHERE id = 15
UPDATE s_emp
*
ERROR en línea 1:
ORA-02291: restricción de integridad (USR.S_EMP_DEPT_ID_FK) violada clave padre no encontrada
Eliminar Filas
Para eliminar filas existentes en una tabla, se usará el comando DELETE.
Si se omite la cláusula WHERE, se eliminarán todas las filas de la tabla.
En general es preferible usar la primary key para ientificar una fila en particular.
Es aconsejable probar primero la cláusula WHERE con una sentencia SELECT para asegurar que sólo se
eliminarán las filas necesarias.
Sintaxis
DELETE FROM tabla
[WHERE condición] ;
Donde: tabla
condición
es el nombre de la tabla.
identifica las filas a ser eliminadas. Puede estar compuesta por nombres de
columnas, expresiones, constantes, subconsultas y operadores de comparación.
Ejemplo
Eliminar los items 6 y 7 de la orden de compra 101
SQL> DELETE FROM s_item
2 WHERE ord_id=101 AND item_id IN (6,7);
2 filas borradas.
Error de Restricción de Integridad
Durante la eliminación de filas, el Servidor Oracle7 verifica las restricciones de integridad, es decir que si se
intenta eliminar un registro ‘padre’ que tiene registros ‘hijos’ (relacionados por una clave foranea), se producirá
un error.
SQL> DELETE FROM s_emp
2 WHERE id = 31
delete from s_dept
*
ERROR en línea 1:
ORA-02292: restricción de integridad (USR.S_EMP_DEPT_ID_FK) violada registro hijo encontrado
11 - 6
Capítulo 11 – Manejo de datos
Bases de Datos
Procesamiento de Transacciones
El Servidor Oracle7 asegura consistencia de los datos basándose en transacciones. Las transacciones otorgan más
flexibilidad y control cuando cambian los datos y aseguran consistencia en los datos ante una eventual falla en el
proceso del usuaeio o una falla en el sistema.
Las transaciones consisten en comandos DML que llevan a cabo un cambio en los datos de manera consistente.
Por ejemplo, una transferencia de fondos entre dos cuentas, debiera incluir un crédito en una cuenta y un débito
en la otra por la misma cantidad. Ambas acciones debieran tener éxito o fallar como una sola operación. El
crédito no debiera poder confirmarse sin el débito correspondiente.
Tipos de Transacciones
Tipo
Manipulación de
Datos (DML)
Definición de Datos
(DDL)
Control de Datos
(DCL)
Descripción
Consiste en un número cualquiera de sentencias DML que el Servidor Oracle7 trata
como una entidad simple o unidad de trabajo lógica.
Consiste en una sentencia DDL solamente.
Consiste en una sentencia DCL solamente.
Cuándo comienza y cuándo termina una Transacción
Una transacción comienza cuando se encuentra el primer comando SQL ejecutable y termina cuando ocurre uno
de los siguientes eventos:





Un comando COMMIT o ROLLBACK.
Un comando DDL, tal como CREATE o un comando DCL.
Se detectan ciertos errores, tales como deadlocks.
El usuario finaliza su sesión de SQL*Plus.
Una falla o caída del sistema.
Después de terminada una transacción, la próxima sentencia SQL ejecutable da comienzo a la próxima
transacción
Control de Transacciones
COMMIT
INSERT
Savepoint A
UPDATE
Savepoint B
INSERT
DELETE
ROLLBACK
ROLLBACK
ROLLBACK a A
11 - 7
ROLLBACK a B
Capítulo 11 – Manejo de datos
Bases de Datos
Sentencias para el Control Explícito de Transacciones
El control lógico de las transacciones se realiza usando las sentencias COMMINT, SAVEPOINT y ROLLBACK
Tipo
COMMINT
SAVEPOINT nombre
ROLLBACK [TO
SAVEPOINT nombre]
Descripción
Finaliza la transacción actual haciendo que todos los cambios pendiente pasen a ser
permanentes.
Realiza un savepoint (marca) dentro de la transacción en curso
Finaliza la transacción en curso descartando los cambios pendientes.
Procesamiento Implícito de Transacciones
Un COMMIT o ROLLBACK automático se produce bajo las siguientes circunstancias:
Status
Commit Automático
Commit Automático
Rollback Automático
Circunstancia
Se aplica un comando DDL (como CREATE) o DCL (como GRANT)
Salida normal de una sesión SQL*Plus, sin realizar un COMMINT o ROLLBACK
explícito.
Terminación anormal de una sesión SQL*Plus, o falla del sistema.
Confirmación de Cambios
Cada cambio en los datos que es efectuado durante la transacción es temporario hasta que la transacción sea
confirmada, ya sea explícitamente o en forma implícita.
Estado de los Datos antes de un COMMIT o ROLLBACK




Las operaciones de manipulación de datos afectan principalmente al buffer de la base de datos, en
consecuencia, el estado previo de los datos puede ser recuperado.
El usuario actual puede revisar los resultados de sus operaciones consultando las tablas.
Otros usuarios no pueden ver los resultados de la manipulación de los datos hechos por el actual usuario.
Oracle7 establece la consistencia en la lectura para asegurar que cada usuario vea los datos como existen
desde el último commit.
Las filas afectadas son bloqueadas o loked; otros usuarios no pueden cambiar los datos dentro de esas filas.
Estado de los datos después del ROLLBACK
Para descartar los cambios pendientes se usa la sentencia ROLLBACK. Luego de un ROLLBACK:
 Los cambios a los datos son deshechos.
 Se restaura el estado anterior de los datos.
 Se levantan los bloqueos a las filas afectadas; esas filas están ahora disponibles para que otros usuarios las
puedan modificar.
Ejemplo
Vaciar la tabla S_ITEM. Verificar que la tabla no contenga registros.
SQL> DELETE
2> FROM s_item;
62 filas borradas.
SQL> SELECT * FROM s_item;
ninguna fila seleccionada
11 - 8
Capítulo 11 – Manejo de datos
Bases de Datos
Volver atrás la operación. Verificar que se hayan recuperado los registros borrados.
SQL> ROLLBACK;
Rollback terminado.
SQL> SELECT count(*)
2 FROM
s_item;
COUNT(*)
--------62
Revertir las modificaciones hasta un punto de marca o Savepoint
Se puede crear una marca en una transacción usando el comando SAVEPOINT. En consecuencia, la transacción
puede dividirse en dos secciones más pequeñas. Esto permite que se descarten los cambios hechos hasta la marca
usando la sentencia ROLLBACK TO SAVEPOINT.
Ejemplo
SQL> SELECT id, last_name, salary FROM
2 WHERE id IN (3,8);
ID
--------8
3
s_emp
LAST_NAME
SALARY
------------------------- --------Biri
1100
Nagayama
1500
SQL> UPDATE s_emp SET
2 WHERE id=8;
1 fila actualizada.
salary=2100
SQL> SAVEPOINT a;
Punto de seguridad creado.
SQL> UPDATE s_emp SET
2 WHERE id=3;
1 fila actualizada.
salary=2500
SQL> SELECT id, last_name, salary FROM
2 WHERE id IN (3,8);
ID
--------8
3
s_emp
LAST_NAME
SALARY
------------------------- --------Biri
2100
Nagayama
2500
SQL> ROLLBACK TO a;
Rollback terminado.
SQL> SELECT id, last_name, salary FROM
2 WHERE id IN (3,8);
ID
--------8
3
s_emp
LAST_NAME
SALARY
------------------------- --------Biri
2100
Nagayama
1500
11 - 9
Capítulo 11 – Manejo de datos
Bases de Datos
Rollback a Nivel Sentencia
Parte de una transacción puede ser descartada por un rollback implícito si se detecta un error en la ejecución de
la sentencia.
Si una sentencia DML falla durante la ejecución de una transacción, su efecto es revertido por un rollback a nivel
sentencia, pero no se descartarán los cambios efectuados por las sentencias DML previas a la transacción. Las
mismas pueden confirmarse o no de manera explícita por el usuario.
Oracle produce un COMMIT implícito antes y después de cualquier sentencia DDL. De esta m anera, aunque la
sentencia DDL no se ejecute con éxito, no se pueden deshacer los cambios previos a la sentencia DDL porque el
servidor ya ha realizado un commit.
11 - 10
Descargar