Skip to content

4. DDL (Data Definition Language)

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.

  • 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

El comando CREATE se utiliza para crear nuevos objetos en la base de datos Oracle.

Las tablas son los objetos fundamentales para almacenar datos en Oracle.

-- Sintaxis básica
CREATE TABLE [schema.]nombre_tabla (
columna1 tipo_dato [restricciones],
columna2 tipo_dato [restricciones],
...
[restricciones_tabla]
) [opciones_tabla];
-- Ejemplo práctico
CREATE 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)
);
CREATE TABLE ventas (
venta_id NUMBER PRIMARY KEY,
fecha DATE,
cliente_id NUMBER,
total NUMBER(10,2)
)
ORGANIZATION INDEX -- Tabla organizada por índice
TABLESPACE ventas_ts
STORAGE (
INITIAL 1M
NEXT 1M
MAXEXTENTS UNLIMITED
);

CREATE 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 consulta
CREATE TABLE empleados_marketing
AS
SELECT empleado_id, nombre, apellido, email, telefono
FROM empleados
WHERE departamento_id = 20;
-- Crear tabla con estructura pero sin datos
CREATE TABLE estructura_empleados
AS
SELECT * FROM empleados
WHERE 1=2; -- Condición falsa para no incluir datos

Las vistas son consultas almacenadas que se comportan como tablas virtuales.

-- Vista simple
CREATE VIEW v_empleados_departamento AS
SELECT e.empleado_id, e.nombre, e.apellido, d.nombre AS departamento
FROM empleados e
JOIN departamentos d ON e.departamento_id = d.departamento_id;
-- Vista con check option
CREATE VIEW v_empleados_marketing AS
SELECT * FROM empleados
WHERE departamento_id = 20
WITH CHECK OPTION; -- Garantiza que las filas insertadas/actualizadas cumplan la condición
-- Vista de solo lectura
CREATE VIEW v_resumen_ventas AS
SELECT
TO_CHAR(fecha_venta, 'YYYY-MM') AS mes,
SUM(total) AS ventas_totales,
COUNT(*) AS num_transacciones
FROM ventas
GROUP BY TO_CHAR(fecha_venta, 'YYYY-MM')
WITH READ ONLY; -- No permite modificaciones a través de la vista

Los índices mejoran el rendimiento de las consultas al proporcionar rutas de acceso rápido a los datos.

-- Índice simple
CREATE INDEX idx_empleados_apellido ON empleados(apellido);
-- Índice compuesto
CREATE INDEX idx_empleados_nombre_completo ON empleados(apellido, nombre);

Las secuencias generan valores numéricos únicos, comúnmente utilizados para claves primarias.

-- Secuencia básica
CREATE SEQUENCE seq_empleados
START WITH 1
INCREMENT BY 1
NOCACHE
NOCYCLE;
-- Secuencia con opciones avanzadas
CREATE SEQUENCE seq_facturas
START WITH 1000
INCREMENT BY 1
MINVALUE 1000
MAXVALUE 9999999
CACHE 20
CYCLE;
-- Uso de secuencia en INSERT
INSERT INTO empleados (empleado_id, nombre, apellido)
VALUES (seq_empleados.NEXTVAL, 'Juan', 'Pérez');
-- Obtener el valor actual
SELECT seq_empleados.CURRVAL FROM dual;

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;

El comando ALTER permite modificar la estructura de objetos existentes en la base de datos.

-- Agregar una columna
ALTER TABLE empleados ADD (direccion VARCHAR2(200));
-- Agregar múltiples columnas
ALTER TABLE empleados ADD (
ciudad VARCHAR2(50),
codigo_postal VARCHAR2(10),
pais VARCHAR2(50) DEFAULT 'España'
);
-- Agregar una restricción
ALTER TABLE empleados ADD CONSTRAINT pk_empleados
PRIMARY KEY (empleado_id);
-- Agregar una clave foránea
ALTER TABLE empleados ADD CONSTRAINT fk_departamento
FOREIGN KEY (departamento_id) REFERENCES departamentos(departamento_id);
-- Eliminar una restricción
ALTER TABLE empleados DROP CONSTRAINT fk_departamento;
-- Deshabilitar una restricción
ALTER TABLE empleados DISABLE CONSTRAINT pk_empleados;
-- Habilitar una restricción
ALTER TABLE empleados ENABLE CONSTRAINT pk_empleados;
-- Renombrar una tabla
ALTER TABLE empleados RENAME TO personal;
-- Cambiar el tablespace de una tabla
ALTER TABLE empleados MOVE TABLESPACE users;
-- Habilitar/deshabilitar todos los triggers de una tabla
ALTER TABLE empleados DISABLE ALL TRIGGERS;
ALTER TABLE empleados ENABLE ALL TRIGGERS;
-- Modificar opciones de almacenamiento
ALTER TABLE empleados STORAGE (
NEXT 2M
MAXEXTENTS UNLIMITED
);
-- Reconstruir un índice
ALTER INDEX idx_empleados_apellido REBUILD;
-- Hacer un índice invisible (el optimizador lo ignora)
ALTER INDEX idx_empleados_apellido INVISIBLE;
-- Hacer un índice visible
ALTER INDEX idx_empleados_apellido VISIBLE;
-- Mover un índice a otro tablespace
ALTER INDEX idx_empleados_apellido REBUILD TABLESPACE indx;

ALTER SEQUENCE - Modificación de secuencias

Section titled “ALTER SEQUENCE - Modificación de secuencias”
-- Modificar el incremento
ALTER SEQUENCE seq_empleados INCREMENT BY 10;
-- Modificar valores mínimo y máximo
ALTER 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 actual
SELECT 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 normal
ALTER SEQUENCE seq_empleados INCREMENT BY 1;
-- Recompilar una vista
ALTER VIEW v_empleados_departamento COMPILE;
-- Modificar una vista
CREATE OR REPLACE VIEW v_empleados_departamento AS
SELECT e.empleado_id, e.nombre, e.apellido, d.nombre AS departamento, e.salario
FROM empleados e
JOIN departamentos d ON e.departamento_id = d.departamento_id;

El comando DROP elimina objetos de la base de datos de forma permanente.

-- Eliminar una tabla
DROP TABLE empleados [CASCADE CONSTRAINTS];
-- Eliminar una vista
DROP VIEW v_empleados_departamento;
-- Eliminar un índice
DROP INDEX idx_empleados_apellido;
-- Eliminar una secuencia
DROP SEQUENCE seq_empleados;
-- Eliminar un sinónimo
DROP SYNONYM emp;
DROP PUBLIC SYNONYM productos;
-- Eliminar restricciones
ALTER TABLE empleados DROP CONSTRAINT pk_empleados;
ALTER TABLE empleados DROP CONSTRAINT chk_salario_positivo;
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á.

El comando TRUNCATE elimina rápidamente todos los registros de una tabla sin posibilidad de recuperación.

-- Sintaxis básica
TRUNCATE TABLE empleados;
-- Con opciones
TRUNCATE TABLE historial_ventas DROP STORAGE;
-- Truncar múltiples tablas
TRUNCATE TABLE
tabla1,
tabla2,
tabla3
CASCADE;
CaracterísticaTRUNCATEDELETE
VelocidadMuy rápidoMás lento
Registros en logMínimo (solo la operación)Cada fila eliminada
RollbackNo es posiblePosible antes del commit
TriggersNo se activanSe activan
WHERENo permite condicionesPermite filtrar con WHERE
EspacioLibera espacio de almacenamientoNo libera espacio automáticamente
CommitAutomáticoManual

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
  1. 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
  2. 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
  3. Mantener la integridad referencial

    • Defina las restricciones apropiadas al crear tablas
    • Utilice CASCADE CONSTRAINTS con precaución
    • Verifique las dependencias antes de eliminar objetos
  4. 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
  5. 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

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 actual
SELECT table_name, tablespace_name, status
FROM user_tables
ORDER BY table_name;
-- Listar todas las columnas de una tabla
SELECT column_name, data_type, data_length, nullable
FROM user_tab_columns
WHERE table_name = 'EMPLEADOS'
ORDER BY column_id;
-- Listar todas las restricciones de una tabla
SELECT constraint_name, constraint_type, status
FROM user_constraints
WHERE table_name = 'EMPLEADOS';
-- Listar todos los índices de una tabla
SELECT index_name, index_type, uniqueness, status
FROM user_indexes
WHERE table_name = 'EMPLEADOS';
-- Listar todas las vistas del usuario
SELECT view_name, text
FROM user_views;
-- Listar todas las secuencias del usuario
SELECT sequence_name, min_value, max_value, increment_by, last_number
FROM user_sequences;
🐝