Upload
luis-garcia
View
25
Download
1
Embed Size (px)
Citation preview
Lenguaje de manipulación de datos
El lenguaje de manipulación 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 colección de
sentencias DML que forman una unidad lógica de trabajo es llamada transacción.
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 transacción puede consistir de tres
operaciones separadas: reducir los ahorros de la cuenta de ahorros, incrementar la cuenta de
cheques y registrar la transacción 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 transacción
pueda ejecutarse, las otras transacciones deben ser desechadas.
Agregando un nuevo registró a una tabla
La grafica de la presentación ilustra la adición 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 Es el nombre de la tabla
column Es el nombre de la columna en la tabla a llenar
value Es el valor correspondiente para la columna
Nota: esta sentencia con la cláusula 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 cláusula INSERT.
Encierre caracteres y valores fechas entre comillas simples; sin embargo, no es recomendable que
encierre entre comillas simples valores numéricos.
Insertando filas con valores nulos
Método Descripción
Implícito Omita la columna del listado de columnas
Explicito Especifique la palabra clave NULL en la lista VALUES; Especifique la cadena vacia(‘’) en la lista VALUES para cadenas de caracteres y fechas.
Asegúrese de poder usar valores nulos para la columna destino verificando la columna con el
comando DESCRIBE.
El servidor Oracle automáticamente hace cumplir todos los tipos de datos, rangos de datos, y
restricciones de integridad de datos.
Cualquier columna que no es listada explícitamente 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 restricción de llave primaria o única.
Algún valor violando la restricción de chequeo (CHECK)
Integridad referencial mantenida por restricciones de llave foránea
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 presentación se registra información para un empleado Popp en la tabla
empleado. Se obtiene la fecha y hora actual en la columna HIRE_DATE. Se usa la función SYSDATE
que retorna y la fecha y hora actual en el servidor de base de datos. Puede usar también la función
CURRENT_DATE para obtener la fecha actual en la sección de zona de tiempo. Puede usar también
la función USER cuando inserta filas en la tabla. La función USER registra el nombre de usuario
actual.
Insertando fechas específicas 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 automáticamente.
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 lógico 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 específico), debe usar la función TO_DATE
El ejemplo en la presentación registra información 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 sustitución en un archivo y ejecutar los comandos en el
archivo. El ejemplo de la presentación registra información para un departamento de la tabla
DEPARTMENTS.
Al Correr el archivo de script inmediatamente se le pregunta por el valor de cada variable de
sustitución. Después de entrar el valor de la variable de sustitución debe presionar el botón 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 presentación para que la sentencia INSERT INTO funcione, debe
haber creado la tabla sales_reps usando la sentencia CREATE TABLE.
En lugar de la cláusula VALUES usa una subconsulta.
Sintaxis
INSERT INTO Tabla [Columna1 (, Columna2)] Subconsulta;
En la sintaxis:
Tabla es el nombre de la tabla
Columna es el nombre de la columna en la tabla a poblar
Subconsulta es la subconsulta que retorna filas a la tabla
El número de columnas y sus tipos de datos en la lista de columnas de la sentencia INSERT debe
concordar con el número de valores y sus tipos de datos en la subconsulta. Cero o más filas son
adicionadas dependiendo del número 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 presentación ilustra cambios en el número 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 es el nombre de la tabla
Column es el nombre de la columna en la tabla a poblar
Value es el valor correspondiente o subconsulta para la columna
Condicion Identifica las filas a ser actualizadas y está compuesta de nombres de
columna, expresiones, constantes, subconsultas y operadores de
comparación
Confirme la operación de actualización por una consulta que muestre los registros de la tabla
actualizados.
Nota: en general, use la columna de llave primaria en la cláusula 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 más de un empleado podría tener el mismo nombre.
Actualizando filas en una tabla
La sentencia UPDATE modifica los valores de una fila específica o filas específicas si la cláusula
WHERE es especificada. El ejemplo en la presentación muestra la transferencia del empleado
113(popp) al departamento 50.
Si omite la cláusula WHERE, los valores de todas las filas de la tabla son modificados.
Actualizando dos columnas con una subconsulta
Puede actualizar múltiples columnas en la cláusula SET de una sentencia UPDATE escribiendo
múltiples subconsultas. La sintaxis es como la siguiente
UPDATE tabla
SET columna1 = (SELECT columna FROM tabla WHERE condicion)
,
Columna2 = (SELECT columna FROM table WHERE condicion)
El ejemplo de la presentación pudo haber escrito también 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 presentación actualiza la tabla COPY_EMP basándose en los valores de la tabla EMPLOYEES.
Cambian el número de departamento de todos los empleados cuyo job_id es igual al del empleado
200 al número de departamento actual del empleado de código 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 gráfica de la
diapositiva.
Sintaxis sentencia DELETE
Puede eliminar filas existentes de una tabla usando la sentencia DELETE.
En la sintaxis:
Table Es el nombre de la tabla
Condition Identifica las filas a ser eliminadas y está compuesta de nombres de
columnas, expresiones, constantes, subconsultas y operadores de
comparación
Nota: Si ninguna fila es eliminada, el mensaje “0 filas eliminadas” es retornado.
Eliminado filas de una tabla
Puede eliminar filas específicas estableciendo la cláusula WHERE en la sentencia DELETE. El primer
ejemplo de la diapositiva elimina el departamento Accounting de la tabla DEPARTMENTS. Puede
confirmar la operación de eliminación desplegando las filas eliminadas usando una sentencia
SELECT.
SELECT * FROM departments WHERE department_name=’Finance’;
Sin embargo, si omite la cláusula 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 basándose en otras tablas
Puede usar subconsultas para eliminar filas de una tabla basándose 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 código del departamento
basándose en que el nombre del departamento contenga la palabra Public. La subconsulta
entonces llena el número de departamento para la consulta principal, la cual elimina filas de la
tabla EMPLOYEES basándose en este número de departamento.
Sentencia TRUNCATE
Un método más eficiente de vaciado de una tabla es usando la sentencia TRUNCATE.
Puede usar la sentencia TRUNCATE para rápidamente eliminar todas las filas de una tabla o grupo.
Eliminar filas con la sentencia TRUNCATE es más rápido que hacerlo con la sentencia DELETE por
las siguientes razones:
La sentencia TRUNCATE es una sentencia del lenguaje de definición de datos (DDL) y no
genera información de rollback.
Truncando una tabla no se disparan los triggers de eliminación de la tabla
Si la tabla es parte de una restricción de integridad referencial, no podrá truncar la tabla. Necesita
deshabilitar la restricción antes de emitir la sentencia TRUNCATE.
Transacciones de bases de datos
El servidor Oracle asegura la consistencia de los datos basándose en transacciones. Las
transacciones dan más 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 débito en una cuenta y
crédito a otra cuenta por la misma cantidad. Ambas acciones deben fallar en conjunto o
completarse en conjunto.
Tipos de transacciones:
Tipo Descripción
Lenguaje de manipulación de datos (DML)
Consiste en cualquier número de sentencias DML que el servidor Oracle puede tratar como una única entidad o unidad lógica de trabajo
Lenguaje de definición 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
¿Cuándo una transacción inicia y finaliza?
Una transacción 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 máquina falla o el sistema se cae
Después que una transacción termina, la próxima sentencia SQL automáticamente inicia la
siguiente transacción.
Una sentencia DDL o una sentencia DCL es automáticamente confirmada y por lo tanto
implícitamente termina la transacción.
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 explícito de transacciones
Puede controlar la lógica de las transacciones usando las sentencias COMMIT, ROLLBACK y
SAVEPOINT.
Sentencia Descripción
COMMIT Termina la transacción actual haciendo todos los cambios pendientes permanentes
SAVEPOINT name Marca un punto de retorno para la transacción actual
ROLLBACK ROLLBACK termina la transacción actual descartando todos los cambios pendientes
ROLLBACK TO SAVEPOINT name ROLLBACK TO SAVEPOINT hace retroceder la transacción actual a un punto específico de retorno, así descartando cualquier cambio o punto de retorno que fueron creados después del punto de retorno al cual estamos regresando. Si omite la cláusula TO SAVEPOINT, la sentencia ROLLBACK retrocede la transacción entera. Como los puntos de retornos son lógicos, no hay forma de listar los puntos de retornos creados.
Nota: no puede hacer COMMIT a un SAVEPOINT, el SAVEPOINT no es del estándar ANSI SQL
Retrocediendo cambios hasta una marca
Puede crear marcas en la transacción actual usando la sentencia SAVEPOINT, la cual divide la
transacción en pequeñas 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 implícito de transacciones
Estado Circunstancia
Commit automático Una sentencia DDL o DCL es realizada SQL Developer o SQL *Plus sale normalmente, sin usar explícitamente los comando COMMIT ni ROLLBACK
Rollback automático Terminación anormal de SQL Developer o SQL *Plus o falla del sistema
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 aún ser usada de manera explícita.
También, 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 opción Autocommit in SQL Worksheet.
Fallas del sistema
Cuando una transacción es interrumpida por una falla del sistema, la transacción entera es
automáticamente 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 sesión es cumplida seleccionando EXIT desde el menú
FILE. En SQL *Plus, una salida normal es cumplida entrando el comando EXIT en la línea 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 transacción es temporal hasta que la transacción es
confirmada.
El estado de los datos antes de las sentencias COMMIT y ROLLBACK puede ser descrito de la
siguiente forma:
Operaciones de manipulación 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 manipulación de datos
consultando las tablas
Otros usuarios no pueden ver los resultados de operaciones de manipulación de datos
realizados por el usuario actual.
Las filas afectadas son bloqueadas
Estado de los datos después de un COMMIT
Haga todos los cambios pendientes permanentes usando la sentencia COMMIT. Aquí esta lo que
pasa después de una sentencia COMMIT:
Cambios de los datos son escritos a la base de datos
El estado previo de los datos no están más disponibles con sentencias SQL normales
Todos los usuarios pueden ver los resultados de la transacción
Los bloqueos en las filas afectadas es liberado; Las filas están 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 después 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 después 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 transacción puede ser descartada mediante un rollback implícito si un error de
ejecución de sentencia es detectado. Si una única sentencia DML falla durante la ejecución de la
transacción, sus efectos son deshechos por un statement – level rollback, pero los cambios
realizados por las sentencias DML previas en la transacción no son descartadas. Ellas pueden ser
confirmadas o deshechas explícitamente por el usuario.
El servidor Oracle emite un Commit implícito antes y después 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 explícitamente 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 están 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 propósito de la lectura consistente es asegurar que cada usuario vea los datos tal y como existen
en la última operación de confirmación, antes de que una operación DML inicie.
Nota: El mismo usuario puede iniciar varias sesiones. Cada sesión tendrá consistencia de lectura
en la forma descrita anteriormente, incluso si es el mismo usuario.
Implementación de lectura consistente
Lectura consistente es una implementación automática. 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 están siendo modificados y que aún no
han sido confirmados desde el segmento de rehacer.
Cuando una operación 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 fotografía 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 demás ven la fotografía 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 después que la confirmación se ha realizado. El
espacio ocupado por los viejos datos del archivo de segmento de rehacer es liberado para re uso.
Si la transacción se deshace, los cambios son deshechos
La original vieja versión 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 transacción
iniciara.
Clausula FOR UPDATE en la sentencia SELECT
Cuando usted expide una sentencia SELECT en la base de datos para consultar algunos registros,
ningún bloqueo se establece en las filas seleccionadas. En general, esto es requerido porque el
número de registros bloqueados en cualquier momento específico (por defecto) se mantiene al
mínimo: solo aquellos registros que han sido modificados pero aún no son confirmados son
bloqueados. Incluso entonces, otros podrán leer esos registros como aparecían antes del cambio
(la imagen anterior de los datos). Hay algunas veces, sin embargo, cuando podría necesitar
bloquear un conjunto de registros incluso antes de modificarlos en su programa. Oracle ofrece la
cláusula 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) automáticamente 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 más podrá modificar alguno de estos registros hasta que usted realice un
ROLLBACK o un COMMIT.
Puede adjuntar la palabra clave NOWAIT para la cláusula 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
cláusula NOWAIT, su proceso se bloquea hasta que la tabla esté disponible, cuando el bloqueo es
liberado por el otro usuario mediante la expedición del comando COMMIT o ROLLBACK.
Cláusula 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 cláusula FOR UPDATE no lo restringe a modificar solo esas columnas de
las filas seleccionadas. Bloqueos aún están sobre todas las filas; si usted simplemente coloca FOR
UPDATE en la consulta y no incluye una o más columnas después de la palabra clave OF, la base de
datos bloqueara todas las filas identificadas a través de todas las tablas listadas en la cláusula
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.