buscador

Visita

Mostrando las entradas con la etiqueta Sintaxis de las Sentencias INSERT. Mostrar todas las entradas
Mostrando las entradas con la etiqueta Sintaxis de las Sentencias INSERT. Mostrar todas las entradas

mi茅rcoles, 11 de enero de 2023

SQL Capitulo 9 : Manipulaci贸n de Datos en SQL Developer

Sean bienvenidos a esta secci贸n donde se revisa acerca de la manipulaci贸n de datos en SQL, recuerden estas sentencias estan siendo ejecutadas en SQL developer administrador de la Base de datos Oracle.

Objetivos de la publicaci贸n:
Al finalizar esta lecci贸n, deber铆a estar capacitado para lo siguiente:
  • Describir cada sentencia de lenguaje de manipulaci贸n de datos (DML)
  • Insertar filas en una tabla
  • Actualizar filas en una tabla
  • Suprimir filas de una tabla
  • Controlar transacciones
En esta lecci贸n aprender谩 a utilizar las sentencias de lenguaje de manipulaci贸n de datos (DML) para insertar filas en una tabla, actualizar filas existentes en una tabla y suprimir filas existentes de una tabla. Tambi茅n aprender谩 a controlar transacciones con las sentencias COMMIT, SAVEPOINT y ROLLBACK.


Adici贸n de nuevas filas a una tabla
Sentencia INSERT

Lenguaje de Manipulaci贸n de Datos
Las sentencias DML se ejecutan al:
  • Agregar nuevas filas a una tabla
  • Modificar filas existentes en una tabla
  • Eliminar filas existentes de una tabla
  • Una transacci贸n consta de una recopilaci贸n de sentencias DML que forman una unidad l贸gica de trabajo.
El lenguaje de manipulaci贸n de datos (DML) es una parte fundamentalmente de SQL. Para agregar, actualizar o suprimir los datos de la base de datos, ejecute una sentencia DML. La recopilaci贸n de sentencias DML que forman una unidad l贸gica de trabajo se denomina transacci贸n. 
Piense en una base de datos bancaria. Cuando un cliente del banco transfiere dinero de su cuenta de ahorro a una cuenta corriente, la transacci贸n puede constar de las siguientes tres acciones diferentes: reducir la cuenta de ahorro, aumentar la cuenta corriente y registrar la transacci贸n en el diario de transacciones. El servidor de Oracle debe garantizar que se ejecuten las tres sentencias SQL para mantener el balance correcto de las cuentas. Si algo impide que una de las sentencias de la transacci贸n se ejecute, las dem谩s sentencias de la transacci贸n se deben deshacer.



Nota :La mayor铆a de las sentencias DML de esta lecci贸n asumen que no se ha violado ninguna restricci贸n de esta tabla. Las restricciones se tratar谩n m谩s adelante. 

En SQL Developer, haga clic en el icono Run Script o pulse [F5] para ejecutar las sentencias DML. Los mensajes de comentarios se mostrar谩n en la p谩gina con separadores Script Output.

Adici贸n de una Nueva Fila a una Tabla

El gr谩fico ilustra un nuevo departamento a la tabla DEPARTMENTS.

Sintaxis de las Sentencias INSERT
Agregar nuevas filas a una tabla mediante la sentencia INSERT:

Con esta sintaxis, s贸lo se inserta una fila cada vez.

Puede agregar nuevas filas a una tabla emitiendo la sentencia INSERT. 
En la sintaxis:
table es el nombre de la tabla.
column es el nombre de la columna de la tabla que se debe rellenar.
value es el valor correspondiente para la columna.

Nota: esta sentencia con la cl谩usula VALUES agrega s贸lo una fila cada vez a la tabla.

Inserci贸n de Filas
Insertar una nueva fila que contenga los valores de cada columna.
Mostrar valores en el orden por defecto de las columnas de la tabla.
Opcionalmente, mostrar la lista de columnas en la cl谩usula INSERT.

Encerrar valores de caracteres y de fecha entre comillas simples.

Puesto que puede insertar una nueva fila que contenga los valores de cada columna, no es necesaria la lista de columnas en la cl谩usula INSERT. Sin embargo, si no utiliza la lista de columnas, los valores se deben mostrar seg煤n el orden por defecto de las columnas en la tabla y se debe proporcionar un valor para cada columna. 

DESCRIBE departments

Para mayor claridad, utilice la lista de columnas en la cl谩usula INSERT. Encierre los valores de caracteres y fecha entre comillas simples; sin embargo, no se recomienda encerrar valores num茅ricos entre comillas simples. 

Inserci贸n de Filas con Valores Nulos
M茅todo impl铆cito: omitir la columna de la lista de columnas.
M茅todo expl铆cita: especificar la palabra clave NULL en la cl谩usula VALUES.

Aseg煤rese de que puede utilizar valores nulos en la columna de destino mediante la verificaci贸n del estado Null con el comando DESCRIBE.

El servidor de Oracle aplica autom谩ticamente todos los tipos de dato, rangos de datos y restricciones de integridad de los datos. Las columnas que no se muestran expl铆citamente obtienen un valor nulo en la nueva fila. 
Los errores comunes que se producen durante la entrada del usuario se comprueban en el siguiente orden: 
  • Valor obligatorio que falta para una columna NOT NULL
  • Valor duplicado que viola cualquier restricci贸n de clave 煤nica o primaria
  • Cualquier valor que viole una restricci贸n CHECK
  • Mantenimiento de la integridad referencial para la restricci贸n de clave ajena
  • No coincidencias de tipo de dato o valores demasiado anchos para la columna
Nota: se recomienda el uso de la lista de columnas porque hace la sentencia INSERT m谩s legible y fiable o menos proclive a errores.

Inserci贸n de Valores Especiales
La funci贸n SYSDATE registra la fecha y hora actuales.



Puede utilizar funciones para introducir valores especiales en la tabla. 

En el ejemplo se registra informaci贸n sobre el empleado Popp en la tabla EMPLOYEES. Proporciona la fecha y hora actuales en la columna HIRE_DATE. Utiliza la funci贸n SYSDATE que devuelve la fecha y hora actuales del servidor de base de datos. Tambi茅n puede utilizar la funci贸n CURRENT_DATE para obtener la fecha actual en la zona horaria de la sesi贸n. Adem谩s puede utilizar la funci贸n USER al insertar filas en la tabla. La funci贸n USER registra el nombre de usuario actual.

Confirmaci贸n de Adiciones a la Tabla

SELECT employee_id, last_name, job_id, hire_date, commission_pct
FROM   employees
WHERE  employee_id = 113;

Inserci贸n de Valores de Fecha y Hora Espec铆ficos
Agregar un nuevo empleado.

Verificar la adici贸n.

El formato DD-MON-RR se suele utilizar para insertar el valor de fecha. Con el formato RR, el sistema proporciona el siglo correcto autom谩ticamente.
Tambi茅n puede especificar el valor de fecha en formato DD-MON-YYYY. Se recomienda hacerlo as铆 porque especifica de forma clara el siglo y no depende de la l贸gica de formato RR interna de la especificaci贸n del siglo correcto.
Si necesita introducir una fecha en un formato diferente al formato por defecto (por ejemplo, con otro siglo o con una hora concreta), debe utilizar la funci贸n TO_DATE.
En el ejemplo se registra informaci贸n del empleado Raphealy en la tabla EMPLOYEES. Define la columna HIRE_DATE en el 3 de febrero de 1999. 



Creaci贸n de un Script 
Utilizar el car谩cter de sustituci贸n & en una sentencia SQL para solicitar valores.
& es un marcador de posici贸n del valor de la variable.

Puede guardar comandos con variables de sustituci贸n en un archivo y ejecutar los comandos en el archivo. En el ejemplo se registra informaci贸n sobre un departamento de la tabla DEPARTMENTS. 
Ejecute el script y se le solicitar谩 una entrada para cada una de las variables de sustituci贸n (&). Despu茅s de introducir un valor para la variable de sustituci贸n, haga clic en el bot贸n OK. Los valores que introduce el usuario son los que se sustituyen en la sentencia. Esto permite ejecutar el mismo script una y otra vez, pero proporcionar un juego de valores diferente cada vez que lo ejecute.

Copia de Filas de Otra Tabla
Escribir la sentencia INSERT con una subconsulta:

No utilizar la cl谩usula VALUES.
Hacer coincidir el n煤mero de columnas de la cl谩usula INSERT con el de la subconsulta.
Inserta todas las filas devueltas por la subconsulta en la tabla, sales_reps.


Puede utilizar la sentencia INSERT para agregar filas a la tabla en la que se derivan los valores de las tablas existentes. En el ejemplo, para que la sentencia INSERT INTO funcione, debe haber creado antes la tabla sales_reps mediante la sentencia CREATE TABLE. CREATE TABLE se trata en la lecci贸n titulada “Uso de Sentencias DDL para Crear y Gestionar Tablas”. 
En lugar de la cl谩usula VALUES, utilice una subconsulta. 

Sintaxis

INSERT INTO table [ column (, column) ] subquery

En la sintaxis:
table es el nombre de la tabla.
column es el nombre de la columna de la tabla que se debe rellenar.
subquery         es la subconsulta que devuelve filas a la tabla.

El n煤mero de columnas y sus tipos de dato de la lista de columnas de la cl谩usula INSERT deben coincidir con el n煤mero de valores y sus tipos de dato en la subconsulta. Se agregan cero o m谩s filas en funci贸n del n煤mero de filas devueltas por la subconsulta. Para crear una copia de la filas de una tabla, utilice SELECT * en la subconsulta:

INSERT INTO copy_emp
    SELECT
    FROM   employees;

Cambio de datos en la tabla
Sentencia UPDATE
Cambio de Datos en la Tabla

La ilustra muestra el cambio de n煤mero de departamento para los empleados del departamento 60 al departamento 80.

Sintaxis de Sentencias UPDATE
Modificar los valores existentes en una tabla con la sentencia UPDATE:
Actualizar m谩s de una fila cada vez (si es necesario).

Puede modificar los valores existentes en una tabla mediante la sentencia UPDATE.
En la sintaxis:
table es el nombre de la tabla.
column es el nombre de la columna de la tabla que se debe rellenar.
value es el valor o subconsulta correspondiente para la columna.
condition     identifica las filas que se deben actualizar y se compone de nombres de columna, expresiones, constantes, subconsultas y operadores de comparaci贸n.

Para confirmar la operaci贸n de actualizaci贸n, consulte la tabla para visualizar las filas actualizadas. 
Para obtener m谩s informaci贸n, consulte la secci贸n sobre “UPDATE” en Oracle Database SQL Language Reference (Referencia sobre Lenguaje SQL de Oracle Database).

Nota: en general, la primera columna de clave primaria se utiliza en la cl谩usula WHERE para identificar una 煤nica fila para la actualizaci贸n. El uso de otras columnas puede provocar una actualizaci贸n inesperada de varias filas. Por ejemplo, identificar una fila de la tabla EMPLOYEES por nombre es peligroso, ya que puede que m谩s de un empleado tengan el mismo nombre. 

Actualizaci贸n de Filas en una Tabla
Si se especifica la cl谩usula WHERE, se modifican los valores de una fila o varias filas espec铆ficas:

Si se omite la cl谩usula WHERE, se modifican los valores de todas las filas de la tabla:

Especificar SET column_name= NULL para actualizar un valor de columna a NULL.

La sentencia UPDATE modifica los valores de una fila o varias filas espec铆ficas si se especifica la cl谩usula WHERE. El ejemplo muestra la transferencia del empleado 113 (Popp) al departamento 50. 
Si omite la cl谩usula WHERE, se modifican todas las filas de la tabla. Examine las filas actualizadas en la tabla COPY_EMP.

   SELECT last_name, department_id
   FROM   copy_emp;

Por ejemplo, un empleado que era SA_REP ahora ha cambiado su puesto a IT_PROG. Por lo tanto, se debe actualizar su JOB_ID y el campo de comisiones se debe definir en NULL.

UPDATE employees
SET job_id = 'IT_PROG', commission_pct = NULL
WHERE employee_id = 114;

Nota: la tabla COPY_EMP tiene los mismos datos que la tabla EMPLOYEES.

Actualizaci贸n de Dos Columnas con una Subconsulta
Actualizar el cargo y el salario del empleado 113 para que coincida con los del empleado 205.



Puede actualizar varias columnas en la cl谩usula SET de una sentencia UPDATE mediante la escritura de varias subconsultas. La sintaxis es la siguiente: 

 UPDATE table
 SET     column  = 
(SELECT column
                 FROM table
               WHERE condition) [ ,
                                         column  = 
              (SELECT column
               FROM table
               WHERE condition)]
 [WHERE  condition ] ;

El ejemplo  tambi茅n se puede escribir del siguiente modo:

UPDATE employees 
SET (job_id, salary)  = (SELECT  job_id, salary 
                    FROM    employees 
                    WHERE   employee_id = 205)
WHERE    employee_id    =  113;

Actualizaci贸n de Filas Basada en Otra Tabla
Utilizar subconsultas en las sentencias UPDATE para actualizar los valores de fila de una tabla seg煤n los valores de otra tabla:

Puede utilizar las subconsultas UPDATE para actualizar las filas de una tabla. El ejemplo de la diapositiva actualiza la tabla COPY_EMP seg煤n los valores de la tabla EMPLOYEES. Cambia el n煤mero de departamento de todos los empleados con el ID de cargo del empleado 200 al n煤mero de departamento actual del empleado 100.

Actualizaci贸n de Filas Basada en Otra Tabla
Utilizar subconsultas en las sentencias UPDATE para actualizar los valores de fila de una tabla seg煤n los valores de otra tabla:

Puede utilizar las subconsultas UPDATE para actualizar las filas de una tabla. El ejemplo de la diapositiva actualiza la tabla COPY_EMP seg煤n los valores de la tabla EMPLOYEES. Cambia el n煤mero de departamento de todos los empleados con el ID de cargo del empleado 200 al n煤mero de departamento actual del empleado 100.

Eliminaci贸n de filas de una tabla:
Sentencia DELETE
Sentencia TRUNCATE

Eliminaci贸n de Filas de Tablas

El departamento de contratos se ha eliminado de la tabla DEPARTMENTS (siempre que no haya violado ninguna restricci贸n en la tabla DEPARTMENTS), como se muestra en el gr谩fico.

Sentencia DELETE
Puede eliminar filas existentes de una tabla mediante la sentencia DELETE:
Puede eliminar filas existentes de una tabla mediante la sentencia DELETE.

En la sintaxis:
table es el nombre de la tabla.
condition    identifica las filas que se deben suprimir y se compone de nombres de columna, expresiones, constantes, subconsultas y operadores de comparaci贸n.

Nota: si no se suprime ninguna fila, se devuelve el mensaje “0 rows deleted” (en el separador Script Output de SQL Developer).
Para obtener m谩s informaci贸n, consulte la secci贸n sobre “DELETE” en Oracle Database SQL Language Reference (Referencia sobre Lenguaje SQL de Oracle Database).

Supresi贸n de Filas de Tablas
Se suprimen filas concretas si se especifica la cl谩usula WHERE:

Se suprimen todas las filas de la tabla si omite la cl谩usula WHERE:

Puede suprimir filas concretas mediante la especificaci贸n de la cl谩usula WHERE en la sentencia DELETE. En el primer ejemplo se suprime el departamento Accounting de la tabla DEPARTMENTS. Para confirmar la operaci贸n de supresi贸n, visualice las filas suprimidas con la sentencia SELECT. 

    SELECT  *
    FROM    departments
    WHERE  department_name = 'Finance';

Si omite la cl谩usula WHERE, se suprimen todas las filas de la tabla. En el segundo ejemplo se suprimen todas las filas de la tabla COPY_EMP, porque no se ha especificado ninguna cl谩usula WHERE.

Ejemplo:
Se eliminan las filas identificadas en la cl谩usula WHERE.

DELETE FROM  employees WHERE employee_id = 114;

DELETE FROM  departments WHERE department_id IN (30, 40);

Supresi贸n de Filas Basada en Otra Tabla
Utilizar subconsultas en las sentencias DELETE para eliminar filas de una tabla seg煤n los valores de otra tabla:

Puede utilizar subconsultas para suprimir filas de una tabla seg煤n los valores de otra tabla. En el ejemplo se suprimen todos los empleados de un departamento, donde el nombre del departamento consta de la cadena Public.

La subconsulta busca en la tabla DEPARTMENTS el n煤mero de departamento seg煤n el nombre de departamento que contenga la cadena Public. A continuaci贸n, la subconsulta introduce el n煤mero de departamento en la consulta principal, con lo que se suprimen las filas de datos de la tabla EMPLOYEES en base a este n煤mero de departamento.

Sentencia TRUNCATE
Elimina todas las filas de una tabla, dejando la tabla vac铆a y la estructura de la misma intacta.
Es una sentencia de lenguaje de definici贸n de datos (DDL) en lugar de una sentencia DML; no se puede deshacer f谩cilmente.
Sintaxis:
Ejemplo:
Una forma m谩s eficaz de vaciar una tabla es con la sentencia TRUNCATE. Puede utilizar la sentencia TRUNCATE para eliminar f谩cilmente todas las filas de una tabla o un cluster. La eliminaci贸n de filas con las sentencia TRUNCATE es m谩s r谩pida que la eliminaci贸n con la sentencia DELETE por las siguientes razones:
La sentencia TRUNCATE es una sentencia de lenguaje de definici贸n de datos (DDL) y no genera ninguna informaci贸n de rollback. La informaci贸n de rollback se trata m谩s adelante en esta lecci贸n.
El truncamiento de una tabla no arranca los disparadores de supresi贸n de la tabla. 
Si la tabla es el principal de una restricci贸n de integridad referencial, no puede truncarla. Debe desactivar la restricci贸n antes de emitir la sentencia TRUNCATE. La desactivaci贸n de restricciones se trata en la lecci贸n titulada “Uso de Sentencias DDL para Crear y Gestionar Tablas”.

Control de transacciones de base de datos mediante COMMIT, ROLLBACK y SAVEPOINT
Transacciones de Base de Datos
Una transacci贸n de base de datos consiste en una de las siguientes opciones:
  • Sentencias DML que constituyen un cambio consistente de los datos
  • Una sentencia DDL
  • Una sentencia de lenguaje de control de datos (DCL)
El servidor de Oracle garantiza la consistencia de los datos basada en transacciones. Las transacciones proporcionan m谩s flexibilidad y control al cambiar los datos y garantizan la consistencia de los datos en caso de fallo de proceso de usuario o del sistema.
Las transacciones constan de sentencias DML que suponen un cambio en los datos. Por ejemplo, una transferencia de fondos entre dos cuentas debe incluir un d茅bito en una cuenta y un cr茅dito en otra por la misma cantidad. Ambas acciones deben ser correctas o incorrectas por igual; el cr茅dito no se debe confirmar sin el d茅bito.



Transacciones de la Base de Datos: Inicio y Fin
Empezar cuando se ejecute la primera sentencia SQL de DML.
Terminar con uno de los siguientes eventos:
Se emite una sentencia COMMIT o ROLLBACK.
  • Se ejecuta una sentencia DDL o DCL (confirmaci贸n autom谩tica).
  • El usuario sale de SQL Developer o SQL*Plus.
  • El sistema falla.
¿Cu谩ndo se inicia y termina una transacci贸n de la base de datos? 
Una transacci贸n empieza cuando se encuentra la primera sentencia DML y termina cuando se produce una de las siguientes condiciones:
  • Se emite una sentencia COMMIT o ROLLBACK.
  • Se emite una sentencia DDL, como CREATE.
  • Se emite una sentencia DCL.
  • El usuario sale de SQL Developer o SQL*Plus.
  • Falla una m谩quina o el sistema.
Tras la finalizaci贸n de una transacci贸n, la siguiente sentencia SQL ejecutable inicia autom谩ticamente la pr贸xima transacci贸n.
Se confirma autom谩ticamente una nueva sentencia DDL o DCL y, por lo tanto, finaliza de forma impl铆cita una transacci贸n.

Ventajas de las Sentencias COMMIT y ROLLBACK
Con las sentencias COMMIT y ROLLBACK, puede:
  • Garantizar la consistencia
  • Visualizar una presentaci贸n preliminar de los cambios de los datos antes de hacerlos permanentes
  • Agrupar componentes relacionados de forma l贸gica
Con las sentencias COMMIT y ROLLBACK, puede controlar cu谩ndo hacer permanentes los cambios realizados a los datos.

Sentencias de Control de Transacciones Expl铆citas


Puede controlar la l贸gica de las transacciones mediante las sentencias COMMIT, SAVEPOINT y ROLLBACK.

Rollback de los Cambios de un Marcador
Crear un marcador en una transacci贸n actual mediante la sentencia SAVEPOINT.
Realizar rollback en dicho marcador mediante la sentencia ROLLBACK TO SAVEPOINT.
Puede crear un marcador en la transacci贸n actual mediante la sentencia SAVEPOINT, que divide la transacci贸n en secciones m谩s peque帽as. Puede descartar los cambios pendientes hasta dicho marcador con la sentencia ROLLBACK TO SAVEPOINT. 
Si crea un segundo punto de grabaci贸n con el mismo nombre que un punto de grabaci贸n anterior, 茅ste se suprime.

Procesamiento de Transacciones Impl铆citas
Una transacci贸n autom谩tica se produce en las siguientes circunstancias:
  • Se emite una sentencia DDL.
  • Se emite una sentencia DCL.
  • Salida normal de SQL Developer o SQL*Plus, sin emitir expl铆citamente las sentencias COMMIT o ROLLBACK.
Un rollback autom谩tico se produce con la terminaci贸n anormal de SQL Developer o SQL*Plus o por un fallo del sistema.

Nota: en SQL*Plus, el comando AUTOCOMMIT se puede activar o desactivar. Si se define en ON, cada sentencia DML individual se confirma en cuanto se ejecuta. No puede realizar rollback de los cambios. Si se define en OFF, la sentencia COMMIT a煤n se puede emitir expl铆citamente. Adem谩s, la sentencia COMMIT se emite al emitir una sentencia DDL o al salir de SQL*Plus. El comando SET AUTOCOMMIT ON/OFF se salta en SQL Developer. DML se confirma en una salida normal de SQL Developer s贸lo si tiene activada la preferencia Autocommit. Para activar Autocommit, realice los siguientes pasos:
En el men煤 Tools, seleccione Preferences. En el cuadro de di谩logo Preferences, ampl铆e Database y seleccione Worksheet Parameters.
En el panel de la derecha, seleccione la opci贸n “Autocommit in SQL Worksheet”. Haga clic en OK.

Fallos del Sistema
Cuando se interrumpe una transacci贸n debido a un fallo del sistema, se realiza un rollback autom谩tico de toda la transacci贸n. Esto impide que el error provoque cambios no deseados en los datos y que devuelva las tablas a su estado en el momento de la 煤ltima confirmaci贸n. De esta forma, el servidor de Oracle protege la integridad de las tablas.
En SQL Developer, la salida normal de la sesi贸n se realiza seleccionando Exit en el men煤 File. Con SQL*Plus, la salida normal se realiza introduciendo el comando EXIT en el s铆mbolo del sistema. Si se cierra la ventana, se interpreta como una salida anormal.

Estado de los Datos antes de COMMIT o ROLLBACK
  • Se puede recuperar el estado anterior de los datos.
  • El usuario actual puede revisar los resultados de las operaciones DML mediante la sentencia SELECT.
  • Los dem谩s usuarios no pueden ver los resultados de las sentencias DML del usuario actual.
  • Las filas afectadas est谩n bloqueadas; otros usuarios no pueden cambiar los datos de las filas afectadas.
Todos los cambios de datos realizados durante la transacci贸n son temporales hasta que se confirma la transacci贸n.
El estado de los datos antes de emitir las sentencias COMMIT o ROLLBACK se describe a continuaci贸n:
  • Las operaciones de manipulaci贸n de datos afectan principalmente al buffer de la base de datos y, por lo tanto, se puede recuperar el estado anterior de los datos.
  • El usuario actual puede revisar los resultados de las operaciones de manipulaci贸n de datos mediante la consulta de las tablas.
  • Los dem谩s usuarios no pueden ver los resultados de las operaciones de manipulaci贸n realizadas por el usuario actual. El servidor de Oracle establece la consistencia de lectura para garantizar que todos los usuarios ven los datos tal y como estaban en el momento de la 煤ltima confirmaci贸n.
  • Las filas afectadas est谩n bloqueadas; otros usuarios no pueden cambiar los datos de las filas afectadas.
Estado de los Datos despu茅s de COMMIT
  • Los cambios de datos se guardan en la base de datos.
  • Se sobrescribe el estado anterior de los datos.
  • Todos los usuarios pueden ver los resultados.
  • Los bloqueos de las filas afectadas se liberan y dichas filas quedan disponibles para que las manipulen otros usuarios.
  • Se borran todos los puntos de grabaci贸n.
Para convertir todos los cambios pendientes en permanentes, utilice la sentencia COMMIT. A continuaci贸n, se muestra lo que ocurre despu茅s de ejecutar una sentencia COMMIT:
  • Los cambios de datos se escriben en la base de datos.
  • El estado anterior de los datos ya no est谩 disponible con las consultas SQL normales.
  • Todos los usuarios pueden ver los resultados de la transacci贸n.
  • Los bloqueos de las filas afectadas se liberan y las filas quedan ahora disponibles para que otros usuarios realicen nuevos cambios en los datos.
  • Se borran todos los puntos de grabaci贸n.
Confirmaci贸n de Datos
Realice estos cambios:

Confirme los cambios:

En el ejemplo, se suprime una fila de la tabla EMPLOYEES y se inserta una nueva en la tabla DEPARTMENTS. Los cambios se guardan emitiendo la sentencia COMMIT.

Ejemplo:
Elimine los departamentos 290 y 300 de la tabla DEPARTMENTS y actualice una fila en la tabla EMPLOYEES. Guarde el cambio de datos.

   DELETE FROM departments
   WHERE   department_id IN (290, 300);
    
   UPDATE employees
     SET    department_id = 80
     WHERE employee_id = 206;

  COMMIT;

Estado de los Datos despu茅s de ROLLBACK
Desechar todos los cambios pendientes mediante la sentencia ROLLBACK:
  • Se deshacen los cambios de datos.
  • Se restaura el estado anterior de los datos.
  • Se liberan los bloqueos de las filas afectadas.

Estado de los Datos despu茅s de ROLLBACK: Ejemplo

Al intentar eliminar un registro de la tabla TEST, puede borrar accidentalmente la tabla. Puede corregir el error, volver a emitir la sentencia correcta y hacer permanentes los cambios de datos.

Rollback a Nivel de Sentencias
  • Si falla una sentencia DML durante la ejecuci贸n, s贸lo se realiza un rollback de dicha sentencia.
  • El servidor de Oracle implanta un punto de grabaci贸n impl铆cito.
  • Los dem谩s cambios se retienen.
  • El usuario debe terminar las transacciones expl铆citamente con la ejecuci贸n de una sentencia COMMIT o ROLLBACK.
Se puede desechar parte de una transacci贸n mediante un rollback impl铆cito si se detecta un error de ejecuci贸n de sentencia. Si falla una 煤nica sentencia DML durante la ejecuci贸n de una transacci贸n, su efecto se deshace mediante un rollback a nivel de sentencia, pero los cambios realizados por las sentencias DML anteriores en la transacci贸n no se desechan. El usuario los puede omitir o realizar un rollback expl铆cito.
El servidor de Oracle emite una confirmaci贸n impl铆cita antes y despu茅s de cualquier sentencia DDL. Por lo tanto, si la sentencia DDL no se ejecuta correctamente, no podr谩 realizar rollback de la sentencia anterior porque el servidor ha emitido una confirmaci贸n.
El usuario debe terminar las transacciones expl铆citamente con la ejecuci贸n de una sentencia COMMIT o ROLLBACK.

Consistencia de lectura
  • La consistencia de lectura garantiza una vista consistente de los datos en todo momento.
  • Los cambios realizados por un usuario no entran en conflicto con los cambios realizados por otro usuario.
  • La consistencia de lectura garantiza que en los mismos datos:
      • Los lectores no esperen los escritores.
      • Los escritores no esperen a los lectores.
      • Los escritores esperen a los escritores.
Los usuarios de la base de datos pueden acceder a la base de datos de dos formas:
  • Operaciones de lectura (sentencia SELECT)
  • Operaciones de escritura (sentencias INSERT, UPDATE, DELETE)
La consistencia de lectura es necesaria para lo siguiente:
  • Que el lector y el escritor de la base de datos tengan garantizada una vista consistente de los datos.
  • Que los lectores no visualicen datos en proceso de cambio.
  • Que los escritores tengan garantizado que los cambios en la base de datos se realizar谩n de forma consistente.
  • Los cambios realizados por un escritor no entran en conflicto con los cambios realizados por otro escritor.
El objetivo de la consistencia es garantizar que todos los usuarios vean los datos como exist铆an en el momento de la confirmaci贸n, antes de iniciar una operaci贸n DML.

Nota: el mismo usuario se puede conectar a diferentes sesiones. Cada sesi贸n mantiene la consistencia de lectura tal y como se describe anteriormente, incluso si son los mismos usuarios.

Implementaci贸n de Consistencia de Lectura

La consistencia de lectura es una implantaci贸n autom谩tica. Mantiene una copia parcial de la base de datos en los segmentos de deshacer. La imagen de lectura consistente se crea a partir de los datos confirmados de la tabla y de los datos antiguos que se van a cambiar y que a煤n no se han confirmado del segmento de deshacer. 

Al realizar una operaci贸n de inserci贸n, actualizaci贸n o supresi贸n en la base de datos, el servidor de Oracle realiza una copia de los datos antes de cambiarlos y los escribe en un segmento de deshacer.
Todos los lectores, excepto el que haya emitido el cambio, seguir谩n viendo la base de datos como exist铆a antes de que comenzaran los cambios; ver谩n una “instant谩nea” de los datos del segmento de deshacer.

Antes de confirmar los cambios en la base de datos, s贸lo el usuario que modifica los datos ve la base de datos con modificaciones. Todos los dem谩s ver谩n la instant谩nea en el segmento de deshacer. Esto garantiza que los lectores de los datos lean datos consistentes en los que no se est茅 realizando actualmente ning煤n cambio.

Al confirmar una sentencia DML, el cambio realizado en la base de datos se hace visible para todos aqu茅llos que emiten una sentencia SELECT despu茅s de realizar la confirmaci贸n. El espacio ocupado por los datos antiguos en el archivo de segmentos de deshacer se libera para volver a utilizarlo.
Si se realiza un rollback de la transacci贸n, los cambios se deshacen:
  • La versi贸n original anterior de los datos del segmento de deshacer se vuelve a escribir en la tabla.
  • Todos los usuarios ven la base de datos como exist铆a antes de comenzar la transacci贸n.
Cl谩usula FOR UPDATE en una sentencia SELECT
Bloquea las filas de la tabla EMPLOYEES en las que job_id sea SA_REP.

El bloqueo s贸lo se libera si emite ROLLBACK o COMMIT.
Si la sentencia SELECT intenta bloquear una fila bloqueada por otro usuario, la base de datos espera a que la fila est茅 disponible y, a continuaci贸n, devuelve los resultados de la sentencia SELECT.

Cuando se emite una sentencia SELECT en la base de datos para consultar algunos registros, no se coloca ning煤n bloqueo en las filas seleccionadas. En general, se debe a que el n煤mero de registros bloqueados en un momento determinado se mantiene (por defecto) en el m铆nimo absoluto: s贸lo se bloquean aquellos registros que se han cambiado, pero que a煤n no se han confirmado. A煤n as铆, otros usuarios podr谩n leer dichos registros tal y como aparec铆an antes del cambio (la “imagen anterior” de los datos). Hay ocasiones, sin embargo, en las que puede que desee bloquear un juego de registros incluso antes de cambiarlos en el programa. Oracle ofrece la cl谩usula FOR UPDATE de la sentencia SELECT para realizar este bloqueo. 

Cuando emite una sentencia SELECT...FOR UPDATE, el sistema de gesti贸n de bases de datos relacionales (RDBMS) obtiene autom谩ticamente los bloqueos a nivel de fila exclusivos de todas las filas identificadas por la sentencia SELECT, reteniendo as铆 los registros “s贸lo para sus cambios”. Nadie m谩s podr谩 cambiar ninguno de estos registros hasta que realice una operaci贸n ROLLBACK o COMMIT. 

Puede adjuntar la palabra clave opcional NOWAIT a la cl谩usula FOR UPDATE para indicar al servidor de Oracle que no espere si otro usuario ha bloqueado la tabla. En este caso, el control volver谩 inmediatamente al programa o al entorno de SQL Developer para que pueda realizar otro trabajo o simplemente esperar un per铆odo de tiempo antes de volver a intentarlo. Sin la cl谩usula NOWAIT, el proceso se bloquear谩 hasta que la tabla est茅 disponible, cuando otro usuario libere los bloqueos a trav茅s de la emisi贸n un comando COMMIT o ROLLBACK.

Cl谩usula FOR UPDATE: Ejemplos
Puede utilizar la cl谩usula FOR UPDATE en una sentencia SELECT en varias tablas. 

Las filas de las tablas EMPLOYEES y DEPARTMENTS est谩n bloqueadas.
Utilizar FOR UPDATE OF column_name para cualificar la columna que desea cambiar, de modo que s贸lo se bloqueen las filas de esa tabla espec铆fica.

En el ejemplo, la sentencia bloquea las filas de la tabla EMPLOYEES con JOB_ID definido en ST_CLERK y LOCATION_ID definido en 1500 y bloquea las filas de la tabla DEPARTMENTS con los departamentos de LOCATION_ID definidos en 1500.

Puede utilizar FOR UPDATE OF column_name para cualificar la columna que desea cambiar. La lista OF de la cl谩usula FOR UPDATE no limita el cambio s贸lo a aquellas columnas de las filas seleccionadas. A煤n se mantienen los bloqueos en todas las filas; si simplemente declara FOR UPDATE en la consulta y no incluye una o m谩s columnas despu茅s de la palabra clave OF, la base de datos bloquear谩 todas las filas identificadas en todas las tablas incluidas en la cl谩usula FROM. 

La siguiente sentencia s贸lo bloquea las filas de la tabla EMPLOYEES con ST_CLERK ubicado en LOCATION_ID 1500. No se bloquea ninguna fila en la tabla DEPARTMENTS:

SELECT e.employee_id, e.salary, e.commission_pct 
FROM employees e JOIN departments d 
USING (department_id) 
WHERE job_id = 'ST_CLERK' AND location_id = 1500 
FOR UPDATE OF e.salary 
ORDER BY e.employee_id; 

En el siguiente ejemplo, se indica a la base de datos que espere cinco segundos hasta que la fila est茅 disponible y, a continuaci贸n, se devuelve el control al usuario.

SELECT employee_id, salary, commission_pct, job_id
FROM employees  
WHERE job_id = 'SA_REP'
FOR UPDATE WAIT 5
ORDER BY employee_id;

Resumen
En esta lecci贸n debe haber aprendido a utilizar las siguientes sentencias:


En esta lecci贸n, debe haber aprendido a manipular datos en Oracle Database mediante las sentencias INSERT, UPDATE, DELETE y TRUNCATE, as铆 como a controlar los cambios de datos mediante las sentencias COMMIT, SAVEPOINT y ROLLBACK. Tambi茅n ha aprendido a utilizar la cl谩usula FOR UPDATE de la sentencia SELECT para bloquear filas s贸lo para sus cambios.
Recuerde que el servidor de Oracle garantiza una vista consistente de los datos en todo momento.
Raul Tamani A. ©. Im谩genes del tema de fpm. Con tecnolog铆a de Blogger.

Adblock Detectado

Apoya este sitio desactivando el Adblock para seguir navegando. ¡Gracias!

¡Ya Desactive el Adblock!