Sie sind auf Seite 1von 41

Lenguaje de manipulacin de datos El lenguaje de manipulacin de datos (DML) es una parte central de SQL.

Cuando necesite agregar, actualizar o eliminar un dato en la base de datos, se ejecuta una sentencia DML. Una coleccin de sentencias DML que forman una unidad lgica de trabajo es llamada transaccin. Considere una base de datos de un banco. Cuando un cliente del banco transfiere dinero desde una cuenta de ahorros a una cuenta de cheques, la transaccin puede consistir de tres operaciones separadas: reducir los ahorros de la cuenta de ahorros, incrementar la cuenta de cheques y registrar la transaccin en un registro de transacciones. El servidor Oracle debe garantizar que todas las tres sentencias SQL son realizadas para mantener las cuentas en el balance adecuado. Cuando algo evita que una de las sentencias en la transaccin pueda ejecutarse, las otras transacciones deben ser desechadas.

Agregando un nuevo registr a una tabla La grafica de la presentacin ilustra la adicin de un nuevo departamento a la tabla DEPARTMENTS

Sintaxis sentencia INSERT Puede adicionar nuevos registros a una tabla usando la sentencia INSERT En la sintaxis table column value Es el nombre de la tabla Es el nombre de la columna en la tabla a llenar Es el valor correspondiente para la columna

Nota: esta sentencia con la clusula VALUES adiciona solo una fila a la vez a la tabla.

Insertando nuevas filas Debido a que puede insertar una nueva fila que contiene valores para cada columna, la lista de columnas no es obligatoria en una clausula INSERT. Sin embargo, si no usa la lista de columnas, los valores deben ser listados de acuerdo al orden por defecto de las columnas de la tabla, y un valor debe ser provisto por cada columna.

Por claridad, use la lista de columnas en la clusula INSERT. Encierre caracteres y valores fechas entre comillas simples; sin embargo, no es recomendable que encierre entre comillas simples valores numricos.

Insertando filas con valores nulos Mtodo Implcito Explicito Descripcin Omita la columna del listado de columnas Especifique la palabra clave NULL en la lista VALUES; Especifique la cadena vacia() en la lista VALUES para cadenas de caracteres y fechas.

Asegrese de poder usar valores nulos para la columna destino verificando la columna con el comando DESCRIBE. El servidor Oracle automticamente hace cumplir todos los tipos de datos, rangos de datos, y restricciones de integridad de datos. Cualquier columna que no es listada explcitamente obtiene un valor nulo en la nueva fila. Errores comunes que pueden ocurrir durante el ingreso de datos por el usuario son listados en el siguiente orden: Valores obligatorios faltantes para una columna NOT NULL. Valores duplicados violando cualquier restriccin de llave primaria o nica. Algn valor violando la restriccin de chequeo (CHECK) Integridad referencial mantenida por restricciones de llave fornea

Tipos de datos no equivalentes o valores muy grandes para llenar una columna

Nota: El uso de la lista de columnas es recomendable ya que hace la sentencia INSERT mas legible y segura o menos propensa a errores.

Insertando Valores especiales Puede usar funciones para insertar valores especiales a una tabla. En el ejemplo de la presentacin se registra informacin para un empleado Popp en la tabla empleado. Se obtiene la fecha y hora actual en la columna HIRE_DATE. Se usa la funcin SYSDATE que retorna y la fecha y hora actual en el servidor de base de datos. Puede usar tambin la funcin CURRENT_DATE para obtener la fecha actual en la seccin de zona de tiempo. Puede usar tambin la funcin USER cuando inserta filas en la tabla. La funcin USER registra el nombre de usuario actual.

Insertando fechas especficas y valores de tiempo El formato DD-MON-RR es generalmente utilizado para insertar un valor fecha. Con el formato RR, el sistema brinda la centuria correcta automticamente. Puede de igual forma proveer una fecha en el formato DD-MON-YYYY. Este es recomendado porque claramente especifica la centuria y no depende del formato lgico interno RR para especificar la centuria. Si la fecha necesita ser ingresada en un formato diferente al definido por defecto (por ejemplo, con otra centuria o un tiempo especfico), debe usar la funcin TO_DATE El ejemplo en la presentacin registra informacin para el empleado Raphealy en la tabla EMPLOYEES. Se ingresa el valor feb 3, 1999 para la columna HIRE_DATE.

Creando un Script Puede grabar comandos con variables de sustitucin en un archivo y ejecutar los comandos en el archivo. El ejemplo de la presentacin registra informacin para un departamento de la tabla DEPARTMENTS. Al Correr el archivo de script inmediatamente se le pregunta por el valor de cada variable de sustitucin. Despus de entrar el valor de la variable de sustitucin debe presionar el botn Ok. Los valores entonces ingresados son sustituidos en la sentencia. Esto permite correr el mismo script una y otra vez pero proveyendo valores diferentes cada vez que se ejecuta.

Copiando filas de otra tabla Puede usar la sentencia INSERT para agregar filas con datos provenientes de datos en tablas existentes. En el ejemplo de la presentacin para que la sentencia INSERT INTO funcione, debe haber creado la tabla sales_reps usando la sentencia CREATE TABLE. En lugar de la clusula VALUES usa una subconsulta. Sintaxis INSERT INTO Tabla [Columna1 (, Columna2)] Subconsulta; En la sintaxis: Tabla Columna Subconsulta es el nombre de la tabla es el nombre de la columna en la tabla a poblar es la subconsulta que retorna filas a la tabla

El nmero de columnas y sus tipos de datos en la lista de columnas de la sentencia INSERT debe concordar con el nmero de valores y sus tipos de datos en la subconsulta. Cero o ms filas son adicionadas dependiendo del nmero de filas retornadas por la subconsulta. Para crear una copia de las filas de una tabla, use SELECT * en la subconsulta.

Cambiando datos en una tabla La presentacin ilustra cambios en el nmero de departamento para empleados en el departamento 60 al departamento 80

Sintaxis de la sentencia UPDATE Puede modificar los valores existentes en una tabla usando la sentencia UPDATE. En la sintaxis: Table Column Value Condicion es el nombre de la tabla es el nombre de la columna en la tabla a poblar es el valor correspondiente o subconsulta para la columna Identifica las filas a ser actualizadas y est compuesta de nombres de columna, expresiones, constantes, subconsultas y operadores de comparacin

Confirme la operacin de actualizacin por una consulta que muestre los registros de la tabla actualizados. Nota: en general, use la columna de llave primaria en la clusula WHERE para identificar una nica fila para actualizar. Usando otras columnas puede de manera inesperada causar varias filas actualizadas. Por ejemplo, identificando una fila nica en la tabla EMPLOYEES por el nombre es peligroso, porque ms de un empleado podra tener el mismo nombre.

Actualizando filas en una tabla La sentencia UPDATE modifica los valores de una fila especfica o filas especficas si la clusula WHERE es especificada. El ejemplo en la presentacin muestra la transferencia del empleado 113(popp) al departamento 50. Si omite la clusula WHERE, los valores de todas las filas de la tabla son modificados.

Actualizando dos columnas con una subconsulta Puede actualizar mltiples columnas en la clusula SET de una sentencia UPDATE escribiendo mltiples subconsultas. La sintaxis es como la siguiente UPDATE SET tabla columna1 = (SELECT columna FROM tabla WHERE condicion) , Columna2 = (SELECT columna FROM table WHERE condicion) El ejemplo de la presentacin pudo haber escrito tambin de la siguiente forma; UPDATE employees SET (job_id,salary) = (SELECT job_id, salary FROM employees WHERE employee_id=205) WHERE employee_id = 113;

Actualizando filas basadas en otra tabla Puede usar subconsultas en la sentencia UPDATE para actualizar valores en una tabla. El ejemplo en la presentacin actualiza la tabla COPY_EMP basndose en los valores de la tabla EMPLOYEES. Cambian el nmero de departamento de todos los empleados cuyo job_id es igual al del empleado 200 al nmero de departamento actual del empleado de cdigo 100.

Eliminando una fila de una tabla El departamento Contracting ha sido eliminado de la tabla DEPARTMENTS (asumiendo que no se han violado restricciones en la tabla DEPARTMENTS), como se muestra en la grfica de la diapositiva.

Sintaxis sentencia DELETE Puede eliminar filas existentes de una tabla usando la sentencia DELETE. En la sintaxis: Table Condition Es el nombre de la tabla Identifica las filas a ser eliminadas y est compuesta de nombres de columnas, expresiones, constantes, subconsultas y operadores de comparacin

Nota: Si ninguna fila es eliminada, el mensaje 0 filas eliminadas es retornado.

Eliminado filas de una tabla Puede eliminar filas especficas estableciendo la clusula WHERE en la sentencia DELETE. El primer ejemplo de la diapositiva elimina el departamento Accounting de la tabla DEPARTMENTS. Puede confirmar la operacin de eliminacin desplegando las filas eliminadas usando una sentencia SELECT. SELECT * FROM departments WHERE department_name=Finance; Sin embargo, si omite la clusula WHERE, todas las filas en la tabla son eliminadas. El segundo ejemplo en la diapositiva elimina todas las filas de la tabla COPY_EMP, porque no hay clausula WHERE especificada. Ejemplos:

Eliminando filas basndose en otras tablas Puede usar subconsultas para eliminar filas de una tabla basndose en valores de otra tabla. El ejemplo en la diapositiva elimina todos los empleados en un departamento, donde el nombre del departamento contiene la palabra Public. La subconsulta explora la tabla DEPARTMENTS encontrando el cdigo del departamento basndose en que el nombre del departamento contenga la palabra Public. La subconsulta entonces llena el nmero de departamento para la consulta principal, la cual elimina filas de la tabla EMPLOYEES basndose en este nmero de departamento.

Sentencia TRUNCATE Un mtodo ms eficiente de vaciado de una tabla es usando la sentencia TRUNCATE. Puede usar la sentencia TRUNCATE para rpidamente eliminar todas las filas de una tabla o grupo. Eliminar filas con la sentencia TRUNCATE es ms rpido que hacerlo con la sentencia DELETE por las siguientes razones: La sentencia TRUNCATE es una sentencia del lenguaje de definicin de datos (DDL) y no genera informacin de rollback. Truncando una tabla no se disparan los triggers de eliminacin de la tabla

Si la tabla es parte de una restriccin de integridad referencial, no podr truncar la tabla. Necesita deshabilitar la restriccin antes de emitir la sentencia TRUNCATE.

Transacciones de bases de datos El servidor Oracle asegura la consistencia de los datos basndose en transacciones. Las transacciones dan ms flexibilidad y control cuando se cambian los datos, y aseguran la consistencia de los datos en eventos de fallos de procesos de usuario o fallos del sistema. Las transacciones constan de sentencias DML que constituyen un cambio consistente de datos. Por ejemplo, una transferencia de fondos entre dos cuentas debe incluir el dbito en una cuenta y crdito a otra cuenta por la misma cantidad. Ambas acciones deben fallar en conjunto o completarse en conjunto. Tipos de transacciones: Tipo Descripcin Lenguaje de manipulacin de datos Consiste en cualquier nmero de sentencias DML que (DML) el servidor Oracle puede tratar como una nica entidad o unidad lgica de trabajo Lenguaje de definicin de datos (DDL) Consiste en solo una sentencia DDL Lenguaje de control de datos (DCL) Consiste en solo una sentencia DCL

Transacciones de Bases de datos; Inicio y Fin Cundo una transaccin inicia y finaliza? Una transaccin inicia cuando la primera sentencia DML es encontrada y finaliza cuando uno de los siguientes eventos ocurre: Una sentencia COMMIT o ROLLBACK es emitida Una sentencia DDL, tal como CREATE es omitida Una sentencia DCL es omitida El usuario se sale de SQL Developer o SQL *Plus La mquina falla o el sistema se cae

Despus que una transaccin termina, la prxima sentencia SQL automticamente inicia la siguiente transaccin. Una sentencia DDL o una sentencia DCL es automticamente confirmada y por lo tanto implcitamente termina la transaccin.

Ventajas de las sentencias COMMIT y ROLLBACK Con las sentencias COMMIT y ROLLBACK, puede controlar el hacer en los cambios de manera permanente.

Sentencias del control explcito de transacciones Puede controlar la lgica de las transacciones usando las sentencias COMMIT, ROLLBACK y SAVEPOINT. Sentencia COMMIT SAVEPOINT name ROLLBACK ROLLBACK TO SAVEPOINT name Descripcin Termina la transaccin actual haciendo todos los cambios pendientes permanentes Marca un punto de retorno para la transaccin actual ROLLBACK termina la transaccin actual descartando todos los cambios pendientes ROLLBACK TO SAVEPOINT hace retroceder la transaccin actual a un punto especfico de retorno, as descartando cualquier cambio o punto de retorno que fueron creados despus del punto de retorno al cual estamos regresando. Si omite la clusula TO SAVEPOINT, la sentencia ROLLBACK retrocede la transaccin entera. Como los puntos de retornos son lgicos, no hay forma de listar los puntos de retornos creados.

Nota: no puede hacer COMMIT a un SAVEPOINT, el SAVEPOINT no es del estndar ANSI SQL

Retrocediendo cambios hasta una marca Puede crear marcas en la transaccin actual usando la sentencia SAVEPOINT, la cual divide la transaccin en pequeas secciones. Puede entonces descartar cambios pendientes hasta una marca usando la sentencia ROLLBACK TO SAVEPOINT. Note, que si crea un segundo punto de retorno con el mismo nombre de un punto de retorno previo, el punto de retorno previo es eliminado.

Proceso implcito de transacciones Estado Commit automtico Circunstancia Una sentencia DDL o DCL es realizada SQL Developer o SQL *Plus sale normalmente, sin usar explcitamente los comando COMMIT ni ROLLBACK Terminacin anormal de SQL Developer o SQL *Plus o falla del sistema

Rollback automtico

Nota: En SQL *Plus, el comando AUTOCOMMIT puede ser fijada ON u OFF. Si es fijada ON, cada sentencia individual DML es confirmada tan pronto como es ejecutada. No puede deshacer los cambios. Si es fijada en OFF, la sentencia COMMIT puede an ser usada de manera explcita. Tambin, la sentencia COMMIT es expedida cuando una sentencia DDL es emitida o cuando se sale de SQL *Plus. El comando SET AUTOCOMMIT ON/OFF es saltada en SQL Developer. Un DML es confirmado en una salida normal de SQL Developer solo si tiene habilitada la preferencia AUTOCOMMIT. Para habilitar el AUTOCOMMIT, desarrolle lo siguiente: En el men Tools, seleccione Preferences. En el cuadro de dialogo de Preferences, expanda Database y seleccione Worksheet Parameters. El panel derecho, chequee la opcin Autocommit in SQL Worksheet.

Fallas del sistema Cuando una transaccin es interrumpida por una falla del sistema, la transaccin entera es automticamente descartada. Esto previene que el error cause cambios no deseados a los datos y retorna las tablas al estado anterior al ltimo COMMIT. De este modo, el servidor Oracle protege la integridad de las tablas. En SQL Developer, una salida normal de la sesin es cumplida seleccionando EXIT desde el men FILE. En SQL *Plus, una salida normal es cumplida entrando el comando EXIT en la lnea de comandos. Cerrar la ventana es considerada como una salida anormal.

Estado de los datos antes de un COMMIT o ROLLBACK Cada cambio de dato hecho durante una transaccin es temporal hasta que la transaccin es confirmada. El estado de los datos antes de las sentencias COMMIT y ROLLBACK puede ser descrito de la siguiente forma: Operaciones de manipulacin de datos afectan primeramente el buffer de la base de datos; por lo tanto, el estado previo de los datos puede ser recuperado. El usuario actual puede revisar los resultados de operaciones de manipulacin de datos consultando las tablas Otros usuarios no pueden ver los resultados de operaciones de manipulacin de datos realizados por el usuario actual. Las filas afectadas son bloqueadas

Estado de los datos despus de un COMMIT Haga todos los cambios pendientes permanentes usando la sentencia COMMIT. Aqu esta lo que pasa despus de una sentencia COMMIT: Cambios de los datos son escritos a la base de datos El estado previo de los datos no estn ms disponibles con sentencias SQL normales Todos los usuarios pueden ver los resultados de la transaccin Los bloqueos en las filas afectadas es liberado; Las filas estn ahora disponibles para que otros usuarios puedan realizar nuevos cambios Todo los puntos de retorno son eliminados

Confirmando datos En el ejemplo de la diapositiva, una fila es eliminada de la tabla EMPLOYEES y una nueva fila es insertada en la tabla DEPARTMENTS. Los cambios son grabados usando la sentencia COMMIT. Ejemplo: Eliminar los departamentos 209 y 300 en la tabla DEPARTMENTS y actualizar una fila en la tabla EMPLOYEES. Almacenar los cambios.

Estado de los datos despus de un ROLLBACK Descarte todos los cambios pendientes usando la sentencia ROLLBACK, la cual resulta en lo siguiente; Los cambios de datos son deshechos El estado previo de los datos es restaurado Bloqueos en las filas afectadas son liberados.

Estado delos datos despus de un ROLLBACK: ejemplo Mientras intenta eliminar un registro de la tabla TEST, puede accidentalmente vaciar la tabla. Sin embargo, puede corregir el error reeditando una sentencia apropiada, y hacer los cambios de los datos permanentes.

Nivel Sentencia Rollback Una parte de la transaccin puede ser descartada mediante un rollback implcito si un error de ejecucin de sentencia es detectado. Si una nica sentencia DML falla durante la ejecucin de la transaccin, sus efectos son deshechos por un statement level rollback, pero los cambios realizados por las sentencias DML previas en la transaccin no son descartadas. Ellas pueden ser confirmadas o deshechas explcitamente por el usuario. El servidor Oracle emite un Commit implcito antes y despus de cualquier sentencia DDL. Incluso si su sentencia DDL no se ejecuta satisfactoriamente, no puede deshacer las sentencias previas porque el servidor emiti un commit. Termine sus transacciones explcitamente ejecutando una sentencia COMMIT o ROLLBACK

Lectura Consistente Usuarios de la base de datos acceden a ella de dos formas: Operaciones de lectura (sentencias SELECT) Operaciones de escritura (Sentencias INSERT, UPDATE y DELETE)

Usted necesita leer consistentemente de manera que ocurra lo siguiente: El lector y escritor de la base de datos tienen asegurados una vista consistente de los datos Lectores no ven datos que estn en proceso de ser modificados Escritores tienen asegurado que los cambios a la base de datos se realizan de una manera consistente Cambios hechos por un escritor no desordenan ni entran en conflicto con cambios realizados por otro escritor.

El propsito de la lectura consistente es asegurar que cada usuario vea los datos tal y como existen en la ltima operacin de confirmacin, antes de que una operacin DML inicie. Nota: El mismo usuario puede iniciar varias sesiones. Cada sesin tendr consistencia de lectura en la forma descrita anteriormente, incluso si es el mismo usuario.

Implementacin de lectura consistente Lectura consistente es una implementacin automtica. Conserva una copia parcial de la base de datos en los segmentos de rehacer. La imagen de lectura consistente es construida de los datos confirmados de la tabla y los datos viejos de la tabla que estn siendo modificados y que an no han sido confirmados desde el segmento de rehacer. Cuando una operacin INSERT, UPDATE o DELETE es echa en la base de datos, el servidor Oracle toma de los datos antes de que sean modificados y la escribe en el segmento de rehacer. Todos los lectores, excepto el que realiza el cambio, ve la base de datos como estaba antes de que los cambios iniciaran; ellos ven una fotografa de lo que est en el segmento de rehacer. Antes que los cambios son confirmados en la base de datos, solamente el usuario que realiza los cambios ve la base de datos con las alteraciones. Todos los dems ven la fotografa del segmento de rehacer. Esto garantiza a los lectores la lectura consistente de los datos que no est actualmente sometida a cambios. Cuando una sentencia DML es confirmada, los cambios realizados a la base de datos se vuelven visibles a cada uno usando una sentencia SELECT despus que la confirmacin se ha realizado. El espacio ocupado por los viejos datos del archivo de segmento de rehacer es liberado para re uso. Si la transaccin se deshace, los cambios son deshechos

La original vieja versin de los datos en el segmento de rehacer es escrita de nuevo a la tabla Todos los usuarios ven la base de datos tal como estaba antes de que la transaccin iniciara.

Clausula FOR UPDATE en la sentencia SELECT Cuando usted expide una sentencia SELECT en la base de datos para consultar algunos registros, ningn bloqueo se establece en las filas seleccionadas. En general, esto es requerido porque el nmero de registros bloqueados en cualquier momento especfico (por defecto) se mantiene al mnimo: solo aquellos registros que han sido modificados pero an no son confirmados son bloqueados. Incluso entonces, otros podrn leer esos registros como aparecan antes del cambio (la imagen anterior de los datos). Hay algunas veces, sin embargo, cuando podra necesitar bloquear un conjunto de registros incluso antes de modificarlos en su programa. Oracle ofrece la clusula FOR UPDATE de la sentencia SELECT para realizar este bloqueo. Cuando expide una sentencia SELECT FOR UPDATE, el sistema administrador de la base de datos relacional (RDBMS) automticamente obtiene bloqueos exclusivos a nivel de registros en todos los registros identificados por la sentencia SELECT, as conserva estos registros para sus cambios solamente. Nadie ms podr modificar alguno de estos registros hasta que usted realice un ROLLBACK o un COMMIT. Puede adjuntar la palabra clave NOWAIT para la clusula FOR UPDATE para decirle al servidor Oracle que no espere si la tabla ha sido bloqueada por otro usuario. En este caso, el control ser retornado inmediatamente a su programa o a su ambiente de SQL Developer para que pueda realizar otro trabajo, o esperar por un periodo de tiempo antes de intentar de nuevo. Sin la

clusula NOWAIT, su proceso se bloquea hasta que la tabla est disponible, cuando el bloqueo es liberado por el otro usuario mediante la expedicin del comando COMMIT o ROLLBACK.

Clusula FOR UPDATE: ejemplos En el ejemplo de la dispositiva, la sentencia bloquea las filas en la tabla EMPLOYEES con el campo JOB_ID igual a ST_CLERK y el campo LOCATION_ID igual a 1500, y bloquea las filas en la tabla DEPARTMENTS con un campo DEPARTMENTE_LOCATION igual a 1500. Puede usar el FOR UPDATE OF nombre de columna para cualificar la columna que intenta modificar. La lista OF de la clusula FOR UPDATE no lo restringe a modificar solo esas columnas de las filas seleccionadas. Bloqueos an estn sobre todas las filas; si usted simplemente coloca FOR UPDATE en la consulta y no incluye una o ms columnas despus de la palabra clave OF, la base de datos bloqueara todas las filas identificadas a travs de todas las tablas listadas en la clusula FROM. A siguiente sentencia bloquea solo esas filas en la tabla EMPLOYEES con ST_CLERK localizadas en LOCATION_ID 1500. Ninguna fila es bloqueada en la tabla DEPARTMENTS

En la siguiente sentencia, la base de datos es instruida para esperar por 5 segundos por la fila para que est disponible, y luego retornar el control a usted.

Das könnte Ihnen auch gefallen