NOTA: Fichero sin tildes Los 13 primeros no están resueltos, deberían poderse resolver sin necesidad de ver la solución. 01 Conectarse a SQL*Plus. 02 Cambio del propio password. 03 Salir y volver a conectarse. 04 Consultar la estructura de una tabla, por ejemplo emp. 05 Seleccionar los datos de la tabla emp. 06 Definir el fichero de configuracion. Repetir ahora el anterior. 07 Comandos de ediccion de SQL*Plus. Practique con cada uno de ellos. 08 Operador de concatenacion. Alias de columnas. Obtenga la salida siguiente: CODIGO Nombre y empleo ---------- -------------------------------- 7369 SMITH trabaja de CLERK 7499 ALLEN trabaja de SALESMAN ... 09 Recuerde la estructura de las tablas emp y dept, que se usaran en los ejercuicios siguientes. 10 Realice un producto cartesiano de las tablas. 11 Realice un equijoin de las tablas. 12 Idem, pero incluyendo una condicion sobre el nombre. 13 Obten informacion en la que se reflejen los nombres, empleos y salarios tanto de los que superan el salario de Allen como del propio Allen. 14 Obtener los grados de los salarios de cada empleado. Usar la tabla salgrade. SELECT ENAME, GRADE FROM EMP,SALGRADE WHERE (SAL>=LOSAL) AND (SAL<=HISAL); 15 Obtener las referencias de todos los empleados y de todos los departamentos. SELECT ENAME, e.DEPTNO FROM EMP e, DEPT d WHERE e.DEPTNO = d.DEPTNO; 16 Obten los empleados cuyo salario supera al de sus compañeros de departamento. SELECT ENAME FROM EMP a WHERE SAL >= (SELECT MAX(b.SAL) FROM EMP b WHERE (b.DEPTNO=a.DEPTNO)); 17 SQl*Loader Caso 1. Creamos una tabla cuya descripcion es: SQL> desc p1 Name Null? Type ------------------------------- -------- ---- CD CHAR(3) NME CHAR(10) SAL NUMBER(38) DIA DATE Los datos que queremos introducir estan en el fichero p1.dat que tiene solo las cuatro filas que aparecen bajo los guiones: 123456789012345678901234 ------------------------ 101 fila 1 50 980423 102 fila 2 51 980424 103 52 980425 104 fila 4 980426 18 SQl*Loader Caso 2. (La solucion a este y al anterior en el mismo fichero). Suponemos que la tabla inicialmente esta vacia. Los datos que deseamos introducir estan delimitados con comas. Sobre ese fichero incluimos los comandos del SQL*Loader y tenemos un fichero de control que contiene los datos. load data infile * into table p1 fields terminated by ',' optionally enclosed by '"' (cd, nme, sal, dia date 'YYMMDD') begindata 200, filauno, 3,980427 201,"fila's", 4,980428 19 Selecciona las tablas propias. SELECT * FROM USER_TABLES; 20 Idem pero usando una vista de la propia USER_TABLES. SELECT * FROM TABS; 21 Consulta la vista USER_CATALOG. SELECT * FROM USER_CATALOG; 22 Y lo mismo pero de una forma mas legible. SELECT * FROM TAB; 23 Consulta los indices del usuario. SELECT * FROM USER_INDEXES; 24 Busca la descripcion de las vistas: ALL_OBJECTS, ALL_USERS, ALL_TABLES Realiza alguna busqueda con ellas. desc ALL_OBJECTS desc ALL_USERS desc ALL_TABLES 25 Busca la descripcion de las vistas: dba_catalog, dba_constraints, dba_indexes, ... Realiza alguna busqueda con ellas. desc DBA_CATALOG desc DBA_CONSTRAINTS desc DBA_INDEXES 26 Realiza una consulta del propio catalogo. SELECT * FROM USER_CATALOG; 27 Cree una tabla de empleados (emp1) con las columnas: empno NUMBER(4) ename CHAR(10) NOT NULL mgr NUMBER(4) comm NUMBER(7,2) deptno NUMBER(5) NOT NULL CREATE TABLE emp1 ( empno NUMBER(4), ename CHAR(10) NOT NULL, mgr NUMBER(4), comm NUMBER(7,2), deptno NUMBER(5) NOT NULL ); 28 Cree una tabla de departamentos (dept1) con las columnas. deptno NUMBER(5) dname VARCHAR2(15) loc VARCHAR2(15) siendo: - deptno la clave primaria - dname de valor único CREATE TABLE dept1 ( deptno NUMBER(5) PRIMARY KEY, dname VARCHAR2(15) UNIQUE, loc VARCHAR2(15) ); 29 Cargue los datos de la tabla dept en la tabla dept1 y compruebe los resultados. INSERT INTO dept1 SELECT * FROM DEPT; 30 Sustituya los nombres de los departamentos de dept1 por sus valores en castellano usando las letras mayusculas. UPDATE dept1 SET DNAME='CONTABILIDAD' WHERE DNAME='ACCOUNTING'; UPDATE dept1 SET DNAME='INVESTIGACION' WHERE DNAME='RESEARCH'; UPDATE dept1 SET DNAME='VENTAS' WHERE DNAME='SALES'; UPDATE dept1 SET DNAME='OPERACIONES' WHERE DNAME='OPERATIONS'; 31 Intente introducir en la tabla dept1, una a una, las filas con los datos siguientes. Compruebe el efecto de cada inserción. 50,VENTAS,BOSTON 50,DISTRIBUCION,BOSTON 60,NULL,SAN DIEGO NULL,ADMINISTRACION,LOS ANGELES 70,ADMINISTRACION,LOS ANGELES INSERT INTO dept1 VALUES ( 50,'VENTAS','BOSTON' ); INSERT INTO dept1 VALUES ( 50,'DISTRIBUCION','BOSTON' ); INSERT INTO dept1 VALUES ( 60,NULL,'SAN DIEGO' ); INSERT INTO dept1 VALUES ( NULL,'ADMINISTRACION','LOS ANGELES' ); INSERT INTO dept1 VALUES ( 70,'ADMINISTRACION','LOS ANGELES' ); 32 Añada una condicion de clave primaria al atributo empno de la tabla emp1. ALTER TABLE emp1 ADD CONSTRAINT mi_restriccion PRIMARY KEY (empno); 33 Compruebe que las restricciones anteriores se han incorporado a la BD. Suponiendo que es posible que use con frecuencia la consulta, haga lo que crea conveniente para ejecutarla mas adelante. SELECT TABLE_NAME, SEARCH_CONDITION FROM USER_CONSTRAINTS WHERE TABLE_NAME IN ('EMP1', 'DEPT1'); SAVE restricciones; 34 Compruebe los nombres y tipos de objetos de usuario (USER_OBJECTS) referentes a los objectos emp1 y dept1. SELECT OBJECT_NAME, OBJECT_TYPE FROM USER_OBJECTS WHERE OBJECT_NAME IN ('EMP1', 'DEPT1'); 35 Añada una nueva columna llamada sal a la tabla emp1, que sea NUMBER(7) y con la condicion de tomar valores no nulos. No nombre la restriccion. ALTER TABLE emp1 ADD sal NUMBER(7) NOT NULL; 36 Compruebe si Oracle ha nombrado la restriccion anterior. SELECT CONSTRAINT_NAME, TABLE_NAME, SEARCH_CONDITION FROM USER_CONSTRAINTS WHERE TABLE_NAME= 'EMP1'; -> SYS_C0023426 EMP1 37 Añada la condicion de que la columna sal sea mayor que 0. ALTER TABLE emp1 ADD CONSTRAINT algo_de_pelas CHECK (SAL>0); 38 Compruebe el estado de la restriccion anterior. SELECT CONSTRAINT_NAME, TABLE_NAME, SEARCH_CONDITION FROM USER_CONSTRAINTS WHERE TABLE_NAME= 'EMP1'; 39 Añada una columna ctd a la tabla dept1, NUMBER(7) con la condicion de sus valores sean no nulos. ALTER TABLE dept1 ADD (ctd NUMBER(7) CONSTRAINT ctdnonulo NOT NULL INITIALLY DEFERRED DEFERRABLE); 40 Añada datos a la columna ctd de la tabla dept1. Supongamos que todas las filas pasaran a tener el valor 5000 en esa columna. UPDATE dept1 SET CTD=5000; 41 Active la restriccion de valores no nulos de la columna ctd en la tabla dept1. SET CONSTRAINT ctdnonulo IMMEDIATE; 42 Incorpore la condicion de que la columna deptno de la tabla emp1 es clave foranea de la tabla dept1. Indique la accion referencial de borrado ante el borrado de la clave primaria. ALTER TABLE emp1 ADD CONSTRAINT claveforanea FOREIGN KEY (deptno) REFERENCES dept1 (deptno) ON DELETE CASCADE; 43 Incorpore la condicion de que la columna mgr es clave foranea y referencia a su propia tabla. ALTER TABLE emp1 ADD CONSTRAINT claveforaneados FOREIGN KEY (mgr) REFERENCES emp1 (empno); 44 Intente eliminar la columna mgr de la tabla emp1. Hagalo de nuevo, pero eliminando al mismo tiempo las restricciones definidas sobre ella. ALTER TABLE emp1 DROP mgr; ALTER TABLE emp1 DROP mgr CASCADE; Oracle no deja borrar columnas. 45 Cargue datos en la tabla emp1 con los de la tabla emp. INSERT INTO emp1 SELECT EMPNO, ENAME, MGR, COMM, DEPTNO, SAL FROM emp; 46 Elimine la condicion de que la columna deptno de dept1 es clave primaria, de forma que se eliminen las restricciones dependientes de dicha columna. ALTER TABLE dept1 DROP CONSTRAINT SYS_C0023083 CASCADE; NOTA::: Hay que nombrar SIEMPRE las restricciones, para que no pasen cosas como esta. De todos modos, se ve una "P", que indica que es la restriccion de clave primaria. 47 Cree la vista emp2 a partir de la tabla emp, conteniendo: empno, ename, sal, comm, deptno. Haga que las columnas de la vista tengan sus nombres en gallego (Codigo, Nome, ...). CREATE VIEW emp2 AS SELECT empno Codigo, ename Nome, sal Salario, comm Comision, deptno Departamento FROM emp; 48 Cree la tabla dept2 identida a la dept. Añadir varias filas mas a dept2, de forma que algunas localidades comiencen por 'D'. Sobre dept2 crear la vista dept3, con las mismas columnas, pero solo para los departamentos cuya localidad comience por 'D'. CREATE TABLE dept2 AS SELECT * FROM dept; INSERT INTO dept2 VALUES (50,'PARISETE','DAPE'); INSERT INTO dept2 VALUES (60,'RAFAPUNTOPAS','DONOSTIA'); INSERT INTO dept2 VALUES (70,'CHUGAR','DENVER'); CREATE VIEW dept3 AS SELECT * FROM dept2 WHERE loc LIKE 'D%'; 49 Compruebe la descripcion de la vista dept3. Compruebe que esta almacenada en el "Diccionario de datos de Oracle" o "catalogo". DESCRIBE dept3; SELECT view_name FROM user_views; 50 Actualice la vista dept3 modificando el nombre de la localidad del departamento 40 por DETROIT. Compruebe los datos de la tabla dept2. UPDATE dept3 SET LOC='DETROIT' WHERE DEPTNO='40'; (No esta el departamento en la vista, y claro, no se cambia) 51 Añada a dept3 una fila en la que la localidad sea 'DENVER'. Compruebe los datos de la tabla dept2. INSERT INTO dept3 VALUES ('40','MATEMATICAS','DENVER'); SELECT * FROM dept2; 52 Borre la fila recien añadida. Compruebe los datos de la tabla dept2. DELETE FROM dept3 WHERE DNAME='MATEMATICAS'; 53 Añada a dept3 una fila en la que la localidad sea 'PORTLAND'. Compruebe los datos de la vista dept3 y de la tabla dept2. INSERT INTO dept3 VALUES ('90','FISICA','PORTLAND'); 54 Intente repitir ahora el anterior, pero sobre una vista dept4, identica a dept 3 excepto en que no permita añadir filas que no cumplen la condicion de la vista. CREATE VIEW dept4 AS (SELECT * FROM dept2 WHERE LOC LIKE 'D%'); ALTER VIEW dept4 CONSTRAINT no_condicion CHECK (LOC LIKE 'D%');