4. DDL (Data Definition Language)
Introducción al DDL
Section titled “Introducción al DDL”El Lenguaje de Definición de Datos (Data Definition Language o DDL) es un subconjunto de SQL utilizado para definir y gestionar las estructuras de la base de datos Oracle. Los comandos DDL permiten crear, modificar y eliminar objetos como tablas, vistas, índices, secuencias y otros elementos estructurales de la base de datos.
Características principales del DDL
Section titled “Características principales del DDL”- Automático commit: Los comandos DDL realizan un commit automático antes y después de su ejecución
- No se pueden revertir: Al ejecutar un commit automático, no se pueden deshacer con ROLLBACK
- Afectan al diccionario de datos: Modifican las tablas del sistema que almacenan metadatos
- Pueden generar bloqueos: Durante su ejecución, pueden bloquear objetos relacionados
CREATE - Creación de objetos
Section titled “CREATE - Creación de objetos”El comando CREATE se utiliza para crear nuevos objetos en la base de datos Oracle.
CREATE TABLE - Creación de tablas
Section titled “CREATE TABLE - Creación de tablas”Las tablas son los objetos fundamentales para almacenar datos en Oracle.
-- Sintaxis básicaCREATE TABLE [schema.]nombre_tabla ( columna1 tipo_dato [restricciones], columna2 tipo_dato [restricciones], ... [restricciones_tabla]) [opciones_tabla];
-- Ejemplo prácticoCREATE TABLE empleados ( empleado_id NUMBER(6) PRIMARY KEY, nombre VARCHAR2(50) NOT NULL, apellido VARCHAR2(50) NOT NULL, email VARCHAR2(100) UNIQUE, fecha_contratacion DATE DEFAULT SYSDATE, salario NUMBER(8,2) CHECK (salario > 0), departamento_id NUMBER(4), CONSTRAINT fk_departamento FOREIGN KEY (departamento_id) REFERENCES departamentos(departamento_id));Opciones avanzadas para CREATE TABLE
Section titled “Opciones avanzadas para CREATE TABLE”CREATE TABLE ventas ( venta_id NUMBER PRIMARY KEY, fecha DATE, cliente_id NUMBER, total NUMBER(10,2))ORGANIZATION INDEX -- Tabla organizada por índiceTABLESPACE ventas_tsSTORAGE ( INITIAL 1M NEXT 1M MAXEXTENTS UNLIMITED);CREATE TABLE historial_ventas ( venta_id NUMBER, fecha DATE, producto_id NUMBER, cantidad NUMBER, precio NUMBER(10,2))PARTITION BY RANGE (fecha) ( PARTITION ventas_2023 VALUES LESS THAN (TO_DATE('01-01-2024', 'DD-MM-YYYY')), PARTITION ventas_2024 VALUES LESS THAN (TO_DATE('01-01-2025', 'DD-MM-YYYY')), PARTITION ventas_futuras VALUES LESS THAN (MAXVALUE));CREATE GLOBAL TEMPORARY TABLE temp_resultados ( id NUMBER, resultado VARCHAR2(100))ON COMMIT DELETE ROWS; -- Los datos se eliminan al hacer commitCREATE TABLE AS - Creación basada en consulta
Section titled “CREATE TABLE AS - Creación basada en consulta”Permite crear una nueva tabla basada en el resultado de una consulta SELECT.
-- Crear tabla a partir de una consultaCREATE TABLE empleados_marketingASSELECT empleado_id, nombre, apellido, email, telefonoFROM empleadosWHERE departamento_id = 20;
-- Crear tabla con estructura pero sin datosCREATE TABLE estructura_empleadosASSELECT * FROM empleadosWHERE 1=2; -- Condición falsa para no incluir datosCREATE VIEW - Creación de vistas
Section titled “CREATE VIEW - Creación de vistas”Las vistas son consultas almacenadas que se comportan como tablas virtuales.
-- Vista simpleCREATE VIEW v_empleados_departamento ASSELECT e.empleado_id, e.nombre, e.apellido, d.nombre AS departamentoFROM empleados eJOIN departamentos d ON e.departamento_id = d.departamento_id;
-- Vista con check optionCREATE VIEW v_empleados_marketing ASSELECT * FROM empleadosWHERE departamento_id = 20WITH CHECK OPTION; -- Garantiza que las filas insertadas/actualizadas cumplan la condición
-- Vista de solo lecturaCREATE VIEW v_resumen_ventas ASSELECT TO_CHAR(fecha_venta, 'YYYY-MM') AS mes, SUM(total) AS ventas_totales, COUNT(*) AS num_transaccionesFROM ventasGROUP BY TO_CHAR(fecha_venta, 'YYYY-MM')WITH READ ONLY; -- No permite modificaciones a través de la vistaCREATE INDEX - Creación de índices
Section titled “CREATE INDEX - Creación de índices”Los índices mejoran el rendimiento de las consultas al proporcionar rutas de acceso rápido a los datos.
-- Índice simpleCREATE INDEX idx_empleados_apellido ON empleados(apellido);
-- Índice compuestoCREATE INDEX idx_empleados_nombre_completo ON empleados(apellido, nombre);-- Garantiza valores únicosCREATE UNIQUE INDEX idx_empleados_email ON empleados(email);-- Índice para búsquedas case-insensitiveCREATE INDEX idx_empleados_apellido_upper ON empleados(UPPER(apellido));-- Para búsqueda de texto completoCREATE INDEX idx_productos_descripcion ON productos(descripcion)INDEXTYPE IS CTXSYS.CONTEXT;CREATE SEQUENCE - Creación de secuencias
Section titled “CREATE SEQUENCE - Creación de secuencias”Las secuencias generan valores numéricos únicos, comúnmente utilizados para claves primarias.
-- Secuencia básicaCREATE SEQUENCE seq_empleados START WITH 1 INCREMENT BY 1 NOCACHE NOCYCLE;
-- Secuencia con opciones avanzadasCREATE SEQUENCE seq_facturas START WITH 1000 INCREMENT BY 1 MINVALUE 1000 MAXVALUE 9999999 CACHE 20 CYCLE;
-- Uso de secuencia en INSERTINSERT INTO empleados (empleado_id, nombre, apellido)VALUES (seq_empleados.NEXTVAL, 'Juan', 'Pérez');
-- Obtener el valor actualSELECT seq_empleados.CURRVAL FROM dual;CREATE SYNONYM - Creación de sinónimos
Section titled “CREATE SYNONYM - Creación de sinónimos”Los sinónimos proporcionan nombres alternativos para objetos de la base de datos, facilitando el acceso y ocultando la ubicación real.
-- Sinónimo privado (solo visible para el usuario que lo crea)CREATE SYNONYM emp FOR empleados;
-- Sinónimo público (visible para todos los usuarios)CREATE PUBLIC SYNONYM productos FOR inventario.productos;
-- Sinónimo para objeto en otra base de datos (enlace de base de datos)CREATE SYNONYM clientes_externos FOR clientes@db_remota;ALTER - Modificación de objetos
Section titled “ALTER - Modificación de objetos”El comando ALTER permite modificar la estructura de objetos existentes en la base de datos.
ALTER TABLE - Modificación de tablas
Section titled “ALTER TABLE - Modificación de tablas”-- Agregar una columnaALTER TABLE empleados ADD (direccion VARCHAR2(200));
-- Agregar múltiples columnasALTER TABLE empleados ADD ( ciudad VARCHAR2(50), codigo_postal VARCHAR2(10), pais VARCHAR2(50) DEFAULT 'España');-- Cambiar tipo de dato o tamañoALTER TABLE empleados MODIFY (nombre VARCHAR2(100));
-- Cambiar múltiples columnasALTER TABLE empleados MODIFY ( salario NUMBER(10,2), email VARCHAR2(150) NOT NULL);-- Eliminar una columnaALTER TABLE empleados DROP COLUMN direccion;
-- Eliminar múltiples columnasALTER TABLE empleados DROP ( ciudad, codigo_postal, pais);-- Renombrar una columnaALTER TABLE empleados RENAME COLUMN telefono TO num_contacto;Gestión de restricciones con ALTER TABLE
Section titled “Gestión de restricciones con ALTER TABLE”-- Agregar una restricciónALTER TABLE empleados ADD CONSTRAINT pk_empleados PRIMARY KEY (empleado_id);
-- Agregar una clave foráneaALTER TABLE empleados ADD CONSTRAINT fk_departamento FOREIGN KEY (departamento_id) REFERENCES departamentos(departamento_id);
-- Eliminar una restricciónALTER TABLE empleados DROP CONSTRAINT fk_departamento;
-- Deshabilitar una restricciónALTER TABLE empleados DISABLE CONSTRAINT pk_empleados;
-- Habilitar una restricciónALTER TABLE empleados ENABLE CONSTRAINT pk_empleados;Otras operaciones con ALTER TABLE
Section titled “Otras operaciones con ALTER TABLE”-- Renombrar una tablaALTER TABLE empleados RENAME TO personal;
-- Cambiar el tablespace de una tablaALTER TABLE empleados MOVE TABLESPACE users;
-- Habilitar/deshabilitar todos los triggers de una tablaALTER TABLE empleados DISABLE ALL TRIGGERS;ALTER TABLE empleados ENABLE ALL TRIGGERS;
-- Modificar opciones de almacenamientoALTER TABLE empleados STORAGE ( NEXT 2M MAXEXTENTS UNLIMITED);ALTER INDEX - Modificación de índices
Section titled “ALTER INDEX - Modificación de índices”-- Reconstruir un índiceALTER INDEX idx_empleados_apellido REBUILD;
-- Hacer un índice invisible (el optimizador lo ignora)ALTER INDEX idx_empleados_apellido INVISIBLE;
-- Hacer un índice visibleALTER INDEX idx_empleados_apellido VISIBLE;
-- Mover un índice a otro tablespaceALTER INDEX idx_empleados_apellido REBUILD TABLESPACE indx;ALTER SEQUENCE - Modificación de secuencias
Section titled “ALTER SEQUENCE - Modificación de secuencias”-- Modificar el incrementoALTER SEQUENCE seq_empleados INCREMENT BY 10;
-- Modificar valores mínimo y máximoALTER SEQUENCE seq_empleados MAXVALUE 999999;
-- Cambiar la opción de cachéALTER SEQUENCE seq_empleados CACHE 50;
-- Reiniciar una secuencia-- Primero debemos obtener el valor actualSELECT seq_empleados.NEXTVAL FROM dual;-- Luego incrementamos con un valor negativo para "reiniciar"ALTER SEQUENCE seq_empleados INCREMENT BY -1000;SELECT seq_empleados.NEXTVAL FROM dual;-- Y finalmente restauramos el incremento normalALTER SEQUENCE seq_empleados INCREMENT BY 1;ALTER VIEW - Modificación de vistas
Section titled “ALTER VIEW - Modificación de vistas”-- Recompilar una vistaALTER VIEW v_empleados_departamento COMPILE;
-- Modificar una vistaCREATE OR REPLACE VIEW v_empleados_departamento ASSELECT e.empleado_id, e.nombre, e.apellido, d.nombre AS departamento, e.salarioFROM empleados eJOIN departamentos d ON e.departamento_id = d.departamento_id;DROP - Eliminación de objetos
Section titled “DROP - Eliminación de objetos”El comando DROP elimina objetos de la base de datos de forma permanente.
-- Eliminar una tablaDROP TABLE empleados [CASCADE CONSTRAINTS];
-- Eliminar una vistaDROP VIEW v_empleados_departamento;
-- Eliminar un índiceDROP INDEX idx_empleados_apellido;
-- Eliminar una secuenciaDROP SEQUENCE seq_empleados;
-- Eliminar un sinónimoDROP SYNONYM emp;DROP PUBLIC SYNONYM productos;
-- Eliminar restriccionesALTER TABLE empleados DROP CONSTRAINT pk_empleados;ALTER TABLE empleados DROP CONSTRAINT chk_salario_positivo;Opciones de DROP TABLE
Section titled “Opciones de DROP TABLE”DROP TABLE empleados;Elimina la tabla si no tiene dependencias. Si otras tablas tienen restricciones de clave foránea que hacen referencia a esta tabla, la operación fallará.
DROP TABLE empleados CASCADE CONSTRAINTS;Elimina la tabla y todas las restricciones que hacen referencia a ella desde otras tablas. Las tablas que hacían referencia a esta tabla permanecen, pero se eliminan sus restricciones de clave foránea.
DROP TABLE empleados PURGE;Elimina la tabla y la purga inmediatamente, evitando que se mueva a la papelera de reciclaje (disponible en Oracle 10g y posteriores).
TRUNCATE - Vaciado rápido de tablas
Section titled “TRUNCATE - Vaciado rápido de tablas”El comando TRUNCATE elimina rápidamente todos los registros de una tabla sin posibilidad de recuperación.
-- Sintaxis básicaTRUNCATE TABLE empleados;
-- Con opcionesTRUNCATE TABLE historial_ventas DROP STORAGE;
-- Truncar múltiples tablasTRUNCATE TABLE tabla1, tabla2, tabla3CASCADE;Diferencias entre TRUNCATE y DELETE
Section titled “Diferencias entre TRUNCATE y DELETE”| Característica | TRUNCATE | DELETE |
|---|---|---|
| Velocidad | Muy rápido | Más lento |
| Registros en log | Mínimo (solo la operación) | Cada fila eliminada |
| Rollback | No es posible | Posible antes del commit |
| Triggers | No se activan | Se activan |
| WHERE | No permite condiciones | Permite filtrar con WHERE |
| Espacio | Libera espacio de almacenamiento | No libera espacio automáticamente |
| Commit | Automático | Manual |
Consideraciones de seguridad para TRUNCATE
Section titled “Consideraciones de seguridad para TRUNCATE”- Requiere el privilegio DROP en la tabla o el privilegio TRUNCATE TABLE
- No se puede usar en tablas que participan en una relación de clave foránea (a menos que se use CASCADE)
- No se puede usar en tablas que son parte de una vista materializada
Mejores prácticas para DDL
Section titled “Mejores prácticas para DDL”-
Planificar cuidadosamente los cambios estructurales
- Documente los cambios antes de implementarlos
- Pruebe los cambios en un entorno de desarrollo antes de aplicarlos en producción
- Considere el impacto en el rendimiento y en las aplicaciones existentes
-
Gestionar las transacciones adecuadamente
- Recuerde que los comandos DDL realizan commits automáticos
- Complete o revierta todas las transacciones pendientes antes de ejecutar DDL
- Evite mezclar comandos DDL y DML en la misma transacción
-
Mantener la integridad referencial
- Defina las restricciones apropiadas al crear tablas
- Utilice CASCADE CONSTRAINTS con precaución
- Verifique las dependencias antes de eliminar objetos
-
Optimizar el rendimiento
- Cree índices adecuados para mejorar el rendimiento de las consultas
- Considere el uso de particiones para tablas grandes
- Utilice tablespaces apropiados según el tipo y uso de los datos
-
Implementar una estrategia de respaldo
- Realice copias de seguridad antes de ejecutar operaciones DDL importantes
- Documente los cambios realizados para facilitar la recuperación
- Considere el uso de Oracle Flashback para operaciones reversibles
Consulta del diccionario de datos
Section titled “Consulta del diccionario de datos”Oracle proporciona vistas del diccionario de datos que permiten consultar información sobre los objetos de la base de datos.
-- Listar todas las tablas del usuario actualSELECT table_name, tablespace_name, statusFROM user_tablesORDER BY table_name;
-- Listar todas las columnas de una tablaSELECT column_name, data_type, data_length, nullableFROM user_tab_columnsWHERE table_name = 'EMPLEADOS'ORDER BY column_id;
-- Listar todas las restricciones de una tablaSELECT constraint_name, constraint_type, statusFROM user_constraintsWHERE table_name = 'EMPLEADOS';
-- Listar todos los índices de una tablaSELECT index_name, index_type, uniqueness, statusFROM user_indexesWHERE table_name = 'EMPLEADOS';
-- Listar todas las vistas del usuarioSELECT view_name, textFROM user_views;
-- Listar todas las secuencias del usuarioSELECT sequence_name, min_value, max_value, increment_by, last_numberFROM user_sequences;