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