La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Subconsultas Multi-Columna

Presentaciones similares


Presentación del tema: "Subconsultas Multi-Columna"— Transcripción de la presentación:

1 Subconsultas Multi-Columna

2 Objetivos Al completar esta lección, debería ser capaz de hacer lo siguiente: Escribir una subconsulta multi-columna Describir y explicar el comportamiento de las subconsultas cuando se recuperan valores nulos Escribir una subconsulta en una cláusula FROM. Objetivos En esta lección, aprenderá a cómo escribir subconsultas multi-columna y subconsultas en la cláusula FROM de una sentencia SELECT.

3 Subconsultas Multi-Columna
Consulta Principal MANAGER 10 Subquery SALESMAN MANAGER CLERK La C. Principal compara MANAGER 10 Valores de una subc. multi-registro y multi-columna SALESMAN 30 MANAGER 10 CLERK con Subconsultas Multi-columna Hasta ahora, ha escrito subconsulta mono-registro y multi-registro, en las que sólo una columna era comparada en la cláusula WHERE o cláusula HAVING de la sentencia SELECT. Si quiere comparar dos o más columnas, habrá de escribir un cláusula WHERE compuesta que utilice operadores lógicos. Las subconsultas multi-columna, le permitirán transformar diferentes condiciones WHERE en una única cláusula WHERE. Sintaxis SELECT column, column, ... FROM table WHERE (column, column, ...) IN (SELECT column, column, ... FROM table WHERE condition);

4 Subconsultas Multi-Columna
Usando Subconsultas Multi-Columna Visualizar el nombre, nº de departamento, salario y comisión de cualquier empleado cuyo salario y comisión se correspondan (ambos) con la comisión y salario de cualquier empleado del departamento 30. SQL> SELECT ename, deptno, sal, comm 2 FROM emp 3 WHERE (sal, NVL(comm,0)) IN 4 (SELECT sal, NVL(comm,0) FROM emp WHERE deptno = 30); Uso de Subconsultas Multi-columna El ejemplo de la parte superior, muestra una subconsulta multi-columna porque la subconsulta devuelve más de una columna. Compara el salario -columna SAL- y la comisión -columna COMM- Visualiza el nombre, nº departamento, salario y comisión de cualquier empleado cuyo salario y comisión (conjuntamente) se correspondan con la comisión y salario de cualquier empleado del departamento número 30. La salida de la sentencia SQL superior, será: ENAME DEPTNO SAL COMM JAMES WARD MARTIN TURNER ALLEN BLAKE 6 rows selected.

5 Comparaciones entre Columnas
Pairwise Nonpairwise SAL COMM SAL COMM Comparaciones Pairwise Versus Nonpairwise Las comparaciones entre columnas en subconsulta multi-columna puedes ser comparaciones pairwise o nonpairwise. En el ejemplo de la transparencia anterior, se ejecutaba una comparación pairwise en la cláusula WHERE. Cada registro candidato en la sentencia SELECT tenía que coincidir tanto con el salario como con la comisión de un empleado del departamento 30. Si quiere una comparación nonpairwise (un producto cruzado -cross product-) tiene que utilizar una cláusula WHERE con múltiples condiciones.

6 Comparación de Subconsultas “Nonpairwise”
Visualizar el nombre, nº de departamento, salario y comisión de cualquier empleado cuyo salario y comisión se corresponda con la comisión y salario de cualquier empleado del departamento 30. SQL> SELECT ename, deptno, sal, comm 2 FROM emp 3 WHERE sal IN (SELECT sal FROM emp WHERE deptno = 30) 6 AND 7 NVL(comm,-1) IN (SELECT NVL(comm,-1) FROM emp WHERE deptno = 30); Subconsulta con Comparación Nonpairwise El ejemplo de la parte superior, hace una comparación nonpairwise de las columnas. Visualiza, el nombre, número de departamento, salario y comisión de cualquier empleado cuyo salario y comisión se correspondan con el salrio y comisión de cualquier empleado del departamento 30. La salida de la sentencia SQL superior, será: El resultado de las dos últimas consultas será idéntico, aunque las condiciones de comparación fueron diferentes. Los resultados fueron obtenidos por medio de datos específicos de la tabla EMP. ENAME DEPTNO SAL COMM JAMES BLAKE TURNER ALLEN WARD MARTIN

7 Modificación de la Tabla EMP
Asuma que el salario y comisión de “Clark” son modificados. El salario se cambia a 1500$ y la comisión a 300$. ENAME SAL COMM ... CLARK ALLEN TURNER 14 rows selected. Ejemplo: Suponga que el salario y comisión del empleado Clark se modifican, de tal manera que tenga el mismo salario que un empleado del departamento 30, y la misma comisión que un empleado que no pertenezca al departamento 30. El salario de Clark, ahora es igual al de Turner (1500$) y su comisión es igual a la de Allen (300$). Ahora, ejecute un comparación pairwise y nonpairwise para determinar el número de registros devueltos por cada consulta. Nota: La sintaxis de modificación de datos en una tabla será resuelta en la lección 9.

8 Subconsulta “Pairwise”
SQL> SELECT ename, deptno, sal, comm 2 FROM emp 3 WHERE (sal, NVL(comm,0)) IN 4 (SELECT sal, NVL(comm,0) FROM emp WHERE deptno = 30); ENAME DEPTNO SAL COMM JAMES WARD MARTIN TURNER ALLEN BLAKE 6 rows selected. Subconsulta Pairwise La salida de la subconsulta pairwise aún sigue siendo la misma, devolviendo seis registros.

9 Subconsulta “Nonpairwise”
SQL> SELECT ename,deptno, sal, comm 2 FROM emp 3 WHERE sal IN (SELECT sal FROM emp WHERE deptno = 30) 6 AND 7 NVL(comm,-1) IN (SELECT NVL(comm,-1) FROM emp WHERE deptno = 30); ENAME DEPTNO SAL COMM JAMES BLAKE TURNER CLARK ... 7 rows selected. Subconsulta Nonpairwise Los resultados de la subconsulta nonpairwise incluyen al empleado Clark. El salario de Clark es el mismo que el de Turner y su comisión es la misma que la de Allen.

10 Valores Nulos en una Subconsulta
SQL> SELECT employee.ename 2 FROM emp employee 3 WHERE employee.empno NOT IN (SELECT manager.mgr FROM emp manager); no rows selected. Devolución de Valores Nulos (null) como Resultado de una Subconsulta El ejemplo de la parte superior, intenta visualizar a todos los empleados que no tienen ningún subordinado. Lógicamente, esta sentencia SQL tendría que devolver ocho registros. Sin embargo, la sentencia SQL no devuelve ningún registro. Uno de los valores devueltos por la consulta más interna, es un valor nulo y, por tanto, la consulta como tal, no devuelve registros. La razón, es que todas las condiciones que comparan un valor nulo, resultan en un nulo; por ello, siempre que los valores nulos sean un resultado probable de una subconsulta, no utilice el operador NOT IN (equivalente a !=ALL) Note que el valor nulo como parte del conjunto resultante no será un problema, si está usando el operador IN, ya que éste equivale a =ANY. Por ejemplo, para visualizar a los empleados que tienen subordinados, utilice la siguiente sentencia SQL: SQL> SELECT employee.ename 2 FROM emp employee 3 WHERE employee.empno IN (SELECT manager.mgr FROM emp manager); ENAME KING 6 rows selected.

11 Uso de un Subconsulta en la Cláusula FROM
SQL> SELECT a.ename, a.sal, a.deptno, b.salavg 2 FROM emp a, (SELECT deptno, avg(sal) salavg FROM emp GROUP BY deptno) b 5 WHERE a.deptno = b.deptno 6 AND a.sal > b.salavg; ENAME SAL DEPTNO SALAVG KING JONES SCOTT ... 6 rows selected. Uso de una Subconsulta en una Cláusula FROM Puede utilizar una subconsulta en una cláusula FROM de una sentencia SELECT, que es muy similar a cómo se usan las vistas. El ejemplo de la parte superior, visualiza los nombres, salarios, números de departamento y media de salarios, de todos los empleados que cobran más que la media de salarios de su departamento.

12 Resumen Una subconsulta multi-columna devuelve más de una columna.
Las comparaciones entre columnas en una comparación multi-columna, pueden ser “pairwise” o “nonpairwise”. Una subconsulta multi-columna puede también ser usada en la cláusula FROM de una sentencia SELECT.

13 Manipulación de Datos

14 Objetivos Al completar esta lección, debería ser capaz de hacer lo siguiente: Describir cada sentencia DML Insertar filas nuevas en una tabla. Modificar filas de una tabla. Eliminar filas de una tabla. Explicar el control de transacciones y su importancia. Objetivo En esta lección, aprenderá a insertar, modificar y borrar registros en una tabla. También aprenderá a controlar transacciones con sentencias COMMIT, SAVEPOINT, y ROLLBACK.

15 El Lenguaje de Manipulación de Datos
Una sentencia DML se ejecuta cuando: Añade nuevos registros a una tabla Modifica registros existentes Elimina registros existentes Una transacción consiste en una colección de sentencias DML que forman una unidad lógica de trabajo. Lenguaje de Manipulación de Datos (DML) El lenguaje de manipulación de datos o DML (Data Manipulation Language) es una parte central de SQL. Cuando se quiere agregar, actualizar, 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 lógica de trabajo.

16 Añadir un Nuevo Registro a una Tabla
50 DEVELOPMENT DETROIT “…insertar un nuevo registro en la tabla DEPT...” DEPT DEPTNO DNAME LOC 10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON DEPT DEPTNO DNAME LOC 10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON Insertando un Nuevo Registro a una Tabla El ejemplo de la parte superior, añade un nuevo departamento a la tabla DEPT. 50 DEVELOPMENT DETROIT

17 La Sentencia INSERT Añadimos nuevos registros a una tabla, por medio de la sentencia INSERT. Mediante esta sintaxis, sólo se inserta un registro al mismo tiempo. INSERT INTO table [(column [, column...])] VALUES (value [, value...]); Insertando un Nuevo Registro a una Tabla Se puede agregar una nueva fila a una tabla por medio del comando INSERT. 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 esa columna. Nota: Este comando con la cláusula VALUES inserta únicamente una fila por vez en la tabla.

18 Inserción de Nuevos Registros
Insertar una nueva fila conteniendo los valores para cada columna. Opcionalmente, se pueden listar las columnas en la cláusula INSERT. Colocar los valores en el orden que las columnas tienen en la tabla por defecto. Encerrar los valores de datos de tipo carácter y fecha entre comillas simples. SQL> INSERT INTO dept (deptno, dname, loc) 2 VALUES (50, 'DEVELOPMENT', 'DETROIT'); 1 row created. Insertando un Nuevo Registro a una Tabla Como se puede insertar una nueva fila con valores para cada columna, entonces la lista de las columnas no es requerida en la cláusula INSERT. Sin embargo, los valores deben ser listados de acuerdo al orden que por defecto (esto es, por definición) tienen las columnas en la tabla. SQL> DESCRIBE dept Name Null? Type DEPTNO NOT NULL NUMBER(2) DNAME VARCHAR2(14) LOC VARCHAR2(13) Para claridad, usar la lista de columnas en la cláusula INSERT. Encerrar los valores de tipo carácter y fecha entre comillas simples; y no encerrar los valores numéricos.

19 Inserción de Registros con Valores Nulos
Método Implícito: Omitir la columna en la lista. Método Explícito: Especificar la palabra clave NULL o el string vacío ('') en la lista de VALUES. SQL> INSERT INTO dept (deptno, dname ) 2 VALUES (60, 'MIS'); 1 row created. SQL> INSERT INTO dept 2 VALUES (70, 'FINANCE', NULL); 1 row created. Métodos para Insertar Valores Nulos Asegúrese de que la columna elegida permite valores nulos chequeando el estado “Null” utilizando el comando DESCRIBE de SQL*Plus. El servidor Oracle8 automáticamente fuerza a todos los tipos de datos, rangos de datos y constraints, a contener un valor. Cualquier columna no listada explícitamente obtiene un valor nulo en el nuevo registro.

20 Inserción de Valores Especiales
La función SYSDATE registra la fecha y hora actual. SQL> INSERT INTO emp (empno, ename, job, 2 mgr, hiredate, sal, comm, 3 deptno) 4 VALUES (7196, 'GREEN', 'SALESMAN', , SYSDATE, 2000, NULL, 6 10); 1 row created. Insertar Valores Especiales por medio de Funciones SQL Se puede usar pseudocolumnas para insertar valores especiales en una fila. Especificar USERID para insertar el nombre del usuario actual. SYSDATE inserta la fecha y hora actuales. Ejemplo: SQL> SELECT empno, ename, job, hiredate, comm 2 FROM emp 3 WHERE empno = 7196; EMPNO ENAME JOB HIREDATE COMM 7196 GREEN SALESMAN 01-DEC-97

21 Insertando Valores de Fecha Específicos
Añadimos un nuevo empleado: SQL> INSERT INTO emp 2 VALUES (2296,'AROMANO','SALESMAN',7782, TO_DATE('FEB 3,97', 'MON DD, YY'), , NULL, 10); 1 row created. Verificamos la inserción: EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO 2296 AROMANO SALESMAN FEB Insertar Valores Específicos de Fecha y Hora Cuando se inserta un valor de fecha, usualmente el formato usado es Día-Mes-Año (DD-MON-YY) . Con este formato, se debe recordar que el siglo por defecto es el actual. Como la fecha también contiene información de la hora, por defecto toma la medianoche (00:00:00). Si se requiere insertar una fecha en otro siglo y hora específicos, usar la función TO_DATE. El ejemplo de la transparencia registra información para el empleado “Aromano” en la tabla EMP. Define la fecha de alta (HIREDATE) a “February 3, 1997”. Si se define el formato RR, el siglo no podrá ser el actual.

22 Inserción de Valores por medio de Variables de Sustitución
Creamos un script interactivo usando parámetros de sustitución de SQL*Plus: SQL> INSERT INTO dept (deptno, dname, loc) 2 VALUES (&department_id, '&department_name', '&location'); Enter value for department_id: 80 Enter value for department_name: EDUCATION Enter value for location: ATLANTA 1 row created. 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. . El ejemplo de la parte superior, registra información para un departamento en la tabla DEPT. Pregunta al usuario por el número de departamento, nombre y localidad. Para los valores tipo fecha, y carácter, el ampersand y el nombre de la variable, se encerrarán entre simples comillas.

23 Creación de un Script con PROMPTS Específicos
ACCEPT almacena el valor en una var. PROMPT visualiza el texto especificado. ACCEPT department_id PROMPT 'Please enter the - department number:' ACCEPT department_name PROMPT 'Please enter - the department name:' ACCEPT location PROMPT 'Please enter the - location:' INSERT INTO dept (deptno, dname, loc) VALUES (&department_id, '&department_name', &location); Creación de un Script para Manipular Datos Se puede salvar en comando que usa variables de sustitución a un archivo para después ejecutarlo. Cada vez que se ejecuta el comando, solicitará los nuevos valores. Personalizar los prompts usando el comando ACCEPT de SQL*Plus. El ejemplo de la transparencia, registra información para un departamento de la tabla DEPT. Pregunta al usuario por el nº de dpto, nombre y localidad utilizando mensajes personalizados. Please enter the department number: 90 Please enter the department name: PAYROLL Please enter the location: HOUSTON 1 row created. No prefijar el parámetro de sustitución en SQL*Plus con el ampersand (&) cuando se lo referencia en el comando ACCEPT. Usar un guión (-) para continuar un comando SQL*Plus en la próxima línea.

24 Copiando Registros de Otra Tabla
Escribir el comando INSERT con una subconsulta (subquery). No usar la cláusula VALUES. Observar que coincida el número de columnas en la cláusula INSERT con las de la subconsulta. SQL> INSERT INTO managers(id, name, salary, hiredate) SELECT empno, ename, sal, hiredate FROM emp WHERE job = 'MANAGER'; 3 rows created. Copiando filas desde otra tabla Se puede usar la sentencia INSERT para agregar filas a una tabla donde los valores se derivan de otras tablas ya existentes. En lugar de la cláusula VALUES, usar una subconsulta (subquery) Sintaxis: INSERT INTO table [ column (, column) ] subquery; table es el nombre de la tabla. column es el nombre de la columna de la tabla a llenar. subquery es la subconsulta que devuelve las filas para llenar la tabla Para más información, ver: Oracle8 Server SQL Reference, Release 8.0, sección “SELECT,” Subqueries. El número de columnas en la lista de la cláusula INSERT debe coincidir con el número de valores en la subconsulta

25 Modificación de Datos en una Tabla
EMP EMPNO ENAME JOB DEPTNO 7839 KING PRESIDENT 7698 BLAKE MANAGER 7782 CLARK MANAGER 7566 JONES MANAGER ... “…Modificación de un registro en la Tabla EMP…” 20 EMP EMPNO ENAME JOB DEPTNO 7839 KING PRESIDENT 7698 BLAKE MANAGER 7782 CLARK MANAGER 7566 JONES MANAGER ... Modificación de Datos en una Tabla El gráfico, cambia el número de departamento para “Clark”, de 10 a 20.

26 La Sentencia UPDATE Modificamos registros existentes con la sentencia UPDATE Puede afectar a más de un registro al mismo tiempo. UPDATE table SET column = value [, column = value] [WHERE condition]; Actualizando filas Puede modificar registros existentes, por medio de la sentencia UPDATE. table es el nombre de la tabla . column es el nombre de la columna de la tabla a llenar. value es el correspondiente valor o subconsulta para la columna. condition identifica las filas a ser actualizadas y está compuesto por nombres de columnas, expresiones, constantes, subconsultas y operadores de comparación. Consultar la tabla para confirmar las actualizaciones en las filas correspondientes. Para más información, ver: Oracle8 Server SQL Reference, Release 8.0, “UPDATE.” Nota: En general, usar la primary key para identificar a una fila en particular. El uso de otras columnas puede causar que inesperadamente se actualicen varias filas. Por ejemplo, identificar a una fila en la tabla S_EMP por el apellido es peligroso porque varios empleados pueden tener el mismo.

27 Modificación de Registros en una Tabla
Los registros a modificar se especifican por medio de la cláusula WHERE Si se omite la cláusula WHERE se modificarían todos los registros de la tabla. SQL> UPDATE emp 2 SET deptno = 20 3 WHERE empno = 7782; 1 row updated. SQL> UPDATE employee 2 SET deptno = 20; 14 rows updated. Modificación de Registros La sentencia UPDATE modifica registros específicos, en caso de especificar una cláusula WHERE. El ejemplo de la parte superior, transfiere al empleado 7782 al departamento 20. Si omite la cláusula WHERE, se modificarían todos los registros de la tabla. Nota: La tabla EMPLOYEE tiene los mismos datos que la tabla EMP. SQL> SELECT ename, deptno 2 FROM employee; ENAME DEPTNO KING BLAKE CLARK JONES MARTIN ALLEN TURNER ... 14 rows selected.

28 Proceso de Modificación con Subconsultas Multi-Columna
Modificar el oficio y departamento del empleado 7698, con los valores correspondientes actualmente al empleado 7499: SQL> UPDATE emp 2 SET (job, deptno) = (SELECT job, deptno FROM emp WHERE empno = 7499) 6 WHERE empno = 7698; 1 row updated. Modificación de Registros con una Subconsulta Multi-columna Las Subconsultas Multi-columna pueden ser implementadas en la cláusula SET de una sentencia UPDATE. Sintaxis: UPDATE table SET (column, column, ...) = (SELECT column, column, FROM table WHERE condición) WHERE condición;

29 Modificación de Registros Basados en Otra Tabla
Utilice subconsultas en sentencias UPDATE, para modificar registros de una tabla, basados en valores de otra tabla. SQL> UPDATE employee 2 SET deptno = (SELECT deptno 3 FROM emp 4 WHERE empno = 7788) 5 WHERE job = (SELECT job 6 FROM emp 7 WHERE empno = 7788); 2 rows updated. Modificación de Registros Basados en Otra Tabla Puede usar subconsultas en sentencias UPDATE para modificar registros en una tabla. El ejemplo de la parte superior, modifica la tabla EMPLOYEE basando la actualización en los valores de la tabla EMP. Cambia el nº de dpto. a todos los empleados con el oficio del empleado 7788, al nº de dpto. del mismo (7788).

30 Modificación de Registros: Error de Integridad (Constraints)
SQL> UPDATE emp 2 SET deptno = 55 3 WHERE deptno = 10; El Departamento número 55 no existe UPDATE emp * ERROR at line 1: ORA-02291: integrity constraint (USR.EMP_DEPTNO_FK) violated - parent key not found Error de Restricción de Integridad Si se intenta actualizar un registro con un valor que viola una restricción de integridad, se producirá un error. El ejemplo de la parte superior, el nº de dpto. 55 no existe en la tabla padre, DEPT, y por tanto recibirá un error ORA-0229, indicando la violación de la clave padre. Nota: Las restricciones de integridad (Integrity constraints), aseguran que los datos están sujetos a determinadas reglas. La lección 11 cubre estas restricciones en profundidad.

31 Eliminación de Registros de una Tabla
DEPT DEPTNO DNAME LOC 10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON 50 DEVELOPMENT DETROIT 60 MIS ... “…Borramos un registro de la tabla DEPT…” DEPT DEPTNO DNAME LOC 10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON 60 MIS ... Eliminación de un Registro de una Tabla El ejemplo de la parte superior, borrar el departamento DEVELOPMENT de la tabla DEPT (suponiendo que noy hay restricciones definidas en la tabla DEPT).

32 La Sentencia DELETE Puede eliminar registros existentes de una tabla, por medio de la sentencia DELETE. DELETE [FROM] table [WHERE condition]; Eliminación de Registros Puede borrar registros de una tabla, por medio de la sentencia DELETE. Sintaxis: table es el nombre de la tabla. condition identifica los registros a eliminar y se compone de nombres de columnas, expresiones, constantes, subconsultas y operadores de comparación. Para más información, ver: Oracle8 Server SQL Reference, Release 8.0, “DELETE.”

33 Eliminación de Registros de una Tabla
Los registros a eliminar se especifican por medio de la cláusula WHERE Si omite la cláusula WHERE se borrarán todos los registros de la tabla SQL> DELETE FROM department 2 WHERE dname = 'DEVELOPMENT'; 1 row deleted. Eliminación de Registros Puede borrar registros específicos, determinando la cláusula WHERE de la sentencia DELETE. El ejemplo de la parte superior, borra al departamento DEVELOPMENT de la tabla DEPARTMENT. Puede verificar el borrado, visualizando los registros borrados usando una sentencia SELECT. Ejemplo: Borre a todos los empleados que fueron contratados después del Si omite la cláusula WHERE, todos los registros de la tabla serán borrados. El segundo ejemplo de la transparencia, borra todos los registros de la tabla DEPARTMENTE porque no hay cláusula WHERE. Nota: La tabla DEPARTMENT tiene los mismo datos que la tabla DEPT. SQL> DELETE FROM department; 4 rows deleted. SQL> SELECT * 2 FROM department 3 WHERE dname = 'DEVELOPMENT'; no rows selected. SQL> DELETE FROM emp 2 WHERE hiredate > TO_DATE(' ', 'DD.MM.YY'); 1 row deleted.

34 Eliminación de Registros Basados en Otra Tabla
Utilice subconsultas en sentencias DELETE, para eliminar registros de una tabla, basados en valores de otra tabla. SQL> DELETE FROM employee 2 WHERE deptno = (SELECT deptno FROM dept WHERE dname ='SALES'); 6 rows deleted. Eliminación de Registros Basados en Otra Tabla Puede usar subconsultas para borrar registros de una tabla basados en valores de otra tabla. El ejemplo de la parte superior, borra todos los empleados del departamento 30. La subconsulta busca la tabla DEPT para localizar el número de departamento asignado a SALES (Ventas). La subconsulta alimenta al nº de dpto. de la consulta principal, que borra registros de la tabla EMPLOYEE basándose en el número de departamento.

35 Eliminación de Registros: Error de Integridad (Constraints)
SQL> DELETE FROM dept 2 WHERE deptno = 10; No puede eliminar un registro que contiene una clave primaria, usada como clave externa en otra tabla DELETE FROM dept * ERROR at line 1: ORA-02292: integrity constraint (USR.EMP_DEPTNO_FK) violated - child record found Error de Restricción de Integridad Si intenta borrar un registro con un valor relacionado con una restricción de integridad, recibirá un error. El ejemplo de la parte superior, intenta borrar el departamento 10 de la tabla DEPT, pero resulta un error, dado que el departamento es utilizado como clave externa en la tabla EMP. Si el registro padre, que intenta eliminar tiene registros hijo, recibirá el error “child record found”, violación ORA

36 Transacciones en la Base de Datos
Contienen una de las siguientes sentencias: Sentencias DML que deciden un cambio consistente sobre los datos Una sentencia DDL Una sentencia DCL Transacciones de la Base de Datos El Servidor Oracle8 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 usuario o una falla del sistema. Las transacciones consisten de comandos DML que llevan a cabo un cambio en los datos de manera consistentes. 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 débito no debiera poder confirmarse sin el débito correspondiente. Tipos de Transacciones

37 Transacciones en la Base de Datos
Comienzan cuando se ejecuta el primer comando SQL. Finalizan con uno de los siguientes eventos: COMMIT o ROLLBACK. Ejecución de un comando DDL o DCL (commit automático). Errores, salida o caída del sistema. ¿Cuándo Empieza y 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. Una operación de commit se realiza automáticamente luego de un comando DDL o DCL, por lo tanto la transacción finaliza de manera implícita.

38 Ventajas de COMMIT y ROLLBACK
Aseguran la consistencia de los datos. Pueden visualizar los cambios sobre los datos antes de hacerlos permanentes. Agrupan lógicamente tareas relacionadas entre sí.

39 Control de Transacciones
Transacción ROLLBACK INSERT ROLLBACK to Savepoint A INSERT UPDATE INSERT ROLLBACK to Savepoint B DELETE DELETE INSERT UPDATE COMMIT Savepoint A Savepoint B Sentencias para el Control Explícito de Transacciones Controlar la lógica de las transacciones usando las sentencias COMMIT, SAVEPOINT y ROLLBACK. Nota: SAVEPOINT no es un estándar del SQL ANSI.

40 Proceso Implícito de Transacciones
Un commit automático ocurre bajo una de las siguientes circunstancias: Se emite un comando DDL, tal como CREATE. Se emite un comando DCL, tal como GRANT. Una salida normal desde SQL*Plus, sin realizar un COMMIT o ROLLBACK explícitamente. Un rollback automático ocurre bajo una terminación anormal de SQL*Plus o una falla del sistema. Proceso Implícito de Transacciones Nota: Un tercer comando está disponible. El comando AUTOCOMMIT de SQL*Plus puede tomar valores de ON u OFF. Si es ON, cada sentencia DML individual es confirmada (se le hace commit) tan rápido como es ejecutada. Los cambios no son reversibles (sin rollback). System Failures Cuando se interrumpe una transacción debido a un fallo del sistema, la transacción experimenta un rollback automáticamente. Esto previene que el error cause cambios no deseados a los datos y devuelve a las tablas su estado inicial desde el último commit. De esta manera, SQL*Plus protege la integridad de las tablas.

41 Estado de los Datos Antes de COMMIT o ROLLBACK
El estado previo de los datos puede ser recuperado porque el afectado es el búfer de la base de datos. El usuario actual puede revisar los resultados de sus operaciones DML usando la sentencia SELECT. Otros usuarios no pueden ver los resultados de las sentencias DML ejecutadas por el usuario actual. Las filas afectadas son bloqueadas (locked); otros usuarios no pueden cambiar los datos pertenecientes a esas filas. Confirmando los Cambios Cada cambio en los datos que es efectuado durante la transacción es temporal hasta que la transacción efectúa un commit o confirmación. Estado de los Datos antes de un COMMIT o ROLLBACK Las operaciones de manipulación de datos afectan principalmente al búfer 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. Oracle8 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 (locked); otros usuarios no pueden cambiar los datos dentro de esas filas.

42 Estado de los Datos Después del COMMIT
Los cambios en los datos son escritos en la base de datos. Los datos anteriores se pierden definitivamente. Todos los usuarios pueden ver los resultados. Se liberan los bloqueos aplicados a las filas afectadas; esas filas están ahora disponibles para que otros usuarios las usen. Se borran todos los savepoints. Confirmando los Cambios Hacer permanentes todos los cambios usando el comando COMMIT. Al hacer COMMIT: Los cambios en los datos son escritos en la base de datos. El estado previo de los datos se pierde definitivamente. Todos los usuarios pueden ver los resultados de la transacción. Se levantan los bloqueos a las filas afectadas; esas filas están ahora disponibles para que otros usuarios las utilicen. Se borran todos los savepoints.

43 Commit de Datos Realizar los cambios: Hacer Commit de los cambios:
SQL> UPDATE emp 2 SET deptno = 10 3 WHERE empno = 7782; 1 row updated. Hacer Commit de los cambios: SQL> COMMIT; Commit complete. Confirmando Cambios El ejemplo de la parte superior, modifica la tabla EMP y asigna el departamento 10 al empleado 7782 (Clark). A continuación realiza un commit. Ejemplo: Cree un nuevo departamento llamado DVERTISING con al menos un empleado. Haga commit. SQL> INSERT INTO department(deptno, dname, loc) 2 VALUES (50, 'ADVERTISING', 'MIAMI'); 1 row created. SQL> UPDATE employee 2 SET deptno = 50 3 WHERE empno = 7876; 1 row updated. SQL> COMMIT; Commit complete.

44 Estado de los Datos Después de Hacer ROLLBACK
Se descartan todos los cambios pendientes. Los cambios en los datos se deshacen. Se restaura el estado previo de los datos. Se levantan todos los bloqueos sobre las filas afectadas. SQL> DELETE FROM employee; 14 rows deleted. SQL> ROLLBACK; Rollback complete. Deshaciendo los Cambios (rollback) Descartar todos los cambios (pendientes) usando la sentencia ROLLBACK. Al hacer ROLLBACK: Los cambios a los datos son deshechos. Se restaura el estado anterior de los datos. Se levantan los bloqueos a las filas afectadas. Ejemplo: Mientras intenta borrar un registro de la tabla TEST, puede accidentalmente vaciar la tabla. Puede corregir el error, a continuación lanzar la sentencia correcta y validar la operación: SQL> DELETE FROM test; 25,000 rows deleted. SQL> ROLLBACK; Rollback complete. SQL> DELETE FROM test 2 WHERE id = 100; 1 row deleted. SQL> SELECT * 2 FROM test 3 WHERE id = 100; No rows selected. SQL> COMMIT; Commit complete.

45 Hacer ROLLBACK Hasta un Punto de Salvaguarda (Marca)
Crear una marca dentro de una transacción usando el comando SAVEPOINT (marca). Hacer un rollback hacia la marca usando el comando ROLLBACK TO SAVEPOINT. SQL> UPDATE... SQL> SAVEPOINT update_done; Savepoint created. SQL> INSERT... SQL> ROLLBACK TO update_done; Rollback complete. Deshacer Cambios hasta un Savepoint Se puede crear una marca en una transacción usando el SAVEPOINT. En consecuencia, la transacción puede dividirse en dos secciones mas pequeñas. Esto permite que se descarten los cambios hechos hasta la marca usando la sentencia ROLLBACK TO SAVEPOINT. Si crea un segundo savepoint con el mismo nombre que un savepoint anterior, este último es eliminado.

46 Rollback a Nivel de Sentencia
Si una única sentencia DML falla durante su ejecución, entonces se hace rollback sobre esa sentencia solamente. Oracle8 implementa una marca de seguridad o savepoint implícito. Todos los otros cambios se mantienen. El usuario debería terminar explícitamente las transacciones usando una sentencia COMMIT o ROLLBACK. Rollback a Nivel de Sentencia Parte de una transacción puede ser descartada por un rollback implícito si se detecta un error en la ejecución de una sentencia. Si una sentencia DML falla durante la ejecución de una transacción, su efecto es revertido por un rollback a nivel de sentencia, pero no se descartarán los cambios efectuados por las sentencias DML previas en la transacción. Las mismas pueden confirmarse o no de manera explícita por el usuario. Oracle realiza un COMMIT implícito antes y después de cualquier sentencia DDL. De esta manera, aunque la sentencia DDL no se ejecute con éxito, no se pueden deshacer los cambios porque el servidor ya ha realizado un commit. Terminar explícitamente las transacciones ejecutando una sentencia COMMIT o ROLLBACK.

47 Consistencia en Lectura
La consistencia en lectura garantiza una vista consistente de los datos en cualquier circunstancia. Los cambios realizados por otro usuario no crean conflictos con los cambios realizados por otro usuario. Asegura que sobre los mismos datos: Las lecturas no esperan a las escrituras y viceversa. Consistencia en Lectura Los usuarios de la base de datos realizan dos tipos de acceso a la base de datos: Operaciones de lectura (sentencias SELECT) Operaciones de escritura (sentencias INSERT, UPDATE, DELETE) La consistencia en lectura es necesaria para que: Las lecturas y escrituras a la b.d. aseguren una vista consistente de los datos Las lecturas no vean datos que están en proceso de cambio Las escrituras aseguren que los cambios a la b.d. se hacen de forma consistente Los cambios realizados por una escritura no crean conflictos con los cambios que otra escritura está realizando El propósito de la consistencia en lectura es asegurar que cada usuario, ve los datos tal como están desde el último commit, antes de que comience una operación DML.

48 Implementación de la Consistencia en Lectura
Bloques de Datos update emp set sal = 2000 where ename = 'SCOTT' Segmentos de Rollbck Usuario A Datos cambiados y no cambiados select * from emp Imagen Consistente en Lectura Antes de cambiar los datos “antiguos” Implementación de la Consistencia en Lectura La consistencia en lectura es una implementación automática. Mantiene una copia parcial de la b.d. en segmentos de rollback. Cuando una operación de insert, update o delete se realiza contra la b.d, el servidor Oracle8 hace una copia de los datos antes de su cambio y la escribe en un segmento de rollback. Todas las lecturas, excepto aquella que realiza el cambio, ven la b.d. tal como estaba, leyendo de los segmentos de rollback, que es como una instantánea (snapshot) de los datos. Antes de hacer el commit de los cambios en la b.d, sólo el usuario que modifica los datos ve los cambios, el resto leen del segmento de rollback. Esto garantiza que las lecturas son consistentes. Al hacer commit de una sentencia DML, el cambio realizado a la b.d. se convierte visible a cualquiera que ejecute una sentencia SELECT. El espacio ocupado por el dato “antiguo” en el segmento de rollback, queda liberado para ser rehusado Si la transacción experimenta un rollback, los cambios se “deshacen”. La versión original, antigua de los datos en el segmento de rollback se escriben de nuevo a la tabla. Todos los usuarios ven la b.d. tal como estaba antes de comenzar la transacción. Usuario B

49 Bloqueos Bloqueos en Oracle8:
Previenen la intereacción destructiva entre transacciones concurrentes No requieren acciones por parte del usuario Automáticamente utilizan el nivel más bajo de restricción Se mantienen mientras dura la transacción Tienen básicamente dos modos: Exclusive (exclusivos) Shared (compartidos) ¿Qué son los Bloqueos? Los bloqueos son mecanismos que previenen conflictos entre transacciones, que acceden a los mismos recursos, bien sea un objeto de usuario (como tablas o registros), o un objeto del sistema no visible a los usuarios (como estructuras de datos compartidas y registros del diccionario de datos). Cómo Oracle Bloquea los Datos El bloqueo en Oracle es completamente automático y no requiere acción por parte del usuario. El bloqueo implícito ocurre para todas las sentencias SQL. El bloqueo por defecto de Oracle es un mecanismo automático que utiliza el nivel más bajo aplicable de restricción, por tanto ofrece el grado más alto de concurrencia y máxima integridad de datos. Oracle también permite que el usuario bloquee los datos manualmente. Modos de Bloqueo Oracle usa dos modelos de bloqueo en una b.d. multiusuario:

50 Resumen Comando Descripción INSERT Agrega una fila nueva a la tabla.
UPDATE Modifica filas de una tabla. DELETE Elimina filas de una tabla. COMMIT Hace permanentes todos los cambios pendientes. SAVEPOINT Permite hacer un rollback hasta la marca de savepoint. ROLLBACK Descarta todos los cambios pendientes de los datos. Resumen Manipule datos de la base de datos, por medio de sentencias INSERT, UPDATE, y DELETE. Controle las modificaciones a los datos por medio de sentencias COMMIT, SAVEPOINT, y ROLLBACK. Oracle8 garantiza una vista consistente de los datos en cualquier momento. Los bloqueos pueden ser implícitos o explícitos.

51 Creación y Gestión de Tablas

52 Objetivos Al completar esta lección, debería ser capaz de hacer lo siguiente: Describir los principales objetos de la B.D. Crear tablas Describir los tipos de datos que se pueden usar al definir una columna Alterar definiciones de tablas Borrar, renombrar y truncar tablas Objetivo En esta lección, aprenderá sobre los principales objetos de la b.d. y sus relaciones entre ellos. También aprenderá a crear, alterar y borrar tablas.

53 Objetos de la Base de Datos
Objeto Descripción Tabla Unidad básica de almacenamiento; compuesta de registros y columnas. Vista Lógicamente representa un subconjunto de una o más tablas. Secuencia Genera valores para claves primarias. Indice Mejoran el rendimiento de algunas consultas Sinónimo Da nombres alternativos a los objetos. Objetos de la Base de Datos Una base de datos Oracle8 puede contener múltiples estructuras de datos. Cada estructura debería definirse en el diseño de la b.d, para que pueda ser creada durante la etapa de construcción del desarrollo de la base de datos. Principales Objetos: Tabla: Almacenan datos. Vista: Subconjunto de datos de una o más tablas. Secuencia: Genera valores de clave primaria. Indice: Mejora el rendimiento de algunas consultas. Sinónimo: Da nombres alternativos a objetos. Estructuras de Tablas de Oracle8 Las tablas pueden ser creadas en cualquier momento, incluso mientras los usuarios usan la b.d. No necesita especificar el tamaño de ninguna tabla. El tamaño es definido por la cantidad de espacio en la b.d. según va creciendo. Es importate, sin embargo, estimar cuánto espacio utilizará una tabla. La estructura de una tabla puede ser modificada online.

54 Reglas para los Nombres
Deben comenzar con una letra. Pueden tener una longitud de 1-30 caracteres de largo. Deben contener solamente A–Z, a–z, 0–9, _, $, y # No deben duplicar el nombre de otro objeto que sea propiedad del mismo usuario. No debe ser una palabra reservada del Servidor Oracle8. Reglas para Nombres Nombre las tablas y columnas, y demás objetos de la b.d Oracle8, de acuerdo a reglas estándar: Los nombres de tablas y columnas tienen que comenzar con una letra. Longitud max. 30 caract. Los nombres tienen que contener sólo caracteres A-Z, a-z, 0-9, _ (underscore), $, y # (caracteres legales, pero su uso no es recomendable). Los nombres no pueden coincidir con el nombre de otro objeto del mismo usuario. Los nombres no pueden ser una palabra reservada de Oracle8. Guía de Escritura para Nombres Utilice nombres descriptivos para tablas y otros objetos de la b.d. Nombre la misma entidad de forma consistente en tablas diferentes. Por ejemplo, el nº de departamento, lo llamaremos DEPTNO, tanto en la tabla EMP, como en la tabla DEPT. Nota: Los nombres son sensibles a mayúsculas/minúsculas. Por ejemplo, no es lo mismo EMP, Emp, o eMp. Para más información, ver: Oracle8 Server SQL Reference, Release 8.0, “Object Names and Qualifiers.”

55 La Sentencia CREATE TABLE
Tiene que tener : El privilegio CREATE TABLE Un área de almacenamiento Ha de especificar: Nombre de tabla Para las columnas: nombre, tipo de dato y tamaño CREATE TABLE [schema.]table (column datatype [DEFAULT expr]; La Sentencia CREATE TABLE Crear tablas para almacenar datos ejecutando el comando SQL CREATE TABLE. Este es uno de los comandos del lenguaje de definición de datos o DDL (data definition language), el mismo será cubierto en varias de las próximas lecciones. Los comandos DDL son un subconjunto de comandos SQL usados para crear, modificar o eliminar estructuras de bases de datos en Oracle8. Esos comandos tienen un efecto inmediato sobre la base de datos y también graban información en el diccionario de datos. Para crear una tabla, un usuario debe tener el privilegio CREATE TABLE y un área de almacenamiento para crear objetos. El administrador de la base de datos usa comandos del lenguaje de control de datos o DCL (data control language), los cuales son cubiertos en una lección posterior, para otorgarle privilegios a los usuarios. Sintaxis: schema es el mismo nombre que el del propietario. table es el nombre de la tabla. DEFAULT expr especifica un valor por defecto si el mismo es omitido en la sentencia INSERT. column es el nombre de la columna. datatype es el tipo de dato y longitud de la columna. column_constraint es una restricción de integridad como parte de la definición de la columna. table_constraint es una restricción de integridad como parte de la definición de la tabla Para más información, ver: Oracle8 Server SQL Reference, Release 8.0, “CREATE TABLE.”

56 Referencia a Tablas de Otros Usuarios
Las tablas propiedad de otros usuarios no pertenecen al esquema del usuario. Debe de utilizar como prefijo de la tabla, el nombre del propietario. Referencias a Tablas de Otros Usuarios Un esquema (schema) es una colección de objetos. Los objetos de un esquema son las estructuras lógicas que hacen referencia directa a los datos en una base de datos. Incluyen tablas, vistas, sinónimos, secuencias, stored procedures, índices, clusters y links a la base de datos. Si la tabla no es propiedad del usuario que crea la restricción, el nombre del usuario debe preceder al de la tabla referenciada en la restricción.

57 La Opción DEFAULT Especifica un valor por defecto para una columna, durante una inserción. … hiredate DATE DEFAULT SYSDATE, … Los valores permitidos son literales, expresiones, o funciones SQL, tales como SYSDATE o USER. No se permiten valores que sean nombres de otra columna o una pseudocolumna. El valor por defecto debe ser del tipo que tiene definido la columna. La Opción DEFAULT Usando la opción DEFAULT se puede dar un valor por defecto a una columna. Esta opción previene el ingreso de valores nulos en aquellas filas que no especifican un valor para esa columna. El valor por defecto puede ser un literal, una expresión, o una función SQL tal como SYSDATE y USER, pero el valor no puede ser el nombre de otra columna o pseudocolumna, tal como NEXTVAL o CURRVAL. La expresión por defecto debe ser del mismo tipo que el de la columna.

58 Creación de Tablas Crear la Tabla:
SQL> CREATE TABLE dept 2 (deptno NUMBER(2), 3 dname VARCHAR2(14), 4 loc VARCHAR2(13)); Table created. Verificar que se ha creado correctamente: SQL> DESCRIBE dept Name Null? Type DEPTNO NOT NULL NUMBER(2) DNAME VARCHAR2(14) LOC VARCHAR2(13) Creación de Tablas El ejemplo de la parte superior, crea la tabla DEPT, con tres columnas, llamadas DEPTNO, DNAME y LOC. A continuación se confirma la creación de la tabla con el comando DESCRIBE. Dado que la creación de una tabla es una sentencia DDL, se realizará un commit automático al ejecutar la sentencia.

59 Consultas al Diccionario de Datos
Describir tablas propiedad del usuario. SQL> SELECT * 2 FROM user_tables; Ver distintos tipos de objetos propiedad del usuario. SQL> SELECT DISTINCT object_type 2 FROM user_objects; Ver tablas, vistas, sinónimos y secuencias propiedad del usuario. Consultas al Diccionario de Datos Puede consultar tablas del diccionario de datos para localizar información acerca de los objetos que le pertenecen como usuario. Algunas de las tablas del diccionario, utilizadas frecuentemente, son: USER_TABLES USER_OBJECTS USER_CATALOG Nota: USER_CATALOG tiene un sinónimo llamado CAT. Puede utilizar este sinónimo, en vez de USER_CATALOG en sentencias SQL, como en el ejemplo: SQL> SELECT * 2 FROM CAT; SQL> SELECT * 2 FROM user_catalog;

60 Tipos de Datos Tipo de Dato Descripción
VARCHAR2(size) Dato carácter de longitud variable CHAR(size) Dato carácter de longitud fija NUMBER(p,s) Dato numérico de longitud variable DATE Valores de fecha y hora LONG Dato carácter de longitud variable hasta 2 gigabytes CLOB Dato carácter “single-byte” de hasta 4 gigabytes RAW and LONG RAW Datos binarios BLOB Datos binarios hasta 4 gigabytes BFILE Datos binarios almacenados en un fichero externo; hasta 4 gigabytes Tipos de Datos

61 Creación de una Tabla por medio de una Subconsulta
Crear una tabla e insertar filas combinando el comando CREATE TABLE con la opción AS subquery. Hacer coincidir la cantidad de columnas especificadas con las columnas del subquery. Definir las columnas con sus nombres, valores por defecto y restricciones de integridad solamente. CREATE TABLE table [column(, column...)] AS subquery; Creación de una Tabla con Registros de otra Tabla Un segundo método para crear una tabla, es aplicar una cláusula AS como subconsulta, para crear tanto la tabla, como para llenarla con los registros devueltos por la subconsulta. Sintaxis: table es el nombre de la tabla. column es el nombre de la columna, valor por dflt, y restricción de integridad. subquery es la sentencia SELECT que define los registros a insertar en la nueva tabla. Guía de Escritura La tabla será creada con los nombres de columnas especificadas, y los registros recuperados por la sentencia SELECT serán insertados en la tabla. La definición de una columna puede contener sólo nombre de la columna y su valor por dflt. Si se dan nombres de columnas, el nº de columnas será igual al nº de columnas especificadas en la sentencia SELECT de la subconsulta. Si no se dan nombres de columnas, los nombres de las columnas de la tabla, serán los mismos que los nombres de la subconsulta.

62 Creación de una Tabla por medio de una Subconsulta
SQL> CREATE TABLE dept30 2 AS SELECT empno, ename, sal*12 ANNSAL, hiredate 4 FROM emp 5 WHERE deptno = 30; Table created. SQL> DESCRIBE dept30 Name Null? Type EMPNO NOT NULL NUMBER(4) ENAME VARCHAR2(10) ANNSAL NUMBER HIREDATE DATE Creación de una Tabla con Registros de otra Tabla (continuación) El ejemplo de la parte superior, crea una tabla, DEPT30, que contiene detalles de todos los empleados que trabajan en el departamento 30. Observe que los datos para la tabla DEPT30, vienen de la tabla EMP. Puede verificar la existencia de una tabla, y chequear la definición de sus columnas, usando el comando DESCRIBE de SQL*Plus. Asigne alias de columnas, si selecciona una expresión.

63 La Sentencia ALTER TABLE
Use la sentencia ALTER TABLE para: Añadir una nueva columna Modificar una columna que ya existe Dar un valor por defecto a una nueva col. ALTER TABLE table ADD (column datatype [DEFAULT expr] [, column datatype]...); ALTER TABLE table MODIFY (column datatype [DEFAULT expr] [, column datatype]...); Sentencia ALTER TABLE Después de haber creado una tabla, puede necesitar cambiar su estructura, porque tal vez omitió una columna, o la definición ha cambiado. Puede hacer esto usando la sentencia ALTER TABLE. Puede añadir columnas a una tabla usando la sentencia ALTER TABLE con la cláusula ADD. Sintaxis: table es el nombre de la tabla. column es el nombre de la nueva columna. datatype es el tipo de dato y longitud de la nueva columna. DEFAULT expr especifica el valor por defecto para la nueva columna. Puede modificar columnas ya existentes en una tabla usando la sentencia ALTER TABLE, con la cláusula MODIFY. Nota: La transparencia ofrece una sintaxis abreviada para ALTER TABLE (la lección 11, cubre otros aspectos de la sentencia).

64 Añadir una Columna “…añadir una nueva columna a la tabla DEPT30”
EMPNO ENAME ANNSAL HIREDATE 7698 BLAKE MAY-81 7654 MARTIN SEP-81 7499 ALLEN FEB-81 7844 TURNER SEP-81 ... JOB DEPT30 EMPNO ENAME ANNSAL HIREDATE 7698 BLAKE MAY-81 7654 MARTIN SEP-81 7499 ALLEN FEB-81 7844 TURNER SEP-81 ... JOB Añadir una Columna El ejemplo de la parte superior, añade la columna JOB a la tabla DEPT30. Observe que la nueva columna, pasa a ser la última columna de la tabla.

65 Añadir una Columna Use la cláusula ADD para añadir cols.
SQL> ALTER TABLE dept30 2 ADD (job VARCHAR2(9)); Table altered. La nueva columna aparece en último lugar EMPNO ENAME ANNSAL HIREDATE JOB 7698 BLAKE MAY-81 7654 MARTIN SEP-81 7499 ALLEN FEB-81 7844 TURNER SEP-81 ... 6 rows selected. Guía para Añadir una Columna Puede añadir o modificar columnas, pero no eliminarlas de una tabla. No puede especificar el orden de la nueva columna (será la última). Nota: Si una tabla ya contiene registros al añadir una nueva columna, ésta se inicializa con valores nulos para todos los registros. Puede definir una columna NOT NULL sólo si la tabla está vacía.

66 Modificar una Columna Puede cambiar el tipo de dato de una columna, su tamaño y valor por dflt. Si cambia el valor por defecto, afectará sólo a sucesivas inserciones en la tabla. ALTER TABLE dept30 MODIFY (ename VARCHAR2(15)); Table altered. Modificar una Columna Puede modificar la definición de una columna, por medio de la sentencia ALTER TABLE, con la cláusula MODIFY. Puede modificar el tipo de dato, tamaño y valor por defecto de una columna. Guía de Escritura Incrementa el ancho o precisión de una columna numérica. Reduzca el ancho de una columna, si la columna sólo contiene valores nulos o si la tabla no esta vacía. Cambie el tipo de dato si la columna contiene valores nulos. Convierta una columna CHAR a VARCHAR2 o viceversa, si la columna contiene valores nulos, o si no cambia el tamaño. Un cambio del valor por defecto de una columna, afecta sólo a sucesivas inserciones en la tabla.

67 Eliminación de una Tabla
Se borran todos los datos de la tabla. Cualquier transacción pendiente termina con commit. Todos los índices de la tabla se borran. No puede hacer rollback de la sentencia SQL> DROP TABLE dept30; Table dropped. Borrar una Tabla La sentencia DROP TABLE elimina la definición de una tabla en Oracle8. Cuando borra una tabla, la base de datos pierde todos los datos de la tabla y todos los índices asociados. Sintaxis: donde: table es el nombre de la tabla Guía de Escritura Todos los datos se borran de la tabla. Cualquier vista, sinónimo, proc. almacenado, función y paquete, permanecerán como “invalid” Cualquier transacción pendiente finalizará con commit. Sólo el propietario de la tabla u otro usuario con el permiso DROP ANY TABLE puede eliminar una tabla. La sentencia DROP TABLE, una vez ejecutada es irreversible. Si es usted el propietario de la tabla, o tiene un privilegio de alto nivel, la tabla se elimina inmediatamente. Todas las sentencias DDL realizan un commit automático, por tanto la transacción queda permanente. DROP TABLE table;

68 Cambiar el Nombre de un Objeto
Para cambiar el nombre de una tabla, vista, secuencia o sinónimo, ejecutaremos la instrucción RENAME. Debe ser el propietario del objeto. SQL> RENAME dept TO department; Table renamed. Renombrar una Tabla Otra sentencia DDL es la sentencia RENAME, que se utiliza para cambiar el nombre a una tabla, vista, secuencia o sinónimo. Sintaxis: RENAME old_name TO new_name; donde: old_name es el nombre antiguo del objeto. new_name es el nombre nuevo del objeto. Ha de ser el propietario del objeto que renombra.

69 Truncar una Tabla La Sentencia TRUNCATE TABLE:
Borra todos los registros de una tabla Libera todo el espacio de almacenamiento ocupado por la tabla No puede hacer rollback Alternativamente puede borrar los registros, con la sentencia DELETE SQL> TRUNCATE TABLE department; Table truncated. Truncar una Tabla Otra sentencia DDL es TRUNCATE TABLE, que se utiliza para borrar todos los registros de una tabla y liberar así, el espacio usado por la tabla. Al usar la sentencia TRUNCATE TABLE, no puede hacer rollback de los registros eliminados. Sintaxis: TRUNCATE TABLE table; donde: table es el nombre de la tabla Tiene que ser el propietario de la tabla o tener el privilegio del sistema DELETE TABLE. La sentencia DELETE puede también eliminar los registros de una tabla, pero no libera el espacio.

70 Añadir Comentarios a una Tabla
Puede añadir comentarios a una tabla o columna, por medio de la instrucción COMMENT Los comentarios podrá verlos a través de determinadas estructuras del D.D. ALL_COL_COMMENTS USER_COL_COMMENTS ALL_TAB_COMMENTS USER_TAB_COMMENTS SQL> COMMENT ON TABLE emp 2 IS 'Employee Information'; Comment created. Añadir un Comentario a una Tabla Puede añadir un comentario de hasta 2000 bytes, sobre una columna, tabla, vista o snapshot, por medio de la sentencia COMMENT. El comentario se almacena en el diccionario de datos, y puede ser visualizado, por medio de la columna COMMENTS de una de estas vistas del d.d: ALL_COL_COMMENTS USER_COL_COMMENTS ALL_TAB_COMMENTS USER_TAB_COMMENTS Sintaxis: donde: table es el nombre de la tabla. column es el nombre de la columna en la tabla. text es el texto del comentario. Puede borrar un comentario de la b.d. definiéndolo como “nada”, es decir, (‘ ’): COMMENT ON TABLE table | COLUMN table.column IS 'text'; SQL> COMMENT ON TABLE emp IS ' ';

71 Resumen Sentencia Descripción CREATE TABLE Creación de tablas.
ALTER TABLE Modifica la estructura de una tabla. DROP TABLE Borra la estructura y registros de la tabla RENAME Cambia el nombre de una tabla, vista, secuencia o sinónimo. TRUNCATE Borra todos los registros y libera el espacio ocupados por los registros de la tabla. COMMENT Añade comentarios a una tabla o vista. CREATE TABLE Puede crear una tabla. Crear una tabla basada en otra, por medio de una subconsulta. ALTER TABLE Modifica la estructura de una tabla. Cambia ancho de columnas, tipo de dato y, añade columnas. DROP TABLE Elimina los registros, y la estructura de la tabla. Una vez ejecutado, este comando no permite un rollback. RENAME Renombrar una tabla, vista, secuencia o sinónimo. TRUNCATE Elimina todos los registros de una tabla y libera el espacio utilizado por la tabla. La sentencia DELETE solamente elimina los registros (NO el espacio). COMMENT Añade un comentario a una tabla o vista. Consulte el diccionario de datos para visualizar los comentarios.

72 Constraints (Restricciones)

73 Objetivos Al completar esta lección, debería ser capaz de hacer lo siguiente: Describir constraints Crear y mantener constraints Objetivo En esta lección, aprenderá a implementar reglas de negocio a través de restricciones de integridad (Integrity Constraints).

74 ¿Qué son las Constraints?
“Fuerzan reglas a nivel de tabla” Las constraints previenen el borrado de una tabla si existen dependencias. Los siguientes tipos de constrainst son válidos en Oracle8: NOT NULL UNIQUE Key PRIMARY KEY FOREIGN KEY CHECK Restricciones El servidor Oracle8 utiliza las constraints para prevenir la entrada de datos no válidos en una tabla. Se pueden usar restricciones para: Garantizar el cumplimiento de las reglas a nivel de tablas, en cualquier momento que una fila es insertada, actualizada o borrada de la tabla. La restricción debe ser satisfecha para que la operación tenga éxito. Impedir la eliminación de una tabla si existen dependencias desde otras tablas. Ofrece reglas para las herramientas Oracle, tales como Developer/2000. Restricciones de Integridad de Datos Par más información, ver: Oracle8 Server SQL Reference, Release 8.0, “CONSTRAINT Clause.”

75 Guía para el Uso de Constraints
Asigne un nombre a la restricción, en caso contrario el Server generará uno usando el formato SYS_Cn. Se puede crear una restricción En el momento de crear la tabla. Después que la tabla ha sido creada. Se puede definir un restricción a nivel de columna o a nivel de tabla. Vea la constraint en el diccionario de datos. Convenciones para los Nombres de las Restricciones Todas las restricciones se encuentran almacenadas en el diccionario de datos. Las restricciones son fáciles de referenciar si se les da un nombre significativo. Los nombres deben seguir las reglas standard para los nombres de los objetos. Si no se le asigna un nombre a la restricción, Oracle8 genera uno con el formato SYS_Cn, donde n es un entero para crear un nombre único. Notas: Las restricciones pueden ser definidas al crear la tabla o después. Puede ver las restricciones de una tabla específica, mediante la tabla USER_CONSTRAINTS del diccionario de datos.

76 Definición de Constraints
CREATE TABLE [schema.]table (column datatype [DEFAULT expr] [column_constraint], [table_constraint]); CREATE TABLE emp( (empno NUMBER(4), ename VARCHAR2(10), deptno NUMBER(7,2) NOT NULL, CONSTRAINT emp_empno_pk PRIMARY KEY (EMPNO)); Definición de Restricciones El ejemplo de la parte superior, muestra la sintaxis para definir constraints mientras crea la tabla. En la Sintaxis: schema es el mismo que el nombre del propietario. table es el nombre de la tabla. DEFAULT expr especifica un valor por dflt. si se omite el valor durante un INSERT. column es el nombre de la columna. datatype es el tipo de dato y longitud de la columna. column_constraint es una constraint de integridad a nivel de columna. table_constraint es una constraint de integridad a nivel de tabla. Para más información, ver: Oracle8 Server SQL Reference, Release 8.0, “CREATE TABLE.”

77 Definición de Constraints
Constraint a nivel de columna: Constraint a nivel de tabla: column [CONSTRAINT constraint_name] constraint_type, column,... [CONSTRAINT constraint_name] constraint_type (column, ...), Definición de Restricciones (continuación) Las constraints se crean normalmente a la vez que se crea la tabla. Pueden ser añadidas después de haber creado la tabla y también pueden desactivarse temporalmente. Las constraints pueden ser definidas a dos niveles: En la Sintaxis: constraint_name es el nombre de la constraint. constraint_type es el tipo de constraint.

78 La Constraint NOT NULL Asegura que los valores nulos no serán permitidos para la columna. EMP EMPNO ENAME JOB COMM DEPTNO 7839 KING PRESIDENT 7698 BLAKE MANAGER 7782 CLARK MANAGER 7566 JONES MANAGER ... NOT NULL constraint (ningún registro podrá contener un valor nulo para esta columna) Ausencia de la constraint NOT NULL (cualquier reg. puede contener un valor nulo para esta columna) Constraint NOT NULL La restricción NOT NULL La restricción NOT NULL asegura que en la columna no se permitirán valores nulos. Las columnas sin la restricción NOT NULL pueden contener valores nulos, por defecto.

79 La Constraint NOT NULL Definido a nivel de columna:
SQL> CREATE TABLE emp( 2 empno NUMBER(4), 3 ename VARCHAR2(10) NOT NULL, 4 job VARCHAR2(9), 5 mgr NUMBER(4), 6 hiredate DATE, 7 sal NUMBER(7,2), 8 comm NUMBER(7,2), 9 deptno NUMBER(7,2) NOT NULL); La Restricción NOT NULL (continuación) Esta restricción puede especificarse solamente al nivel de columna, no a nivel de tabla. El ejemplo de la parte superior, aplica una constraint NOT NULL a las columnas ENAME y DEPTNO de la tabla EMP. Dado que estas constraints no han sido nombradas explícitamente, el servidor Oracle8, creará nombres implícitamente. Puede especificar el nombre de una constraint, al especificar la misma. Nota: Todas los ejemplos sobre constraints descritos en esta lección, pueden no estar presentes en las tablas que usted utiliza actualmente. Tenga en cuenta, que podría añadir estas constraints a sus tablas. … deptno NUMBER(7,2) CONSTRAINT emp_deptno_nn NOT NULL;

80 La Constraint UNIQUE Key
DEPT DEPTNO DNAME LOC 10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON 50 SALES DETROIT 60 BOSTON Insert into No permitido (DNAME¾SALES ya existe) permitido La Restricción de UNIQUE KEY Una restricción UNIQUE requiere que cada valor en una columna o conjunto de columnas (clave) sean únicas -es decir, dos registros de una tabla no tendrán valores duplicados para determinada columna o conjunto de columnas. La columna (o conjunto de columnas) incluidas en la definición de la constraint de clave UNIQUE se conoce con el nombre de clave única (unique key). Si la clave UNIQUE está compuesta de más de una columna, ese grupo de columnas, recibe el nombre de clave única compuesta (composite unique key). Las claves UNIQUE permiten la entrada de nulos, a menos que también defina la restricción NOT NULL para las misma-s columna-s. De hecho, cualquier número de registros pueden incluir nulos para columnas que no tengan la cláusula NOT NULL, porque los valores “null” no se consideran igual a nada. Un nulo en una columna (o en todas las columnas de una clave única compuesta), siempre satisface un restricción de clave UNIQUE. Nota: Dado el mecanismo de búsqueda para restricciones UNIQUE sobre más de una columna, no puede haber valores idénticos en columnas parciales tipo not-null de una restricción de clave UNIQUE compuesta.

81 La Constraint UNIQUE Key
Definido bien a nivel de tabla o de columna: SQL> CREATE TABLE dept( 2 deptno NUMBER(2), 3 dname VARCHAR2(14), 4 loc VARCHAR2(13), 5 CONSTRAINT dept_dname_uk UNIQUE); La Restricción de UNIQUE KEY (continuación) Las restricciones de clave UNIQUE pueden ser definidas a nivel de columna o de tabla. Una clave única compuesta, se creará usando la definición a nivel de tabla. El ejemplo de la parte superior, aplica la restricción UNIQUE a la columna DNAME de la tabla DEPT. El nombre de la restricción es DEPT_DNAME_UK.

82 La Constraint PRIMARY KEY
DEPT DEPTNO DNAME LOC 10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS 30 SALES CHICAGO 40 OPERATIONS BOSTON Insert into 20 MARKETING DALLAS FINANCE NEW YORK No permitido (DEPTNO¾20 ya existe) No permitido (DEPTNO es null) La Restricción PRIMARY KEY Una restricción PRIMARY KEY crea una primary key para la tabla. Se puede crear solamente una primary key por tabla. La restricción PRIMARY KEY es una columna o conjunto de ellas que identifican unívocamente a cada fila de una tabla. Esta restricción garantiza la unicidad de la columna (o combinación de ellas) y asegura que ninguna columna que sea parte de la primary key pueda contener un valor nulo.

83 La Constraint PRIMARY KEY
Definido bien a nivel de tabla o de columna: SQL> CREATE TABLE dept( 2 deptno NUMBER(2), 3 dname VARCHAR2(14), 4 loc VARCHAR2(13), 5 CONSTRAINT dept_dname_uk UNIQUE, 6 CONSTRAINT dept_deptno_pk PRIMARY KEY); La Restricción PRIMARY KEY (continuación) Puede definirse a nivel de columna o de tabla; una PRIMARY KEY compuesta se creará usando la definición a nivel de tabla. El ejemplo de la parte superior, define una restricción PRIMARY key sobre la columna DEPTNO de la tabla DEPT. El nombre de la restricción es DEPT_DEPTNO_PK. Nota: Un índice UNIQUE es automáticamente creado para la columna PRIMARY KEY.

84 The FOREIGN KEY Constraint
DEPT PRIMARY key DEPTNO DNAME LOC 10 ACCOUNTING NEW YORK 20 RESEARCH DALLAS ... EMP EMPNO ENAME JOB COMM DEPTNO 7839 KING PRESIDENT 7698 BLAKE MANAGER ... FOREIGN key No permitido (DEPTNO¾9 no existe en la tabla DEPT Permitido 7571 FORD MANAGER 7571 FORD MANAGER Insert into La Restricción FOREIGN KEY (Clave Externa) La restricción FOREIGN KEY, o de integridad referencial, designa a una columna o combinación de ellas como una foreign key y establece una relación con una primary key o unique key de la misma tabla o de otra tabla. El ejemplo e la parte superior, la columna DEPTNO tiene definida una clave externa en la tabla EMP (tabla dependiente o tabla hija); referencia la columna DEPTNO de la tabla DEPT (tabla padre) El valor de la foreign key debe ser del mismo tipo que de la tabla padre o ser NULL. Las restricciones FOREIGN KEY pueden definirse a nivel de columna o de tabla. Una foreign key compuesta se crea usando la definición a nivel de tabla. Las foreign keys están basadas en valores de datos y son puramente lógicos, no son punteros físicos. Una foreign key que es parte de una primary key no puede tener un valor NULL porque ninguna parte de una primary key puede tenerlo.

85 The FOREIGN KEY Constraint
Definido bien a nivel de tabla o de columna: SQL> CREATE TABLE emp( 2 empno NUMBER(4), 3 ename VARCHAR2(10) NOT NULL, 4 job VARCHAR2(9), 5 mgr NUMBER(4), 6 hiredate DATE, 7 sal NUMBER(7,2), 8 comm NUMBER(7,2), 9 deptno NUMBER(7,2) NOT NULL, 10 CONSTRAINT emp_deptno_fk FOREIGN KEY (deptno) 11 REFERENCES dept (deptno)); La Restricción FOREIGN KEY (Clave Externa) (continuación) Las restricciones FOREIGN KEY pueden ser definidas a nivel de columna o a nivel de tabla. Una FOREIGN KEY compuesta se crea usando la definición a nivel de tabla. El ejemplo de la parte superior, define una restricción FOREIGN KEY sobre la columna DEPTNO de la tabla EMP. El nombre de la restricción es EMP_DEPTNO_FK.

86 La Constraint FOREIGN KEY Palabras Reservadas
Define la columna en la tabla hija a nivel de constraint de tabla REFERENCES Identifica la tabla y columna en la tabla padre ON DELETE CASCADE Permite borrar en la tabla padre y borrar registros dependientes de la tabla hija. La Restricción FOREIGN KEY (Clave Externa) (continuación) La foreign key se define en la tabla hija, y la tabla que contiene la columna referenciada es la tabla padre. Para definirla se usa una combinación de las siguientes palabras claves: FOREIGN KEY es usada para definir la columna en la tabla hija, cuando se establece la restricción a nivel de tabla. REFERENCES identifica la tabla y columna de la tabla padre. ON DELETE CASCADE indica que cuando la fila en la tabla padre es borrada, las filas dependientes en la tabla hija también serán borradas. Sin la opción ON DELETE CASCADE, la fila en la tabla padre no puede ser borrada mientras haya referencias a ella en la tabla hija.

87 La Constraint CHECK Define una condición que debe satisfacer cada fila. Expresiones no permitidas: Referencias a las pseudocolumnas CURRVAL, NEXTVAL, LEVEL, o ROWNUM. Llamadas a las funciones SYSDATE, UID, USER, o USERENV. Consultas que se refieran a otros valores en otras filas. Se define o bien como una restricción a nivel de tabla, o a nivel de columna. La Restricción CHECK La restricción CHECK define la condición que cada fila debe satisfacer. La condición puede usarla misma sintaxis que las condiciones de las consultas, con las siguientes excepciones: Referencias a las pseudocolumnas CURRVAL, NEXTVAL, LEVEL o ROWNUM Llamadas a las funciones SYSDATE, UID, USER o USERENV Consultas que refieran a otros valores de otras filas Una columna simple puede tener varias restricciones CHECK que referencian la columna en su definición. Pueden ser definidas tanto a nivel de columna como a nivel de tabla. La sintaxis de la restricción puede aplicarse a cualquier columna en la tabla, no solamente a la columna sobre la que se está definiendo. ..., deptno NUMBER(2), CONSTRAINT emp_deptno_ck CHECK (DEPTNO BETWEEN 10 AND 99),...

88 Añadir una Constraint Añade o borra, pero no modifica una constraint.
ALTER TABLE table ADD [CONSTRAINT constraint] type (column); Añade o borra, pero no modifica una constraint. Activa-Desactiva constraints. Añade una constraint NOT NULL con la cláusula MODIFY. Añadir una Restricción Puede añadir una constraint para tablas ya existentes, usando la sentencia ALTER TABLE con la cláusula ADD. En la Sintaxis: table es el nombre de la tabla. constraint es el nombre de la restricción. type es el tipo de restricción. column es el nombre de la columna afectada por la restricción. El nombre de la restricción es opcional, aunque recomendado. Si no nombra la restricción, el sistema generará un nombre automáticamente. Guía de Escritura Puede añadir, borrar, activar o desactivar una restricción, pero no modificar su estructura. Puede añadir una restricción NOT NULL a una columna existente, usando la cláusula MODIFY de la sentencia ALTER TABLE.

89 Añadir una Constraint Añada una constraint FOREIGN KEY en la tabla EMP indicando que un manager (director) tiene que existir previamente como número de empleado. SQL> ALTER TABLE emp 2 ADD CONSTRAINT emp_mgr_fk 3 FOREIGN KEY(mgr) REFERENCES emp(empno); Table altered. Añadir una Restricción El ejemplo de la parte superior, crea una restricción FOREIGN KEY sobre la tabla EMP. La restricción asegura que un empleado existe como tal en la tabla EMP, a la hora de asignarlo como manager de otro empleado.

90 Eliminación de una Constraint
Borra la constraint del manager de la tabla EMP. SQL> ALTER TABLE emp 2 DROP CONSTRAINT emp_mgr_fk; Table altered. Borra la constraint de PRIMARY KEY de la tabla DEPT y borra la constraint de FOREIGN KEY asociada en la columna EMP.DEPTNO. SQL> ALTER TABLE dept 2 DROP PRIMARY KEY CASCADE; Table altered. Borrar una Restricción Para borrar una restricción, puede identificar el nombre consultado las vistas del d.d: USER_CONSTRAINTS y USER_CONS_COLUMNS. A continuación, haga uso de la sentencia ALTER TABLE con la cláusula DROP. La opción CASCADE de la cláusula DROP provoca que cualquier restricción dependiente, también se borre. Sintaxis: ALTER TABLE table DROP PRIMARY KEY | UNIQUE (column) | CONSTRAINT constraint [CASCADE]; donde: table es el nombre de la tabla. column es el nombre de la columna afectada por la restricción. constraint es el nombre de la restricción. Cuando borra una restricción de integridad, esa restricción ya no es parte del servidor Oracle8 y por tanto, no está disponible en el diccionario de datos.

91 Desactivar Constraints
Ejecute la cláusula DISABLE de la sentencia ALTER TABLE para desactivar una constraint de integridad. Utilice la opción CASCADE para desactivar constrains dependientes. SQL> ALTER TABLE emp 2 DISABLE CONSTRAINT emp_empno_pk CASCADE; Table altered. Desactivando una Restricción Puede desactivar una restricción sin borrarla, usando la sentencia ALTER TABLE con la cláusula DISABLE. Sintaxis: ALTER TABLE table DISABLE CONSTRAINT constraint [CASCADE]; donde: table es el nombre de la tabla. constraint es el nombre de la restricción. Guía de Escritura Puede usar la cláusula DISABLE tanto en la sentencia CREATE TABLE, como en la sentencia ALTER TABLE. La cláusula CASCADE desactiva las restricciones de integridad dependientes.

92 Activar Constraints Active una constraint de integridad actualmente desactivada en la definición de la tabla, por medio de la cláusula ENABLE. Un índice UNIQUE o de PRIMARY KEY se crea automáticamente si activa una constraint tipo UNIQUE o PRIMARY KEY SQL> ALTER TABLE emp 2 ENABLE CONSTRAINT emp_empno_pk; Table altered. Activando una Restricción Puede activar una restricción sin borrarla, usando la sentencia ALTER TABLE con la cláusula DISABLE. Sintaxis: ALTER TABLE table ENABLE CONSTRAINT constraint; donde: table es el nombre de la tabla. constraint es el nombre de la restricción. Guía de Escritura Si activa una restricción, ésta se aplica a todos los datos de la tabla. Todos los datos de la tabla tendrán que ajustarse a la restricción. Si activa una restricción UNIQUE o PRIMARY KEY, se creará automáticamente un índice para la clave UNIQUE o PRIMARY KEY. Puede usar la cláusula ENABLE tanto en la sentencia CREATE TABLE, como en la sentencia ALTER TABLE.

93 Visualización de Constraints
Consulte la tabla USER_CONSTRAINTS para ver todos los nombres y definiciones de constraints. SQL> SELECT constraint_name, constraint_type, 2 search_condition 3 FROM user_constraints 4 WHERE table_name = 'EMP'; CONSTRAINT_NAME C SEARCH_CONDITION SYS_C C EMPNO IS NOT NULL SYS_C C DEPTNO IS NOT NULL EMP_EMPNO_PK P ... Visualizar Restricciones Tras crear una tabla, puede verificar su existencia haciendo uso del comando DESCRIBE. La única restricción que no puede verificar es NOT NULL. Para ver todas las restricciones sobre una tabla, consulte la tabla del d.d. USER_CONSTRAINTS. El ejemplo de la parte superior, visualiza todas las restricciones sobre la tabla EMP. Nota: Las restricciones que no reciben un nombre explícitamente por el propietario de la tabla, reciben un nombre asignado por el sistema. En la columna “constraint type”, la C hace referencia a CHECK, P a PRIMARYKEY, R a Integridad Referencial, y U a UNIQUE KEY. Observe que la restricción NULL, realmente es una restricción CHECK.

94 Visualización de las Columnas Asociadas con Constraints
Visualice las columnas asociadas con los nombres de constraints en la vista: USER_CONS_COLUMNS SQL> SELECT constraint_name, column_name 2 FROM user_cons_columns 3 WHERE table_name = 'EMP'; CONSTRAINT_NAME COLUMN_NAME EMP_DEPTNO_FK DEPTNO EMP_EMPNO_PK EMPNO EMP_MGR_FK MGR SYS_C EMPNO SYS_C DEPTNO Visualizar Restricciones (Constraints) Puede ver los nombres de las columnas involucradas en restricciones, consultando la vista del diccionario de datos USER_CONS_COLUMNS. Esta vista, es especialmente útil para restricciones, a las que el propio sistema ha asignado un nombre.

95 Resumen Cree los siguientes tipos de constraints: NOT NULL UNIQUE Key
PRIMARY KEY FOREIGN KEY CHECK Consulte la tabla USER_CONSTRAINTS para ver todos los nombres y definiciones de constraints. Resumen El servidor Oracle8 usa restricciones, llamadas constraints, para prevenir la entrada de datos no válidos en las tablas. Los siguientes tipos de restricciones son válidos en Oracle8: NOT NULL UNIQUE Key PRIMARY KEY FOREIGN KEY CHECK Puede consultar la tabla USER_CONSTRAINTS para visualizar todas las definiciones de constraints y sus nombres.

96 Creación de Vistas

97 Objetivos Al completar esta lección, debería ser capaz de hacer lo siguiente: Describir una Vista Crear una vista Recupera datos a través de una vista Alterar la definición de una vista Insertar, modificar y borrar datos a través de una vista Eliminación de vistas Objetivo En esta lección veremos cómo usar y crear vistas. También aprenderemos a objetos del diccionario de datos relevantes para recuperar información sobre vistas.

98 Objetos de la Base de Datos
Objecto Descripción Tabla Unidad básica de almacenamiento; compuesta de registros y columnas. Vista Lógicamente representa un subconjunto de una o más tablas. Secuencia Genera valores para claves primarias. Indice Mejoran el rendimiento de algunas consultas Sinónimo Da nombres alternativos a los objetos.

99 ¿Qué es una Vista? EMPNO ENAME JOB EMP Table EMPVU10 View
EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO 7839 KING PRESIDENT NOV 7782 CLARK MANAGER JUN 7934 MILLER CLERK JAN 7566 JONES MANAGER APR 7788 SCOTT ANALYST DEC 7876 ADAMS CLERK JAN 7369 SMITH CLERK DEC 7902 FORD ANALYST DEC 7698 BLAKE MANAGER MAY 7654 MARTIN SALESMAN SEP 7499 ALLEN SALESMAN FEB 7844 TURNER SALESMAN SEP 7900 JAMES CLERK DEC 7521 WARD SALESMAN FEB EMPNO ENAME JOB 7839 KING PRESIDENT 7782 CLARK MANAGER 7934 MILLER CLERK EMPVU10 View EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO 7839 KING PRESIDENT NOV 7698 BLAKE MANAGER MAY 7782 CLARK MANAGER JUN 7566 JONES MANAGER APR 7654 MARTIN SALESMAN SEP 7499 ALLEN SALESMAN FEB 7844 TURNER SALESMAN SEP 7900 JAMES CLERK DEC 7521 WARD SALESMAN FEB 7902 FORD ANALYST DEC 7369 SMITH CLERK DEC 7788 SCOTT ANALYST DEC 7876 ADAMS CLERK JAN 7934 MILLER CLERK JAN ¿Qué es una Vista? Podemos representar subconjuntos lógicos o combinaciones de datos mediante la creación de vistas de tablas. Una vista es una tabla lógica basada en una tabla u otra vista. Una vista no contiene datos en sí misma, pero es como una ventana a través de la cual se pueden ver o cambiar los datos de las tablas. Las tablas sobre las cuales se basa una vista se llaman tablas base. La vista se almacena como una sentencia SELECT en el diccionario de datos.

100 ¿Por qué Usar Vistas? Para restringir el acceso a la B.D.
Para ralizar consultas complejas fácilmente Para la indenpendencia de los datos Para presentar diferentes vistas de los mismos datos Ventajas de las Vistas Restringen el acceso a la base de datos, dado que la vista puede mostrar una porción selectiva de la misma. Permite a los usuarios realizar consultas simples para recuperar los resultados de consultas complicadas. Por ejemplo, las vistas permiten que los usuarios consulten datos de varias tablas sin la necesidad de conocer cómo escribr sentencias de uníón o join. Ofrecen independencia de los datos para usuarios y aplicaciones. Una vista puede ser usada para recuperar datos de diversas tablas. Ofrecen el acceso a los datos, a grupos de usuarios de acuerdo a su criterio particular. Para más información, ver: Referencia al SQL de Oracle8 Server, Versión 8, “CREATE VIEW.”

101 Vistas Simples y Vistas Complejas
Característica Vis. Simples Vis. Complejas Nº de Tablas Una Una o más Contiene funciones No Sí Contiene grup. de datos No Sí DML a través de la vista Sí No siempre Comparación entre Vistas Simples y Complejas Existen dos clasificaciones para las vistas: simples y complejas. La diferencia básica está relacionada con las operaciones DML (altas, bajas y modificaciones). Una vista simple es aquélla que: Deriva datos desde una sola tabla. No contiene funciones o grupos de datos. Puede realizar DML a través de la vista. Una vista compleja es aquélla que: Deriva datos de varias tablas. Contiene funciones o grupos de datos. No siempre puede realizar DML a través de la vista.

102 Creación de una Vista Puede incluir una subconsulta dentro de la sentencia CREATE VIEW. La subconsulta puede contener una SELECT compleja. La subconsulta no puede contener la claúsula ORDER BY. CREATE [OR REPLACE] [FORCE|NOFORCE] VIEW view [(alias[, alias]...)] AS subquery [WITH CHECK OPTION [CONSTRAINT constraint]] [WITH READ ONLY] Creación de una Vista Podemos crear una vista embebiendo una subconsulta dentro de la sentencia CREATE VIEW. En la sintaxis: OR REPLACE recrea la vista si ya existe. FORCE crea la vista sin importar que la tabla base exista o no. NOFORCE crea la vista únicamente si la tabla base existe. Es la opción por defecto. view es el nombre de la vista. alias especifica nombres para las expresiones seleccionadas en la consulta de la vista. El número de alias debe coincidir con el de expresiones seleccionadas por la vista. subquery es una sentencia SELECT completa. Se pueden usar los alias para las columnas de la lista del SELECT. WITH CHECK OPTION especifica que solamente las filas accesibles a la vista pueden ser insertadas o actualizadas. constraint es el nombre asignado a la restricción CHECK OPTION. WITH READ ONLY asegura que ninguna operación DML pueda realizarse sobre esta vista.

103 Creación de una Vista Cree una vista, EMPVU10, que contenga detalles de los empleados del dpto. 10 SQL> CREATE VIEW empvu10 2 AS SELECT empno, ename, job 4 FROM emp 5 WHERE deptno = 10; View created. Describa la estructura de la vista, usando el comando DESCRIBE de SQL*Plus. Creación de una Vista El ejemplo de la parte superior, crea una vista que contiene el número de empleado, nombre y oficio de todos los empleados del departamento 10. Podemos visualizar la estructura de la vista utilizando el comando SQL*Plus, DESCRIBE. Name Null? Type EMPNO NOT NULL NUMBER(4) ENAME VARCHAR2(10) JOB VARCHAR2(9) Guía de Escritura La consulta que define a una vista puede contener una sintaxis SELECT compleja, incluyendo uniones, grupos y subconsultas. La consulta que define la vista no puede contener la cláusula ORDER BY. Si no se especifica un nombre para la restricción, el sistema le asignará un nombre por defecto en el formato SYS_Cn. Se puede usar la opción OR REPLACE para cambiar la definición de la vista sin eliminarla y recrearla o reasignar los permisos que sobre ellas se habían otorgado previamente. SQL> DESCRIBE empvu10

104 Creación de una Vista Cree una vista usando alias de columna en la subconsulta. Seleccione las columnas de esta vista, haciendo uso del nombre del alias. SQL> CREATE VIEW salvu30 2 AS SELECT empno EMPLOYEE_NUMBER, ename NAME, 3 sal SALARY 4 FROM emp 5 WHERE deptno = 30; View created. Creación de una Vista Podemos controlar los nombres de columna incluyendo alias de columna dentro de la subconsulta. El ejemplo de la parte superior, crea una vista que contiene el número de empleado con el alias EMPLOYEE_NUMBER, el apellido con el alias NAME y el salario con el alias SALARY, para el departamento 30. Como alternativa, podemos controlar los nombres de columnas incluyendo alias de columna en la cláusula CREATE VIEW.

105 Recuperando Datos de una Vista
SQL> SELECT * 2 FROM salvu30; EMPLOYEE_NUMBER NAME SALARY 7698 BLAKE 7654 MARTIN 7499 ALLEN 7844 TURNER 7900 JAMES 7521 WARD 6 rows selected. Recuperación de Datos desde una Vista Podemos recuperar datos desde una vista al igual que lo hacemos desde una tabla. Podemos visualizar el contenido de la vista al completo o solo ver columnas y filas especificas.

106 Consulta a la Tabla del Diccionario de Datos, USER_VIEWS
EMPVU10 SELECT empno, ename, job FROM emp WHERE deptno = 10; SQL*Plus SELECT * FROM empvu10; EMP 7839 KING PRESIDENT 7782 CLARK MANAGER 7934 MILLER CLERK Las Vistas del Diccionario de Datos Una vez que se ha creado la vista, podemos consultar la tabla del diccionario de datos llamada USER_VIEWS para ver el nombre de la vista y la nueva definición. El texto de la sentencia SELECT que constituye la vista, se almacena en una columna de tipo LONG. Acceso a los Datos de las Vistas Cuando accedemos a los datos, utilizando una vista, el Servidor Oracle8 realiza las siguientes operaciones: 1. Recupera la definición de la vista de la tabla USER_VIEWS del diccionario de datos. 2. Comprueba los privilegios de acceso para la tabla base de la vista. 3. Convierte la consulta de la vista en una operación equivalente en la tabla o tablas base subyacentes. En otras palabras, los datos se recuperan desde, o una acualización se hace a, la(s) tabla(s) base.

107 Modificación de una Vista
Modificar la vista EMPVU10 por medio de la claúsula CREATE OR REPLACE VIEW. Añada un alias para cada columna. Los alias de columna en la claúsula CREATE VIEW, deberán de aparecer en el mismo orden que las columnas en la subconsulta. SQL> CREATE OR REPLACE VIEW empvu10 2 (employee_number, employee_name, job_title) 3 AS SELECT empno, ename, job 4 FROM emp 5 WHERE deptno = 10; View created. Modificar una Vista La opción OR REPLACE permite que se cree una vista incluso si ya existe una con ese nombre, reemplazando de esta forma la antigua versión de la vista. Esto significa que la vista puede alterarse sin hacer drop, volver a crear ni volver a conceder privilegios del objeto. Nota: Cuando se asignan alias de columna en la cláusula CREATE VIEW, debemos recordar que los alias se listan en el mismo orden en que aparecen las columnas en la subconsultas.

108 Creación de una Vista Compleja
Cree una vista compleja que contenga funciones de grupo, para ver valores de dos tablas. SQL> CREATE VIEW dept_sum_vu (name, minsal, maxsal, avgsal) 3 AS SELECT d.dname, MIN(e.sal), MAX(e.sal), 4 AVG(e.sal) 5 FROM emp e, dept d 6 WHERE e.deptno = d.deptno 7 GROUP BY d.dname; View created. Creación de una Vista Compleja El ejemplo de la parte superior, crea una vista compleja de los nombres de departamentos, salario mínimo, salario máximo y salario medio por departamento. Observamos que los nombres alternativos se han especificado para la vista. Este es necesario si cualquier columna de la vista se deriva desde una función o una expresión. Podemos ver la estructura de la vista utilizando el comando SQL*Plus DESCRIBE. Visualizar los contenidos de la vista utilizando la sentencia SELECT. SQL> SELECT * 2 FROM dept_sum_vu; NAME MINSAL MAXSAL AVGSAL ACCOUNTING RESEARCH SALES

109 Reglas para Realizar Operaciones DML sobre Vistas
Se pueden realizar operaciones DML sobre vistas simples. No se puede eliminar una fila si la vista contiene: Funciones de grupo. Una cláusula GROUP BY. El comando DISTINCT. Realizar Operaciones DML sobre una Vista Podemos realizar operaciones DML sobre los datos a través de una vista siempre que esas operaciones sigan ciertas reglas. Se puede eliminar una fila de una vista salvo que la misma contenga una de las siguientes cosas: Funciones de grupo Una cláusula GROUP BY El comando DISTINCT

110 Reglas para Realizar Operaciones DML sobre Vistas
No es posible modificar datos en la vista si la misma contiene: Cualquiera de las condiciones anteriores. Columnas definidas por expresiones. La pseudocolumna ROWNUM. No se puede agregar datos si la vista contiene: Cualquier columna NOT NULL no incluída por la vista. Realizar Operaciones DML sobre una Vista Podemos modificar los datos de una vista salvo que contenga cualquiera de las condiciones mencionadas en la diapositiva previa y cualquiera de las siguientes: Columnas definidas por expresiones, por ejemplo SALARY*12. La pseudocolumna ROWRUN. Podemos agregar datos a través de una vista a menos que la misma contenga cualquiera de lo anteriormente citado y que además no existan columnas NOT NULL en la tabla base no seleccionada por la vista. Todos los valores requeridos deben estar presentes en la vista. Recordar que se están agregando valores directamente en la tabla subyacente a través de la vista. Para más información, ver: 0racle8 Server SQL Reference, Versión 8.0, “CREATE VIEW.” Nota: Oracle7.3 y Oracle8 nos permiten, con algunas restricciones, modifcar vistas que involucran uniones o joins. Las restricciones para las operaciones DML descritas anteriormente también se aplican a las vistas de unión. Cuaquier sentencia UPDATE, INSERT o DELETE sobre una vista unión puede modificar solamente una tabla subyacente. Si al menos una columna en la subconsulta de unión tiene un índice único, entonces puede ser posible modificar una tabla base en la vista de unión. Se puede consultar USER_UPDATABLE_COLUMNS para ver si las columnas en una vista unión son modificables.

111 La Claúsula WITH CHECK OPTION
Asegura que un comando DML sobre la vista mantiene el dominio de la misma. Si se intenta cambiar el número de departamento para cualquier fila, la sentencia fallará porque viola la restricción de CHECK OPTION. SQL> CREATE OR REPLACE VIEW empvu20 2 AS SELECT * 3 FROM emp 4 WHERE deptno = 20 5 WITH CHECK OPTION CONSTRAINT empvu20_ck; View created. Uso de la Cláusula WITH CHECK OPTION Es posible realizar chequeos de integridad referencial a través de las vistas. Podemos reforzar las restricciones al nivel de la base de datos. La vista puede utilizarse para proteger la integridad de los datos, pero el uso es muy limitado. La cláusula WITH CHECK OPTION especifica que los INSERTS y UPDATES realizados a través de la vistas no pueden crear filas que la vista no pueda seleccionar, y por lo tanto ésto permite las restricciones de integridad y chequeos en la validación de los datos para imponerse sobre los datos que se están insertando o acutalizando. Si hay un intento de realizar operaciones DML sobre las filas que la vista no ha seleccionado, se visualiza un error, con el nombre de la restricción si se ha especificado. SQL> UPDATE empvu20 2 SET deptno = 22 3 WHERE empno = 7788; UPDATE empvu20 * ERROR at line 1: ORA-02291: integrity constraint (USER.EMP_DEPTNO_FK) violated - parent key not found Nota: Ninguna fila se actualiza ya que si el número de departamento fuera cambiado a 22, la vista ya no estaría capacitada para ver ese empleado. Por tanto, con WITH CHECK OPTION, la vista sólo puede ver los empleados del depto. 20 y no permite cambiar a través de la vista el nº de depto. para aquellos empleados.

112 Denegar Operaciones DML
Agregando la opción WITH READ ONLY en la definición de la vista, se asegura que no ocurran operaciones DML. Si se intenta realizar una operación DML sobre cualquier fila en la vista, aparecerá el error ORA del Oracle8 Server. SQL> CREATE OR REPLACE VIEW empvu10 (employee_number, employee_name, job_title) 3 AS SELECT empno, ename, job 4 FROM emp 5 WHERE deptno = 10 6 WITH READ ONLY; View created. Denegar Operaciones DML Podemos asegurarnos de que no ocurre ninguna operación DML sobre determinada vista creándola con la opción WITH READ ONLY. El ejemplo de la parte superior, modifica la vista EMPVU10 para prevenir cualquier operación DML sobre la vista. Cualquier intento de quitar una fila de la vista, dará un error. SQL> DELETE FROM empvu10 2 WHERE employee_number = 7782; DELETE FROM empvu10 * ERROR at line 1: ORA-01752:Cannot delete from view without exactly one key-preserved table

113 Eliminación de una Vista
Al Borrar una vista no perderá los datos, porque la vista está basada en tablas subyacentes de la B.D. DROP VIEW view; SQL> DROP VIEW empvu10; View dropped. Eliminar una Vista Utilizamos el comando DROP VIEW para eliminar una vista. El comando elimina la definición de la vista de la base de datos. La eliminación de una vista no afecta a las tablas sobre las que se basa la vista. Las vistas o las aplicaciones basadas en la vista eliminada se convierten en inválidas. Unicamente el creador o un usuario con el privilegio DROP ANY VIEW puede eliminar una vista. En la sintaxis: vista es el nombre de la vista

114 Resumen Una vista se deriva de los datos de otras tablas u otras vistas. Una vista es como una ventana sobre los datos subyacentes. Una vista provee las siguientes ventajas: Restricción del acceso a los datos. Simplificación de las consultas. Independencia de los datos. Permite varias visiones de los mismos datos. Puede ser eliminada sin borrar los datos subyacentes. ¿Qué es una Vista? Una vista se basa en una tabla o en otra vista y actúa como una ventana a través de la cual se puede ver o modificar los datos de las tablas. Una vista no contiene datos. La definición de la vista se almacena en el diccionario de datos. La definición de la vista se puede ver en la tabla USER_VIEWS del diccionario de datos. Ventajas de las Vistas Restringen el acceso a la base de datos Simplifican las consultas Proveen independencia de los datos Permiten ver el mismo dato de varias maneras Eliminar las vistas sin afectar los datos subyacentes Opciones de las Vistas Puede ser una vista simple basada en una tabla Puede ser una vista compleja basada en más de una tabla o contener grupos o funciones Puede ser reemplazada si ya existe una con el mismo nombre Contienen una restricción de integridad Pueden ser de lectura solamente (read-only)

115 Otros Objetos de la Base de Datos

116 Objetivos Al completar esta lección, debería ser capaz de hacer lo siguiente: Describir otros objetos de la B.D. y sus posibilidades. Crear, mantener y usar secuencias Crear y mantener índices Crear sinónimos públicos y privados Objetivo En esta lección, aprenderemos cómo crear y mantener otros objetos de la base de datos que se utilizan normalmente. Estos objetos incluyen secuencias, índices y sinónimos.

117 Objetos de la Base de Datos
Objecto Descripción Tabla Unidad básica de almacenamiento; compuesta de registros y columnas. Vista Lógicamente representa un subconjunto de una o más tablas. Secuencia Genera valores para claves primarias. Indice Mejoran el rendimiento de algunas consultas Sinónimo Da nombres alternativos a los objetos. Objetos de la Base de Datos Muchas aplicaciones requieren el uso de números únicos como valores de clave primaria. Podemos construir el código dentro de la aplicación para gestionar este requerimiento o utilizar una secuencia para generar números únicos. Si queremos mejorar el rendimiento de algunas consultas, deberíamos considerar la creación de un índice. También podemos utilizar los índices para reforzar la unicidad sobre una columna o colección de columnas. Podemos proporcionar nombres alternativos para los objetos mediante el uso de sinónimos.

118 ¿Qué Es una Secuencia? Genera números únicos de forma automática.
Es un objeto que se puede compartir. Se usa típicamente para crear valores de una clave primaria. Sustituye código de aplicación. Mejora la eficiencia en cuanto a la rapidez de acceso cuando los valores están en el caché de memoria. ¿Qué es una Secuencia? Un generador de secuencias puede utilizarse para generar números de secuencia automáticos para las filas en las tablas. Una secuencia es un objeto de la base de datos creado por un usuario y que puede ser compartido por varios usuarios. Un uso común de las secuencias es para la creación de un valor de clave primaria, el cual debe ser único para cada fila. La secuencia se genera y se incrementa (o disminuye) mediante una rutina interna de Oracle8. Este tipo de objetos permite ahorras tiempo ya que reduce la candidad de código de la aplicación necesario para escribir un rutina de generación de secuencia. Los números de secuencia se almacenan y se generan independientemente de las tablas. Por lo tanto, la misma secuencia puede utilizarse para varias tablas.

119 La Sentencia CREATE SEQUENCE
Defina una secuencia para generar números secuenciales automáticamente. CREATE SEQUENCE sequence [INCREMENT BY n] [START WITH n] [{MAXVALUE n | NOMAXVALUE}] [{MINVALUE n | NOMINVALUE}] [{CYCLE | NOCYCLE}] [{CACHE n | NOCACHE}]; Creación de una Secuencia Generar automáticamente números secuenciales utilizando la sentencia CREATE SEQUENCE. En la sintaxis: sequence es el nombre del generador de secuencia. INCREMENT BY n especifica el intervalo entre los números de la secuencia donde n es un entero. Si la cláusula es omitida, la secuencia se incrementará en 1. START WITH n especifica el primer número que se genera para la secuencia. Si se omite esta cláusula, la secuencia comenzará por 1. MAXVALUE n especifica el valor máximo que la secuencia puede general. NOMAXVALUE especifica un valor máximo de 10^27 para una secuencia ascendente y para una secuencia descendente. Esta es la opción por defecto. MINVALUE n especifica el valor mínimo de la secuencia. NOMINVALUE especifica un valor mínimo de 1 para una secuencia ascendente y (10^26) para una secuencia descendente. Esta es la opción por defecto. CYCLE | NOCYCLE especifica que la secuencia continúa generando valores después de haber alcanzado su valor máximo o su valor mínimo, o bien no genera valores adicionales. La opción por defecto es NOCYCLE. CACHE n | NOCACHE especifica cuántos valores serán preasignados y mantenidos en la memoria del Servidor Oracle8. Por defecto, esta cantidad será igual a valores.

120 Creación de una Secuencia
Crear una secuencia DEPT_DEPTNO para ser utilizada por la PK de la tabla DEPT. No utilizar la opción CYCLE. SQL> CREATE SEQUENCE dept_deptno 2 INCREMENT BY 1 3 START WITH 91 4 MAXVALUE 100 5 NOCACHE 6 NOCYCLE; Sequence created. Creación de una Secuencia El ejemplo de la parte superior crea una secuencia llamada DEPT_DEPTNO con el fin de se utilizada para la columna DEPTNO de la tabla DEPT. La secuencia comienza por 91, no permite el “caching” y no permite que la secuencia cicle. No utilizar la opción CYCLE si la secuencia se usa para generar valores de clave primaria, a menos que tengamos un mecanismo fiable que elimine las filas antiguas más rápido que los ciclos de la secuencia. Para más información, ver: Oracle8 Server SQL Reference, Release 8.0, “CREATE SEQUENCE.”

121 Verificación de Secuencias
Verificar los valores de una secuencia en la tabla USER_SEQUENCES del diccionario de datos. La columna LAST_NUMBER muestra el próximo número disponible de la secuencia. SQL> SELECT sequence_name, min_value, max_value, 2 increment_by, last_number 3 FROM user_sequences; Confirmación de Secuencias Una vez que se ha creado la secuencia, ésta es documentada en el diccionario de datos. A partir que una secuencia es un objeto de la base de datos, puede ser identificada en la tabla USER_OBJECTS del diccionario de datos. Tambíen pueden confirmarse los parámetros de la secuencia, seleccionándolos de la tabla USER_SEQUENCES del diccionario de datos. SEQUENCE_NAME MIN_VALUE MAX_VALUE INCREMENT_BY LAST_NUMBER CUSTID E DEPT_DEPTNO ORDID E PRODID E

122 Las pseudocolumnas NEXTVAL y CURRVAL
NEXTVAL retorna el próximo valor disponible de la secuencia. Devuelve un valor único cada vez que es referenciada, aún por diferentes usuarios. CURRVAL obtiene el actual valor de la secuencia. NEXTVAL debe ser emitido para la secuencia, antes que CURRVAL pueda referenciarse. Seguir las reglas para su uso. Usando una Secuencia Una vez creada la secuencia, se la puede usar para generar números secuenciales que se utilizarán en las tablas. Hacer referencia a los valores de la secuencia usando las pseudocolumnas NEXTVAL y CURRVAL. Pseudocolumnas NEXTVAL y CURRVAL La pseudocolumna NEXTVAL se usa para obtener eficientemente el próximo número de una secuencia específica. Se debe calificar NEXTVAL con el nombre de la secuencia. Cuando se referencia a secuencia NEXTVAL, se genera un número nuevo de secuencia y el número actual se pone en CURRVAL. La pseudocolumna CURRVAL se usa para hacer referencia al número de secuencia generado recientemente. NEXTVAL debe usarse para generar un número de secuencia en la sesión actual del usuario antes de poder hacer referencia a CURRVAL. Se debe calificar al CURRVAL con el nombre de la secuencia. Cuando se referencia a secuencia CURRVAL, se obtiene el último valor devuelto al proceso del usuario.

123 Las pseudocolumnas NEXTVAL y CURRVAL
NEXTVAL retorna el próximo valor disponible de la secuencia. Devuelve un valor único cada vez que es referenciada, aún por diferentes usuarios. CURRVAL obtiene el actual valor de la secuencia. NEXTVAL debe ser emitido para la secuencia, antes que CURRVAL pueda referenciarse. Seguir las reglas para su uso. Reglas para el Uso de NEXTVAL y CURRVAL Podemos utilizar NEXTVAL y CURRVAL en: La lista SELECT de una sentencia SELECT que no es parte de una consulta. La lista SELECT de una subconsulta en una sentencia INSERT. La cláusula VALUES de una sentencia INSERT. La cláusula SET de una sentencia UPDATE. No se puede usar NEXTVAL y CURRVAL en: Una lista SELECT de una vista. Una sentencia SELECT con la palabra clave DISTINCT. Una sentencia SELECT con las cláusulas GROUP BY, HAVING o ORDER BY. Una subconsulta en una sentencia SELECT, DELETE o UPDATE. Una expresión DEFAULT en un comando CREATE TABLE o ALTER TABLE. Para más información, ver Oracle8 Server SQL Reference, Release 8.0, sección “Pseudocolumns” y “CREATE SEQUENCE.”

124 Uso de una Secuencia Insert a new department named “MARKETING” in San Diego. View the current value for the DEPT_DEPTNO sequence. SQL> INSERT INTO dept(deptno, dname, loc) 2 VALUES (dept_deptno.NEXTVAL, 'MARKETING', 'SAN DIEGO'); 1 row created. SQL> SELECT dept_deptno.CURRVAL 2 FROM SYS.dual; Usando una Secuencia El ejemplo de la diapositiva inserta un departamento nuevo en la tabla DEPT. Utiliza la secuencia DEPT_DEPTNO para generar un número nuevo de departamento. Podemos ver el valor actual de la secuencia: Ahora supongamos que queremos contratar empleados para el nuevo departamento. La sentencia INSERT, que puede ejecutarse repetidamente para todos los empleados nuevos, puede incluir el siguiente código: Nota: El ejemplo de la parte superior asume que ya ha sido creada una secuencia EMP_EMPNO para generar un número nuevo de empleado. SQL> SELECT dept_deptno.CURRVAL 2 FROM SYS.dual; CURRVAL 91 SQL> INSERT INTO emp … 2 VALUES (emp_empno.NEXTVAL, dept_deptno.CURRVAL, …

125 Uso de una Secuencia Mantener los valores de secuencia en memoria permite un acceso más rápido a los mismos. Se puede producir una brecha o gap en los valores de una secuencia cuando: Se produce un rollback. Se cae el sistema. Una secuencia es usada en otra tabla. Obtener el próximo número disponible en una secuencia, si fue creada con NOCACHE, consultando la tabla USER_SEQUENCES. Mantener Valores de Secuencia en Memoria Principal (Caché) Esto permite un acceso más rápido a esos valores. La caché es cargada en la primer referencia que se hace a la secuencia. Cada petición al siguiente valor de la secuencia, es recuperado de la secuencia en la caché. Después que el último valor de la secuencia es usado, el próximo requerimiento de valores de secuencia, coloca otras secuencias de valores en la memoria caché. Cuidarse de las “huecos” en las Secuencias Aunque un generador de secuencias emite números secuenciales sin huecos (o rangos que discontinúen esa secuencia), esta acción ocurre independientemente de un commit o rollback. Por lo tanto, si se hace un rollback sobre un comando que contiene una secuencia, el número se pierde. Otro evento que puede causar huecos en la secuencia es una caída del sistema. Si la secuencia mantiene los valores en memoria principal, entonces los números se pierden ante una caída del sistema. Como las secuencias no están directamente ligadas a las tablas, la misma secuencia puede usarse para muchas de ellas. Si esto ocurre, cada tabla puede contener un hueco en los números secuenciales. Ver el Próximo Valor Disponible de la Secuencia sin Incrementarlo Esto es posible, solamente si la secuencia fue creada con la opción NOCACHE; consulte la tabla USER_SEQUENCES.

126 Modificación de una Secuencia
Cambiar los valores de incremento, valor máximo, valor mínimo y las opciones de caché y ciclo. SQL> ALTER SEQUENCE dept_deptno 2 INCREMENT BY 1 3 MAXVALUE 4 NOCACHE 5 NOCYCLE; Sequence altered. Modificación de una Secuencia Si se alcanza el límite MAXVALUE para la secuencia, no se asignarán más valores para la misma y se recibirá un mensaje de error indicando que se ha excedido el valor de MAXVALUE. Para continuar usando la secuencia, se la puede modificar usando el comando ALTER SEQUENCE. Sintaxis ALTER SEQUENCE sequence [INCREMENT BY n] [{MAXVALUE n | NOMAXVALUE}] [{MINVALUE n | NOMINVALUE}] [{CYCLE | NOCYCLE}] [{CACHE n | NOCACHE}]; donde: sequence es el nombre del generador de secuencia. Para más información, ver. Oracle8 Server SQL Reference, Release 8.0, “ALTER SEQUENCE.”

127 Guía para Modificar una Secuencia
Se debe ser el propietario de la secuencia, o tener el privilegio ALTER para la misma. Son afectados solamente los valores futuros de la secuencia. Algunas validaciones son realizadas. Si se quiere recomenzar la secuencia con un número diferente, la misma debe ser eliminada y creada nuevamente. Guía de Escritura Para poder modificar la secuencia el usuario debe tener el privilegio ALTER. El comando ALTER SEQUENCEsolamente alterará los futuros números de la secuencia. Se realizan algunas validáciones. Por ejemplo, no se puede imponer un valor MAXVALUE menor que el valor actual de la secuencia. La opción START WITH no puede cambiar usando ALTER SEQUENCE. La secuencia debe ser eliminada y creada nuevamente a fin de comenzar la secuencia con un número diferente. SQL> ALTER SEQUENCE dept_deptno 2 INCREMENT BY 1 3 MAXVALUE 90 4 NOCACHE 5 NOCYCLE; ALTER SEQUENCE dept_deptno * ERROR at line 1: ORA-04009: MAXVALUE cannot be made to be less than the current value

128 Eliminación de una Secuencia
Eliminar una secuencia del diccionario de datos usando el comando DROP SEQUENCE. Una vez eliminada, la secuencia ya no puede ser referenciada. SQL> DROP SEQUENCE dept_deptno; Sequence dropped. Eliminar una Secuencia Para eliminar una secuencia de la base de datos, usar el comando DROP SEQUENCE. Debe ser el propietario de la secuencia o tener el privilegio DROP ANY SEQUENCE para eliminarla. Sintaxis DROP SEQUENCE sequence; sequence es el nombre de la secuencia. Para más información, ver: Oracle8 Server SQL Reference, Release 8, “DROP SEQUENCE.”

129 ¿Qué es un Indice? Un objeto de la base de datos.
Usado por el Servidor Oracle8 para acelerar la recuperación de filas mediante el uso de punteros. Reduce la E/S de disco usando un camino de acceso rápido como método para la ubicación de los datos. Independiente de la tabla que indexa. Son usados y mantenidos automáticamente por el Servidor Oracle8. ¿Qué es un Indice? Un índice en el Servidor Oracle8 es un objeto de la base de datos que permite acelerar la recuperación de filas usando una estructura de punteros. Los índices pueden ser creados explícitamente o automáticamente. Si no se tiene un índice sobre la columna, entonces se debe hacer un barrido total de la tabla para una búsqueda. Un índice ofrece acceso rápido y directo a los registros de una tabla. Su propósito es reducir la necesidad de I/O a disco. El índice es automáticamente usado y mantenido por el Servidor Oracle8. Una vez que un índice es creado, no se requiere actividad directa del usuario. Los índices son lógica y físicamente independientes de la tabla sobre la que se aplican. Esto significa que pueden ser creados o eliminados en cualquier momento y no tiene efectos sobre la tabla base u otros índices. Nota: Cuando elimina una tabla, también se eliminan los índices asociados. Para más información, ver: Oracle8 Server Concepts Manual, Release 8, “Schema Objects” section, “Indexes” topic.

130 ¿Cómo se Crean los Indices?
Automáticamente. Un índice único es creado automáticamente cuando se define una restricción PRIMARY KEY o UNIQUE en la definición de una tabla. Manualmente. Los usuarios pueden crear índices no únicos sobre columnas para acelerar el tiempo de acceso a las filas. ¿ Cómo son Creados los Indices ? Dos tipos de índices pueden ser creados. Un tipo es un índice único o unique. El Servidor Oracle8 crea automáticamente este tipo de índice cuando en una tabla se define una columna que tiene una restricción de PRIMARY KEY o UNIQUE. El índice toma el mismo nombre que la restricción. El otro tipo de índice que un usuario puede crear es un índice no único (non-unique). Por ejemplo, se puede crear un índice de columna FOREIGN KEY para una operación de unión en una consulta que acelere la respuesta.

131 Creación de un Indice Crear índices sobre una o más columnas
CREATE INDEX index ON table (column[, column]...); Mejoran la velocidad de acceso a una consulta; por ej. para la columna ENAME (apellido) de la tabla EMP SQL> CREATE INDEX emp_ename_idx 2 ON emp(ename); Index created. Creación de un Indice Por medio de la sentencia CREATE INDEX, puede crear índices sobre una o más columnas. Sintaxis: CREATE INDEX index ON table (column[, column]...); index es el nombre del índice table es el nombre de la tabla column es el nombre de la columna de la tabla, a indexar Para más información, ver: Oracle8 Server SQL Reference, Release 8, “CREATE INDEX.”

132 Guía para la Creación de un Indice
La columna es usada frecuentemente en una cláusula WHERE o en una condición de join. La columna tiene un rango muy amplio de valores. La columna contiene un gran número de valores nulos. Dos o más columnas son usadas juntas con frecuencia en una cláusula WHERE o en una condición de join. La tabla es grande y se espera que la mayoría de las consultas recuperen menos del 2 al 4 % de las filas. Definir más índices no siempre mejora la rapidez de las consultas. Más no Siempre es Mejor Más índices en una tabla no siempre significa que se acelerarán las consultas. Cada operación DML que es confirmada (vía commit) sobre una tabla con índices significa que los índices deben ser actualizados. Cuantos más índices se tengan asociados a una tabla, mayor será el esfuerzo que debe hacer el Servidor para actualizarlos después de una operación DML. Cuándo Crear un Indice La columna es frecuentemente usada en la cláusula WHERE o en condiciones de unión o join. La columna contiene un amplio rango de valores. La columna contiene una gran número de valores nulos. Dos o más columnas son usadas juntas con frecuencia en una cláusula WHERE o en condiciones de unión o join. Si la tabla es grande y se espera que la mayoría de las consultas recuperen menos del 2% al 4% de las filas Recordar que si se quiere garantizar unicidad, debe definirse una restricción de unicidad o unique en la definición de la tabla. Entonces, un índice único es automáticamente creado.

133 Guía para la Creación de un Indice
No crear un índice si: La tabla es pequeña. Las columnas no son usadas con frecuencia en condiciones de las consultas. Se espera que la mayoría de las consultas recuperen más que el 2 al 4% de las filas. La tabla es actualizada frecuentemente. Cuándo No Crear un Indice La tabla es pequeña. Las columnas no son frecuentemente usadas como una condición en las consultas. Se espera que la mayoría de las consultas recuperen más del 2% al 4% de las filas. La tabla se actualiza con frecuencia. Si tiene uno o más índices en una tabla, las sentencias DML que acceden a la tabla, toman relativamente más tiempo, debido al mantenimiento de los índices.

134 Verificación de Indices
La vista USER_INDEXES del diccionario de datos contiene el nombre de un índice y su condición de unicidad. La vista USER_IND_COLUMNS contiene el nombre del índice, nombre de la tabla, y nombre de la columna. SQL> SELECT ic.index_name, ic.column_name, 2 ic.column_position col_pos,ix.uniqueness 3 FROM user_indexes ix, user_ind_columns ic 4 WHERE ic.index_name = ix.index_name 5 AND ic.table_name = 'EMP'; Verificar los Indices Creados Confirmar la existencia de índices desde la vista USER_INDEXES del diccionario de datos. También se puede chequear las columnas involucradas en un índice consultando la vista USER_IND_COLUMNS. El ejemplo de la parte superior, visualiza todos los índices creados previamente, nombres de las columans afectadas y unicidad, sobre la tabla EMP. Nota: La salida ha sido formateada. INDEX_NAME COLUMN_NAME COL_POS UNIQUENES EMP_EMPNO_PK EMPNO UNIQUE EMP_ENAME_IDX ENAME NONUNIQUE

135 Eliminación de un Indice
Elimina un índice del diccionario de datos. Elimina el índice EMP_ENAME_IDX del diccionario de datos. Para borrar un índice, tiene que ser propietario del mismo o tener el privilegio DROP ANY INDEX. SQL> DROP INDEX index; SQL> DROP INDEX emp_ename_idx; Index dropped. Eliminar un Indice Los índices no se pueden modificar. Para cambiar un índice, primero se lo debe eliminar y luego crearlo nuevamente. Eliminar la definicion de un índice del diccionario de datos usando el comando DROP INDEX. Para poder eliminar un índice, el usuario debe ser el propietario del mismo o tener el privilegio DROP ANY INDEX. Sintaxis: DROP INDEX index; index es el nombre del índice

136 Sinónimos Simplificar el acceso a los objetos creando un sinónimo (otro nombre para un objeto). Hacer referencia a una tabla propia o de otro usuario. Permite acortar la longitud de los nombres de los objetos. CREATE [PUBLIC] SYNONYM synonym FOR object; Crear un Sinónimo para un Objeto Para referirse a una tabla propia de otro usuario, se necesita prefijar el nombre de la tabla con el nombre del usuario que lo creó seguido por un punto. Crear un sinónimo elimina la necesidad de cualificar el objeto nombrado con el esquema y provee un nombre alternativo para una tabla, vista, secuencia, procedimiento u otros objetos. Este método puede ser especialmente útil con objetos de nombres largos, tales como las vistas. Sintaxis: CREATE [PUBLIC] SYNONYM synonym FOR object; PUBLIC crea un sinónimo accesible a todos los usuarios. synonym es el nombre del sinónimo a ser creado. object identifica el objeto para el cual se crea el sinónimo. Guía de Escritura El objeto no puede estar contenido en un package. Un nombre de sinónimo privado debe ser distinto a todos los demás objetos propios del mismo usuario. Para más información, ver: Oracle8 Server SQL Reference, Release 8.0, “CREATE SYNONYM.”

137 Creación y Eliminación de Sinónimos
Crear un nombre más corto para la vista DEPT_SUM_VU SQL> CREATE SYNONYM d_sum 2 FOR dept_sum_vu; Synonym Created. Borrar un sinónimo SQL> DROP SYNONYM d_sum; Synonym dropped. Creación de un Sinónimo para un Objeto El ejemplo de la parte superior, crea un sinónimo para la vista DEPT_SUM_VU, para una referencia más rápida. El DBA puede crear un sinónimo público accesible a todos los usuarios. El siguiente ejemplo, crea un sinónimo público llamado DEPT para la tabla DEPT del usuario Alice: Eliminar un Sinónimo Para eliminar un sinónimo, utilice la sentencia DROP SYNONYM. Sólo el DBA puede eliminar un sinónimo público. Para más información, ver: Oracle8 Server SQL Reference, Release 8, “DROP SYNONYM.” SQL> CREATE PUBLIC SYNONYM dept 2 FOR alice.dept; Synonym created. SQL> DROP SYNONYM dept; Synonym dropped.

138 Resumen Use secuencias para generar números secuenciales de forma automática. La información sobre secuencias se almacena en la tabla USER_SEQUENCES. Cree índices para mejorar la velocidad en la recuperación de datos, en consultas. La información sobre índices se almacena en la tabla USER_INDEXES. Use sinónimos para ofrecer nombres alternativos para objetos. Secuencias El generador de secuencias, puede utilizarse para generar números secuenciales automáticamente, para los registros de una o más tablas. Esto puede ahorrar tiempo y reducir la cantidad de código necesitada en la aplicación. Una secuencia es un objeto de la base de datos, que puede ser compartida por varios usuarios. Puede encontrar información acerca de las secuencias en la tabla USER_SEQUENCES del d.d. Para utilizar una secuencia, deberá hacer referencia a las pseudoculumnas NEXTVAL o CURRVAL: Recuperará el siguiente número en la secuencia, referenciando sequence.NEXTVAL. Recuperará elnúmero actual de la secuencia, referenciando sequence.CURRVAL. Indices Los índices se utilizan para mejorar la velocidad de acceso al realizar una consulta. Los usuarios pueden ver la definición de sus índices en la vista del d.d. USER_INDEXES. Un índice puede ser eliminado por su propietario, o por cualquier usuario que disponga del privilegio DROP ANY INDEX, por medio de la sentencia DROP INDEX. Sinónimos Los DBAs pueden crear sinónimos públicos, y los usuarios pueden crear sinónimos privados, por medio de la sentencia CREATE SYNONYM. Los sinónimos permiten nombres cortos o alternativos para objetos. Elimine la definición de un sinónimo por medio de la sentencia DROP SYNONYM.


Descargar ppt "Subconsultas Multi-Columna"

Presentaciones similares


Anuncios Google