Me he puesto en la tarea de explorar el mundo de Oracle con algo más de profundidad en el manejo del SQL procedimental o como es conocido PL/SQL. Para esto estoy trabajando con Firebird 2.1 y Oracle 11g Ex en un cara a cara de consultas sobre el diseño de base de datos que les enseñaré a continuación.
La idea es que teniendo bases en las consultas básicas y algunas otras más estructuradas en Firebird se puedan replantear para un entorno Oracle, así de esta manera espero sea más simple el cambio de manejo y costumbres a la hora de hacer consultas o procedimientos. Cualquiera puede participar y aportar "reglas de negocio" al ejercicio, que en un principio muy básico es una base de datos para un sistema call-center de soporte a usuarios. Se trata de que quienes conocen Oracle puedan orientarnos a la contraparte y así mismo conocer las cualidades de Firebird.
Entre más podamos plantear, más atractivo será el ejercicio, si bien pueden ser disparadores, consultas complejas, procedimientos, excepciones, etc.
La siguiente es la estructura de la base de datos:
/******************************************************************************/
/*** Tablas ***/
/******************************************************************************/
CREATE TABLE CALL_CENTERS (
ID_CALLCENTER INTEGER NOT NULL,
NOMBRE VARCHAR(50),
TELEFONO VARCHAR(20),
DIRECCION VARCHAR(50),
CIUDAD VARCHAR(50)
);
CREATE TABLE CLIENTE (
ID_CLIENTE INTEGER NOT NULL,
NOMBRES VARCHAR(50),
APELLIDOS VARCHAR(50),
TELEFONO VARCHAR(20),
DIRECCION VARCHAR(50),
CIUDAD VARCHAR(50)
);
CREATE TABLE LLAMADAS_CLIENTE (
ID_LLAMADAS INTEGER NOT NULL,
ID_CLIENTE INTEGER NOT NULL,
ID_CALLCENTER INTEGER NOT NULL,
ID_STAFF INTEGER NOT NULL,
ID_SOLUCION INTEGER NOT NULL,
FECHA DATE,
DESCRIPCION VARCHAR(500),
DETALLE_SOLUCION VARCHAR(500),
SOLUCIONADO INTEGER
);
CREATE TABLE PROBLEMAS (
ID_PROBLEMAS INTEGER NOT NULL,
DESCRIPCION VARCHAR(200),
DETALLES VARCHAR(500)
);
CREATE TABLE SOLUCIONES (
ID_SOLUCIONES INTEGER NOT NULL,
DESCRIPCION VARCHAR(200),
DETALLES VARCHAR(500)
);
CREATE TABLE SOLUCIONES_PROBLEMAS (
ID_SOLUCION INTEGER NOT NULL,
ID_PROBLEMA INTEGER NOT NULL
);
CREATE TABLE STAFF (
ID_STAFF INTEGER NOT NULL,
NOMBRES VARCHAR(50),
APELLIDOS VARCHAR(50),
TELEFONO VARCHAR(20),
DIRECCION VARCHAR(50),
CIUDAD VARCHAR(50)
);
/******************************************************************************/
/*** Primary Keys ***/
/******************************************************************************/
ALTER TABLE CALL_CENTERS ADD CONSTRAINT PK_CALLCENTER PRIMARY KEY (ID_CALLCENTER);
ALTER TABLE CLIENTE ADD CONSTRAINT PK_CLIENTE PRIMARY KEY (ID_CLIENTE);
ALTER TABLE LLAMADAS_CLIENTE ADD CONSTRAINT PK_LLAMADAS PRIMARY KEY (ID_LLAMADAS);
ALTER TABLE PROBLEMAS ADD CONSTRAINT PK_PROBLEMAS PRIMARY KEY (ID_PROBLEMAS);
ALTER TABLE SOLUCIONES ADD CONSTRAINT PK_SOLUCIONES PRIMARY KEY (ID_SOLUCIONES);
ALTER TABLE STAFF ADD CONSTRAINT PK_STAFF PRIMARY KEY (ID_STAFF);
/******************************************************************************/
/*** Foreign Keys ***/
/******************************************************************************/
ALTER TABLE LLAMADAS_CLIENTE ADD CONSTRAINT FK_CALL_CENTER FOREIGN KEY (ID_CALLCENTER) REFERENCES CALL_CENTERS (ID_CALLCENTER);
ALTER TABLE LLAMADAS_CLIENTE ADD CONSTRAINT FK_CLIENTE FOREIGN KEY (ID_CLIENTE) REFERENCES CLIENTE (ID_CLIENTE);
ALTER TABLE LLAMADAS_CLIENTE ADD CONSTRAINT FK_STAFF FOREIGN KEY (ID_STAFF) REFERENCES STAFF (ID_STAFF);
ALTER TABLE SOLUCIONES_PROBLEMAS ADD CONSTRAINT FK_PROB_SOL FOREIGN KEY (ID_PROBLEMA) REFERENCES PROBLEMAS (ID_PROBLEMAS);
ALTER TABLE SOLUCIONES_PROBLEMAS ADD CONSTRAINT FK_SOL_PROB FOREIGN KEY (ID_SOLUCION) REFERENCES SOLUCIONES (ID_SOLUCIONES);
Y una gráfica del modelo relacional: