SGBD ORACLE 10g XPRESS EDITION
Transcript of SGBD ORACLE 10g XPRESS EDITION
http://www.wix.com/oracle10gutn/bdd2 1
SGBD
ORACLE 10g
XPRESS EDITION
Instalación y Configuración de Oracle 10g R2 XE en Ubuntu
Inserción de Datos en la BDD ACADEMICO
Creación de Vistas Triggers y Procedimientos Almacenados PL
ARQUITECTURA DE BDD ORACLE, cambio tamaños de BLOQUE en el BUFFER,
TNNING.
Conexión Remota hacia SGBD Oracle 10g R2 XE
DICCIONARIO DE DATOS Y SISTEMAS RECUPERACIÓN
MANEJO DE TRANSACCIONES DESDE JAVA
TABLA DE BUSQUEDAS, ESDISTICAS Y TIEMPO DE RESPUESTA
http://www.wix.com/oracle10gutn/bdd2 2
Integrantes:
Pérez Diego
Cuasapas Gandhy
Ruales Daniel
UNIVERSIDAD TÉCNICA DEL NORTE Carrera de Ingeniería en Sistemas Computacionales
Tema:
Informe: Nro. 1
Instalación y Configuración de Oracle 10g R2 XE en Ubuntu
1. Requisitos para la instalación:
1.1 Requisitos de software para la instalación:
Las siguientes bibliotecas son realmente indispensables para el correcto funcionamiento de
ORACLE , la libreria libxext6 ya biene instala en versiones de ubuntu 10 o más y no son
necesarias instalarlas lo contrario sucede con la libreria ibstdc++5 que ya no biene instalada y
fue reeemplazada por ibstdc++6, necesariamente tendremos que instalar ibstdc++5.
libxext6 libxtst6 libaio1 libaio-dev libstdc++5
1.2 Requisitos de hardware para la instalación:
Principalmente en los requerimientos de hardware debemos tener en cuenta que las
versiones express de ORACLE solo trabajan con un procesador, entonces si tenemos por
ejemplo un procesador core i3 solamente trabajara con un núcleo con lo cual se notara el
aumento de tiempo de ejecución.
2Gb en el disco duro.
SWAP. Es el espacio de intercambio de archivos usado como algo similar a la memoria virtual
de Windows.
http://www.wix.com/oracle10gutn/bdd2 3
Necesitaremos aproximadamente 1Gb, el swap por defecto que viene asignado en una
instalación normal de Ubuntu es cerca de los 512 Mb y 1024 Mb Globalmente de donde se
distribuirá para diferentes tareas del sistema y aplicaciones reduciendo el tamaño de swap
libre, el aumento de swap se explicara en la instalación.
2. Instalación
NOTA: PARA UNA CORRECTA INSTALACION SE ACONSEJA MIRAR EL VIDEO DE
GUIA QUE SE ENCUENTRA EN
http://www.wix.com/oracle10gutn/bdd2#!material/vstc1=video
Continuaremos con la instalación de librerías:
Para eso usaremos una terminal y ejecutaremos los comandos descritos:
NOTA:
Al inicio de las líneas:
# --------significa que es un comando a ejecutar en la actualización de los ficheros abra que
copiar todo el contenido sin importar el # al inicio.
2.1 Instalación de Librerías necesarias:
apt-get install libaio1 libaio-dev apt-get install rpm apt-get install alien apt-get install libstdc++5 apt-get install lesstif2-dev apt-get install binutils
http://www.wix.com/oracle10gutn/bdd2 4
3. Usuarios
3.1 Creando el Oracle install y los Grupos
La creación de usuarios se realizara con la idea de distribuir nuestro usuario y de Oracle, pero
que nuestro usuario pueda tener acceso a los dominios de Oracle, en conclusión nuestro
usuario formara parte del grupo de Oracle.
addgroup --system oinstall addgroup dba
3.2 Creando el Usuario Oracle y Asignado en los grupos
useradd -g oinstall -G dba -d /home/oracle -s /bin/bash oracle passwd oracle mkdir /home/oracle chown -R oracle:dba /home/oracle
4. Creando Variables simbolicos
La variables simbólica se crear debido a que nuestro SO no es red hat y tenemos que simular
las rutas para el acceso a archivos.
Recuerden que las variables simbólicas apuntaran a archivos específicos de cualquier
directorio.
ln -s /usr/bin/awk /bin/awk ln -s /usr/bin/rpm /bin/rpm ln -s /usr/bin/basename /bin/basename mkdir /etc/rc.d for i in 0 1 2 3 4 5 6 S ; do ln -s /etc/rc$i.d /etc/rc.d/rc$i.d ; done mkdir -p /usr/lib/oracle/xe/app/oracle chown -R oracle:dba /usr/lib/oracle/xe
5. Actualización de parámetros en sysctl (Kernel) editando el archivo /etc/sysctl.conf agregar
estas líneas:
fs.file-max = 6815744 fs.aio-max-nr = 1048576 kernel.shmall = 2097152 kernel.shmmax = 2147483648 kernel.shmmni = 4096 kernel.sem = 250 32000 100 128
http://www.wix.com/oracle10gutn/bdd2 5
net.core.rmem_default = 4194304 net.core.rmem_max = 4194304 net.core.wmem_default = 1048576 net.core.wmem_max = 1048576 net.ipv4.ip_local_port_range = 9000 65535
------------------------------------------------------------------------------
El punto 5.1 sera estubieramos instalano 11g lo cual no lo estamos haciendo, es solo una
acotación. para no cometer errores
------------------------------------------------------------------------------
5.1 Parámetros para Oracle 11g
kernel.shmall = 2097152 kernel.shmmax = 2147483648 # Smallest of -> (Half the size of the physical memory) or (4GB - 1 byte) kernel.shmmni = 4096 # semaphores: semmsl, semmns, semopm, semmni kernel.sem = 250 32000 100 128 fs.file-max = 65536 # 512 * PROCESSES net.ipv4.ip_local_port_range = 1024 65000 net.core.rmem_default=4194304 net.core.rmem_max=4194304 net.core.wmem_default=262144 net.core.wmem_max=262144
6. Actualizar algunos límites para el propietario del software de Oracle, añadiendo estas líneas al
final de /etc/security/limits.conf:
oracle soft nproc 2047 oracle hard nproc 16383 oracle soft nofile 1023 oracle hard nofile 65535 6.1 Activamos las nuevas configuraciones: # sysctl -p
http://www.wix.com/oracle10gutn/bdd2 6
7. Extender la swap(memoria de intercambio de datos)
- Es un ejemplo de creación de swap de tamaño 512 Mb, esto sería suficiente si tuviéramos
mas de 700Mb de swap y no bastaría si tuviéramos 700< recuerde que ORACLE necesita 1
Gb, con lo que tendríamos que crear espacio swap dependido de la cantidad de swap que
tengamos en el sistema.
-Crearemos el archivo de swap /mnt/512Mb.swap con el comando
# sudo dd if=/dev/zero of=/mnt/512Mb.swap bs=1M count=1024 - Formatear ese archivo para crear el dispositivo de swap
# sudo mkswap /mnt/512Mb.swap - Agregar la swap al sistema en ejecución
# sudo swapon /mnt/512Mb.swap -Se puede usar cat /proc/meminfo para ver que la swap adicional esta ahora disponible
# cat /proc/meminfo - Para que se permanente hay que agregar esta linea al archivo /etc/fstab:
/mnt/512Mb.swap none swap sw 0 0
8. Asignar privilegios de Administrador a Oracle
Es necesario para realizar la instalación desde el Usuario Oracle.
9. Iniciar el paquete oracle-xe-universal_10.2.0.1-1.0_i386.deb continuando con la instalación. ¡Si ya estamos en el usuario Oracle!.
10. Configurar Oracle, ingresar en una terminal: Podemos solo dar enter así estamos aceptando las configuraciones por defecto.
Como:
-Puerto http:8080
-Puerto escucha:1521 -Configurar el password
-Entrar en http://127.0.0.1:8080/apex # sudo /etc/init.d/orcle-xe configure
http://www.wix.com/oracle10gutn/bdd2 7
11. Añadir al path.
Luego de hacer las configuraciones respectivas tendremos que añadir el siguiente código en el
path de inicio automático de Linux para poder utilizar el terminal y librerías sql*plus desde
una terminal, podemos añadir a este documento.
Recuerde:
Para todos los usuarios: (Se necesita permisos de root para editar/modificar estos archivos)
/etc/profile --> Se ejecuta cuando qualquier usuario inicia la sesión.
/etc/bashrc --> Se ejecuta cada vez que qualquier usuario ejecuta el programa bash
Para nuestro usuario:
~/.bash_profile --> Se ejecuta el .bash_profile de juanito cuando juanito inicia su sesión.
~/.bashrc --> Se ejecuta el .bashrc de juanito cuando juanito ejecuta el programa bash.
Líneas a agregar:
Inicio:
export ORACLE_BASE=/usr/lib/oracle/xe/app/oracle export ORACLE_HOME=$ORACLE_BASE/product/10.2.0/server export ORACLE_SID=XE export LD_LIBRARY_PATH=$ORACLE_HOME/lib export PATH=$ORACLE_HOME/bin:$PATH export EDITOR=/usr/bin/vi
fin
Listo!! Reinicia la máquina y prueba ejecutando sqlplus en una
terminal debería aparecer algo asi:
http://www.wix.com/oracle10gutn/bdd2 8
Tema:
Informe: Nro. 2
Inserción de Datos en la BDD ACADEMICO
La inserción de datos dependerá del tipo de dato, claves referenciales, claves únicas entre otras.
No podremos insertar datos en una tabla cuya referencia a otra tabla aun no tenga datos ejemplo:
No podremos ingresar datos en matricula si aún no hay estudiantes registrados.
Aquí está un ejemplo de inserción:
+++++++++++++ USUARIO ++++++++++++++++++++++++++++++
CREATE USER ACADEMICO IDENTIFIED BY d
DEFAULT TABLESPACE USERS
TEMPORARY TABLESPACE TEMP
QUOTA UNLIMITED ON USERS;
.............. ROL .............
CREATE ROLE ADMIN;
GRANT CREATE CLUSTER,CREATE DATABASE LINK,CREATE INDEXTYPE,CREATE
MATERIALIZED VIEW,CREATE OPERATOR,CREATE PROCEDURE,CREATE PUBLIC
SYNONYM,CREATE ROLE,CREATE SEQUENCE,CREATE SESSION,CREATE
SYNONYM,CREATE TABLE,CREATE TRIGGER,CREATE TYPE,CREATE VIEW TO
ADMIN;
............... SCRIPT
................................
http://www.wix.com/oracle10gutn/bdd2 9
.............. TABLAS ...................
ESTUDIANTE.............
INSERT INTO "ESTUDIANTES" VALUES(1,'Oscar Daniel', 'Garcia', 'Los
Ceibos', '1005673896');
INSERT INTO "ESTUDIANTES" VALUES(2,'Cristina','Arteaga','El
Olivo','1005367865');
INSERT INTO "ESTUDIANTES" VALUES(3,'Juan','López','Av. Teodoro
Gomez de la Torre','1007865238');
INSERT INTO "ESTUDIANTES" VALUES(4,'Anita','Gomez','Bola
amarilla','1009826768');
INSERT INTO "ESTUDIANTES" VALUES(5,'Pablo','Robles','Redondel
AjavÃ','1009897522');
FACULTADES............
INSERT INTO "FACULTADES" VALUES(1,'FACULTAD DE INGENIERIA EN
SISTEMAS COMPUTACIONALES','FICA');
INSERT INTO "FACULTADES" VALUES(2,'Facultad de Ciencias
Administrativas y Económicas','FACAE');
INSERT INTO "FACULTADES" VALUES(2,'Facultad de Ciencias de la
Salud','FCCSS');
NIVELES.............
INSERT INTO "NIVELES" VALUES(1,'PRIMERO');
INSERT INTO "NIVELES" VALUES(2,'SEGUNDO');
INSERT INTO "NIVELES" VALUES(3,'TERCERO');
INSERT INTO "NIVELES" VALUES(4,'CUARTO');
http://www.wix.com/oracle10gutn/bdd2 10
PERIODOS ACADEMICOS.........
INSERT INTO "PERIODOS_ACADEMICOS" VALUES(1,'2011-
2011',TO_DATE('10/03/2011','DD/MM/YYYY'),TO_DATE('15/07/2011','DD/
MM/YYYY'),'N');
INSERT INTO "PERIODOS_ACADEMICOS" VALUES(2,'2011-
2012',TO_DATE('8/08/2011','DD/MM/YYYY'),TO_DATE('28/02/2012','DD/M
M/YYYY'),'A');
DOCENTES..........................
INSERT INTO "DOCENTES" VALUES(1,'Miguel','Orquera','Av.
Atahualpa','1009887365');
INSERT INTO "DOCENTES" VALUES(2,'Ivan','Garcia','Av. El
Retorno','1004234556');
INSERT INTO "DOCENTES" VALUES(3,'Carlos','Romero','Av.
Atahualpa','1008758778');
INSERT INTO "DOCENTES" VALUES(4,'Fausto','Huera','La
Victoria','1007588948');
INSERT INTO "DOCENTES" VALUES(5,'Ivan','Rueda','Las
Palmas','1009687551');
CARRERAS.......................
INSERT INTO "CARRERAS" VALUES(1,1,'Carrera de Ing. en Sistemas
Computacionales','CISIC');
INSERT INTO "CARRERAS" VALUES(2,1,'Carrera de Ing. en
Mecatronica','CIME');
http://www.wix.com/oracle10gutn/bdd2 11
MATERIAS..........................
INSERT INTO "MATERIAS" VALUES(1,1,1,'Programacion 1',6,'A');
INSERT INTO "MATERIAS" VALUES(2,1,1,'Geometria Plana',4,'A');
INSERT INTO "MATERIAS" VALUES(3,1,1,'Algebra',5,'A');
INSERT INTO "MATERIAS" VALUES(4,1,1,'Analisis Matematico
1',5,'A');
INSERT INTO "MATERIAS" VALUES(5,1,2,'Graficacion y
Animacion',4,'A');
INSERT INTO "MATERIAS" VALUES(6,1,3,'SO',5,'A');
INSERT INTO "MATERIAS" VALUES(7,1,3,'Estructura de Datos
1',6,'A');
INSERT INTO "MATERIAS" VALUES(8,1,3,'SO',5,'A');
INSERT INTO "MATERIAS" VALUES(9,1,3,'Ecuaciones',6,'A');
++++++++++++++++++++++++++++++++++++++++++
ALTER TABLE "MATRICULAS" MODIFY (FECHA_MATRICULA );
ALTER TABLE tabla {ADD | MODIFY} ({columna tipoColumna [NOT
NULL],}+);
+++++++++++++++++++++++++++++++++++++++
MATRICULAS...................................
INSERT INTO "MATRICULAS" VALUES(1, 2, 1, 1,
TO_DATE('8/08/2011','DD/MM/YYYY'));
INSERT INTO "MATRICULAS" VALUES(2, 2, 1, 4,
TO_DATE('8/08/2011','DD/MM/YYYY'));
http://www.wix.com/oracle10gutn/bdd2 12
INSERT INTO "MATRICULAS" VALUES(3, 2, 1, 5,
TO_DATE('8/08/2011','DD/MM/YYYY'));
NOTAS.....................................
INSERT INTO "NOTAS" VALUES(1,1,6,8,0,7.0,9.5);
INSERT INTO "NOTAS" VALUES(2,6,7,8,0,7.5,8.0);
INSERT INTO "NOTAS" VALUES(2,7,9,9,0,9.0,10);
INSERT INTO "NOTAS" VALUES(3,4,7,7,0,7.0,9.5);
INSERT INTO "NOTAS" VALUES(3,6,8,7,0,7.5,9.0);
MATERIAS_DOCENTES..................................
INSERT INTO "MATERIAS_DOCENTES" VALUES(5,6,2,'A');
INSERT INTO "MATERIAS_DOCENTES" VALUES(4,7,2,'A');
INSERT INTO "MATERIAS_DOCENTES" VALUES(3,4,2,'A');
http://www.wix.com/oracle10gutn/bdd2 13
Tema:
Informe: Nro. 3
Creación de Vistas Triggers y Procedimientos Almacenados PL
1. Creación de Vistas
Una vista es un objeto. Una vista es una alternativa para mostrar datos de varias tablas; es como
una tabla virtual que almacena una consulta. Los datos accesibles a través de la vista no están
almacenados en la base de datos, en la base de datos se guarda la definición de la vista y no el
resultado de ella.
Entonces, una vista almacena una consulta como un objeto para utilizarse posteriormente. Las tablas consultadas en una vista se llaman tablas base. En general, se puede dar un nombre a
cualquier consulta y almacenarla como una vista.
Una vista suele llamarse también tabla virtual porque los resultados que retorna y la manera de
referenciarlas es la misma que para una tabla.
Las vistas permiten:
- simplificar la administración de los permisos de usuario: se pueden dar al usuario permisos para
que solamente pueda acceder a los datos a través de vistas, en lugar de concederle permisos para
acceder a ciertos campos, así se protegen las tablas base de cambios en su estructura.
- mejorar el rendimiento: se puede evitar teclear instrucciones repetidamente almacenando en una
vista el resultado de una consulta compleja que incluya información de varias tablas.
Podemos crear vistas con: un subconjunto de registros y campos de una tabla; una unión de
varias tablas; una combinación de varias tablas; un subconjunto de otra vista, combinación de
vistas y tablas.
Una vista se define usando un "select".
SINTAXIS:
CREATE VIEW <nombre_vista>
AS
(<sentencia_select>);
http://www.wix.com/oracle10gutn/bdd2 14
NOS DEBOLVERA:
NOMBRES
NOMBRE_MATERIA
ID_
Anita SO 2
Anita Estructura de Datos 1 2
Pablo Analisis Matematico 2
Pablo SO 2
Tenemos un ejemplo de una vista:
Necesitamos mostrar Los nombres de los estudiantes, las materias que cursan, pero solamente del
periodo nro 2 que es el que está en vigencia.
Periodo 1= 2011-2011 10-MAR-11 15-JUL-11 N
Periodo 2= 2 2011-2012 08-AUG-11 28-FEB-12 A
CREATE VIEW "VISTA1" AS (SELECT CONCAT(NOMBRES,APELLIDOS) ESTUDIANTE,
NOMBRE_MATERIA, NOTA1, NOTA2, NOTA3, PROMEDIO, CONDICION, DESCRIPCION FROM
ESTUDIANTES E, MATRICULAS M, NOTAS N, MATERIAS MAT, PERIODOS_ACADEMICOS PA
WHERE E.ID_ESTUDIANTE=M.ID_ESTUDIANTE AND M.ID_MATRICULA=N.ID_MATRICULA AND
N.ID_MATERIA=MAT.ID_MATERIA AND M.ID_PERIODO=PA.ID_PERIODO);
/
PERIODO
CREACION DE TRIGGERS.
Comenzaremos implementando una nueva BDD llamada EMPLEADOS ahí realizaremos un
triggers muy básico para su comprensión.
Ejmemplo:
Crear un trigger sobre la tabla empleados para que no se permita que un empleado sea jefe de
más de cinco empleados.
1. Comenzaremos implementando un nuevo usuario.
http://www.wix.com/oracle10gutn/bdd2 15
El código seria:
CREATE USER EMPLEADO IDENTIFIED BY D
DEFAULT TABLESPACE USERS
TEMPORARY TABLESPACE TEMP
QUOTA UNLIMITED ON USERS;
2. Creación de las tablas:
CREATE TABLE empleados (
dni char(4),
nomemp varchar2(15),
cojefe char(4),
PRIMARY KEY (dni),
FOREIGN KEY (cojefe) references empleados on delete cascade);
3. Creación del TRIGGER:
CREATE OR REPLACE TRIGGER jefes
BEFORE
INSERT OR UPDATE OF cojefe ON empleados
FOR EACH ROW
DECLARE
supervisa INTEGER;
BEGIN
SELECT count(*) INTO supervisa
FROM empleados
WHERE cojefe = :new.cojefe;
IF supervisa > 4
THEN raise_application_error
(-20600,:new.cojefe||'no se puede supervisar mas de 5');
END IF;
END;/
http://www.wix.com/oracle10gutn/bdd2 16
4. Inserción de Datos:
INSERT INTO empleados VALUES ('D1','Director',null);
INSERT INTO empleados VALUES ('D2','D.Comercial','D1');
INSERT INTO empleados VALUES ('D3','D.Produc.','D1');
INSERT INTO empleados VALUES ('D4','Jefe Vent.','D1');
INSERT INTO empleados VALUES ('D5','Jefe Mark.','D1');
INSERT INTO empleados VALUES ('D6','Vendedor 1','D1');
INSERT INTO empleados VALUES ('D8','Vendedor 3','D1');
//LA ULTIMA LINEA NOS DARIA UN ERROR PORQUE EL JEFE D1 TENDRIA MAS DE 5 EMPLEADOS.
http://www.wix.com/oracle10gutn/bdd2 17
FUNCIONES - PROCEDIMIENTOS ALMACENADOS
• SINTAXIS PL/SQL
DECLARE Sentencias de declaración BEGIN Sentencias de ejecución EXCEPTION Sentencias para el manejo de excepciones END;
Ejemplo:
Vamos a crear una variable varchar2 a la que asignaremos el nombre o nombres de estudiantes
cuando id_estudiante sea igual a 1.
DECLARE
aux_nombre varchar2(50);
BEGIN
SELECT NOMBRES INTO AUX_NOMBRE FROM ESTUDIANTES
WHERE ID_ESTUDIANTE=1;
DBMS_OUTPUT.PUT_LINE(aux_nombre);
END;
/
http://www.wix.com/oracle10gutn/bdd2 18
Tema:
Informe: Nro. 4
ARQUITECTURA DE BDD OARACLE
La arquitectura de Oracle tiene tres componentes básicos. Las estructuras de memoria para
almacenar datos y el código ejecutable, los procesos que corren el sistema de base de datos y las
tareas de cada usuario conectado a la base de datos y archivos que sirven para el almacenamiento
físico en el disco de la información de base de datos.
Conceptos Básicos.
Oracle Database Thread
Description
Required/Optional
DBW0 database writer Required
LGWR log writer Required
PMON process monitor Required
SMON system monitor Required
http://www.wix.com/oracle10gutn/bdd2 19
Oracle Database
Thread
Description
Required/Optional
CKPT checkpoint process (thread on Windows) that
runs by default on Windows
Optional
ARCH0 archive process (or thread on Windows) Optional
RECO distributed recovery background process Optional
LCKn, Lock: (lock processes) El bloqueo es un proceso opcional. Efectúa los
bloqueos entre instancias, en caso de ambientes con servidores paralelos (hasta con
10 servidores).
CKPT : (Check point) El punto de comprobación es un proceso opcional que ocurre
cuando los usuarios conectados a la base de datos, hacen solicitudes de exámenes de
datos.
SNPn : (Snapshot process) se encarga de refrescar los snapshots o réplicas de tablas
que se usan principalmente en ambientes distribuidos.
SMON : (System monitor) recupera el sistema ante una falla de la instancia.
RECO : (Recovery) recupera ante las fallas, en una transacción en ambientes
distribuidos.
ARCH : (Archive) copia los registros de rehacer de la RAM en archivos de datos
que permiten la recuperación cuando se presentan fallas de los medios magnéticos.
PMON : (Process Monitor) recupera ante una falla de un proceso de usuario; libera
los recursos del proceso que falló.
http://www.wix.com/oracle10gutn/bdd2 20
TABLA DE ARCHIVOS Nombre del proceso Sistemas UNIX Sistema Windows
PMON Pmon_xxxx.trc sidPMON.trc
SMON Smon_xxxx.trc sidSMON.trc
DBW0 Dbw0_xxxx.trc sidDBW0.trc
LGWR Lgwr_xxxx.trc sidLGWR.trc
CPT Cpt_xxxx.trc sidCPT.trc
ARC0 Arc_xxxx.trc sidARC0.trc
TUNING BDD ORACLE
Para los desarrolladores de aplicaciones y administradores de base de datos, el ajuste de las
aplicaciones es un área de esencial importancia y se invierte una considerable cantidad de tiempo
en el desarrollo de esta función tan relevante. Una aplicación comercial escasamente adaptable
puede afectar potencialmente no solo a algunos usuarios, sino también a toda la operación
comercial, y por esta razón las empresas invierten en una gran cantidad de recursos para asegurar
la ejecución de las aplicaciones esenciales para sus empresas sin inconvenientes.
Oracle Tuning Pack, parte del grupo de productos de Oracle Database 11g, ofrece una solución
extremadamente económica y fácil de usar que automatiza todo el proceso de ajuste de las
aplicaciones. Las mejoras en el desempeño de SQL se logran a través de los Asesores SQL, las
cuales se integran sin defectos con Enterprise Manager Database Control y Grid Control, y
juntas brindan una solución completa para la automatización de la compleja y prolongada tarea
de ajuste de las aplicaciones.
CARACTERÍSTICAS CLAVE:
• Asesor de Ajuste SQL
• Asesor de Ajuste Automático SQL • Perfiles SQL
• Asesor de Acceso SQL • Grupos de Ajuste SQL • Wizard de reorganización de Objetos
BENEFICIOS CLAVE:
• Solución integral para aplicaciones y ajuste SQL que elimina la necesidad de ajuste manual. • Ajuste automático de sentencias SQL.
http://www.wix.com/oracle10gutn/bdd2 21
• Mejoras en el desempeño y confiabilidad del sistema, y reducción significativa de los costos de
administración.
SQL Tuning Advisor
El ajuste SQL manual es un proceso que presenta muchos desafíos. Requiere experiencia en
muchas áreas, consume una gran cantidad de tiempo y exige un íntimo conocimiento de las
estructuras de esquemas y del modelo de uso de datos para la aplicación. Todos estos factores
convierten al ajuste SQL manual en una tarea desafiante, que requiere muchos recursos y que
resulta muy costosa para la empresa.
SQL Tuning Advisor es la respuesta de Oracle ante los obstáculos y desafíos del ajuste SQL
manual. Automatiza el proceso de ajuste SQL al explorar completamente todas las maneras
posibles de adaptar una sentencia SQL. El análisis y el ajuste se realizan a través del optimizador
de consultas altamente mejorado del motor de base de datos. Se realizan cuatro tipos de análisis
por parte de SQL Tuning Advisor:
• Análisis Estadístico: El optimizador de consultas debe actualizar las estadísticas de objetos para
generar planes de buena ejecución. En este análisis, se identifican los objetos ORACLE DATA
SHEET con las estadísticas antiguas o faltantes y se sugieren recomendaciones para remediar el
problema.
• SQL Profiling: Esta característica, introducida en Oracle Database 10g, revoluciona el enfoque
hacia el ajuste SQL. El ajuste SQL tradicional implica la manipulación manual del código de
aplicaciones utilizando las pistas del optimizador. SQL Profiling elimina la necesidad de este
proceso manual y adapta las sentencias SQL sin requerir ningún cambio en el código de
aplicaciones. Esta capacidad de adaptar SQL sin cambiar el código de aplicación también ayuda a
resolver el problema de las aplicaciones de ajuste empaquetadas. Los usuarios de aplicaciones
empaquetadas ahora ya no deben registrar un bug con el proveedor de la aplicación y esperar
varias semanas para obtener un código fijo para el ajuste de la sentencia. Con SQL Profiling el
proceso de ajuste es automático e inmediato.
• Análisis del Canal de Acceso: Los índices pueden mejorar enormemente el desempeño de una sentencia SQL al reducir la necesidad de un escaneo total de las tablas. La indexación efectiva es,
por consiguiente, una técnica de ajuste común. En este análisis, se identifican y recomiendan los
nuevos índices que pueden mejorar significativamente el desarrollo de las consultas.
http://www.wix.com/oracle10gutn/bdd2 22
• Análisis de la Estructura SQL: Los problemas con la estructura de las sentencias SQL pueden
llevar a un escaso desempeño. Estos podrían ser problemas sintácticos, semánticos o de diseño
respecto de la sentencia. En este análisis se realizan sugerencias relevantes para reestructurar las
sentencias SQL seleccionadas para un mejor desempeño.
El resultado de este análisis se presenta en forma de recomendaciones, junto con una lógica para cada recomendación y su beneficio de desempeño esperado. Las recomendaciones se relacionan
con la recopilación de estadísticas de objetos, la creación de nuevos índices, la reestructuración de
las sentencias SQL, o la creación de un Perfil SQL. Un usuario puede elegir aceptar la
recomendación para completar el ajuste de las sentencias SQL.
CAMBIO DE TAMAÑO EN LOS BLOQUES ORACLE
CONCEPTOS
TABLESPACE - DATAFILE
• Un tablespace contiene 0 o más segmentos (Cada segmento reside en un tablespace).
• Un segmento son objetos de esquema, los tipos son: tablas, índices, temporales y rollback; ellos son almacenados fuera del data dictionary. Los constraint y sequences son
almacenados en el data dictionary por lo tanto no son segmentos.
• Cada segmento contiene extents. (Cada extents reside en un datafile).
• Una base de datos puede tener maximo 64000 datafiles. • Un extent contiene data blocks. (Cada data block es un conjunto de bytes de hd).
• SYSTEM y SYSAUX tienen el tamaño default de data block. • Cada tablespace puede tener diferentes tamaños de data block.
• El tablespace SYSTEM almacena el data dictionary. • El tablespace SYSAUX almacena objetos para el catalogo del RMAN, el AWR, Data
Mining y otros. Fue pensado para reducir objetos que eran colocados en el SYSTEM. Se
puede aumentar su tamaño en cualquier momento.
http://www.wix.com/oracle10gutn/bdd2 23
Opciones de tablespace: Big file o small file, manage extents locally o dictionary y manage
segment space automatico o manual.
Los tablespace bigfile tienen 1 datafile, su tamaño máximo es (4 TB * Tamaño de un data block,
Ejemplo:
Si 8 KB es el tamaño del data block de un tablespace su tamaño máximo seria 32 TB).
Los tablespace smallfile pueden tener de 1 a 1022 datafiles para un tablespace. Su tamaño maximo es (4 GB * Tamaño de un data block, Ejemplo Si 8 KB es el tamaño del data block de un tablespace su tamaño máximo seria 32 GB). SYSTEM y SYSAUX siempre son smallfiles
tablespaces.
• OMF (Oracle Managed Files), permite que Oracle se encargue de nombrar y ubicar a
nuestros datafiles automáticamente. Por defecto asigna 100 MB y auto extendido.
Los tablespace pueden ser Data Dictionary (Utiliza un registro de los extents libres y usados mediante las tablas FET$ y UET$ en modo recursivo, los extendidos son manejados vía data
dictionary provocando contención en el SYSTEM tablespace), Local (Default y utiliza bitmaps
(conjunto de bloques) para manejar los extendidos para dejar de utilizar el modo recursivo).
Local tiene 2 tipos: UNIFORM (Mantiene los extents del mismo tamaño, default 1 MB, no puede
ser aplicado a los undo tablespace y es el default para los Temporary Tablespace) y
AUTOALLOCATE (default). Se puede convertir de de Data Dictionary a Local y viceversa. Pero
no se puede convertir el Local a Data Dictionary el tablespace SYSTEM y los Temporary
Tablespaces.
Un tablespace Local puede ser MANUAL (Utiliza PCT_FREE (insert DML) y PCT_USED
(delete o update DML), es el default y es fijo en los Temporary Tablespace y en el SYSTEM
Tablespace) o AUTOMATIC (Utiliza bitmaps).
Los Temporary Tablespaces segments son generados por un order by, group by, create index e inserts a tablas temporales. Los temporary tablespaces son seteados a NOLOGGING. No se
puede renombrar un temp file o ponerlo read only. Lo que es válido es llevar el temp file a online
u offline pero no el tablespace.
Undo tablespace sirve para rollback, reconstruir un read-consistent y recover de corrupciones lógicas.
Un tablespace debe ser llevado a offline para un recover de el tablespace o mover datafiles.
http://www.wix.com/oracle10gutn/bdd2 24
SYSTEM, UNDO y SYSAUX no pueden ser colocados readonly.
Un tablespace al ponerlo en offline tenemos 3 opciones: NORMAL, TEMPORARY e
IMMEDIATE. El NORMAL hace un checkpoint y asegura que sea escrito en disco, es ideal en
NOARCHIVELOG y al ponerlo online no requiere media recovery. El TEMPORARY también
hace checkpoint pero no asegura que se haya hecho a todos los datafiles por lo tanto puede ser
que haya un media recovery en alguno de los datafiles. IMMEDIATE no hace checkpoint y
ejecuta un media recovery al volver a colocar el tablespace en online. El default es normal.
En versiones inferiores de Oracle 10g R2 no se puede eliminar un datafile. El comando ALTER DATABASE DATAFILE ‘ruta’ OFFLINE DROP indica que el datafile se
pondrá en estado offline con la intención de eliminar el tablespace.
No se puede renombrar el SYSAUX y SYSTEM tablespace.
Cuando no hay un tablespace temporal en la base de datos, Oracle utiliza el SYSTEM tablespace en reemplazo de este.
PARAMETROS Parametro Objetivo db_block_size = valor Permite especificar el tamaño default de un
data block. db_create_file_dest = ruta Habilita OMF y especifica el lugar donde
Oracle creara los datafiles. db_create_online_dest_n Donde n = 1..5 y es donde se ubicarán los redo
logs y control files utilizando OMF. undo_management = nombre Define el undo tablespace de la base de datos. sort_area_retained_size Tamaño ocupado por ordenamientos.
http://www.wix.com/oracle10gutn/bdd2 25
Memoria Oracle (SGA)
Su tamaño está determinado por los parámetros:
Shared_Pool_Size= Tamaño en bytes del área para SQL compartidos y sentencias PL/SQL. Db_Block_Size = Tamaño en bytes de un solo bloque de datos.
Db_Block_Buffers = Numero de Buffers a localizar en memoria.
Log_Buffer = Numero de bytes localizados para para los Redo Log Buffer.
SGA = Shared_Pool_Size + (Db_Block_Size * Db_Block_Buffers) +
Log_Buffer.
Las modificaciones de los parámetros de la base de datos se las puede modificar desde:
/usr/lib/oracle/xe/app/oracle/product/10.2.0/server/dbs/init.ora
http://www.wix.com/oracle10gutn/bdd2 26
Tema:
Informe: Nro. 5
Conexión Remota hacia SGBD Oracle 10g R2 XE
1. Conexión desde un SGBD Oracle en Windows, hacia otro SGBD en UBUNTU.
1.1. Probamos la base de datos en Ubuntu :
Nuestra base de datos se llama ACADEMCO. Y podemos ver que si hay conexión.
Ahora abra que habilitar el puerto de escucha para conexiones remotas ya que esta opción no esta
habilitada en la configuración estándar.
http://www.wix.com/oracle10gutn/bdd2 27
1.2. Habilitamos las conexiones remotas.
1.3.
Con esto ya podremos conectarnos a nuestra BDD remotamente con cualquier herramienta.
http://www.wix.com/oracle10gutn/bdd2 28
Programas que podemos utilizar para una conexión remota
TOAD
- Instant Client (sql*plus)
- Otro programa SGBDD
Las conexiones cliente servidor se basarían en cuanto a los permisos que tenga
cualquier cliente por ejemplo:
Si queremos hacer una conexión remota para administrar SGBDD tendremos que
tener un paquete completo de herramientas de instant client.
Los permisos de cada conexión serán determinados, asignados por el dba.
Otro programa SGBDD ORACLE en Windows:
Pasos:
Básicamente utilizaremos el paquete de sql*plus que viene con el programa ORACLE.
1. Vamos a abrir una terminal en Windows:
2. Digitaremos sqlpus
http://www.wix.com/oracle10gutn/bdd2 29
3. Ingresamos el nombre de usuario en nuestro caso user=SYSTEM, pasw=d
4. Por ultimo hacemos la conexión remota digitando.
Donde:
connect [nombre bDD]/[pasw] @[host remoto]
Entonces nos quedaría:
Listo nos hemos conectado hacia la base de datos ACADEMICO con host
192.168.10.120
http://www.wix.com/oracle10gutn/bdd2 30
CONEXIÓN CON TOAD
Para realizar la conexión con TOAD deberá revisar el video en el siguiente enlace:
REVIZAR EL VIDEO AQUí:
http://www.youtube.com/watch?v=TdS03bc3mqs http://www.wix.com/oracle10gutn/bdd2
http://www.wix.com/oracle10gutn/bdd2 31
Tema:
Informe: Nro. 6
DICCIONARIO DE DATOS Y SISTEMAS RECUPERACIÓN
El Diccionario de Datos
Una de las partes más importantes de una base de datos Oracle es su diccionario de datos, que es
una de sólo lectura un conjunto de tablas que proporciona información sobre la base de
datos. Un diccionario de datos contiene:
• Las definiciones de todos los objetos de esquema en la base de datos (tablas, vistas,
índices, clusters, sinónimos, secuencias, procedimientos, funciones, paquetes, triggers,
etc)
• ¿Cuánto espacio se ha destinado, y es utilizado actualmente por los objetos de esquema
• Los valores predeterminados para las columnas
• Restricción de integridad de la información
• Los nombres de los usuarios de Oracle
• Privilegios y roles de cada usuario se ha concedido
• Auditoría de la información, como quién ha accedido o actualizar varios objetos de
esquema
• Otra información de bases de datos generales
El diccionario de datos se estructura en las tablas y vistas, al igual que los datos de otra base de
datos. Todas las tablas del diccionario de datos y puntos de vista para una determinada base de
datos se almacenan en la base de datos del Sistema de tablas.
No sólo es el diccionario de datos central para cada base de datos de Oracle, es una herramienta
importante para todos los usuarios, de los usuarios finales a los diseñadores de aplicaciones y
administradores de bases de datos. Usar instrucciones SQL para acceder al diccionario de
http://www.wix.com/oracle10gutn/bdd2 32
datos. Debido a que el diccionario de datos es de sólo lectura, puede realizar consultas sólo
( SELECCIONAR declaraciones) en contra de las tablas y vistas.
Estructura del Diccionario de Datos
El diccionario de datos consiste en lo siguiente:
Tablas de Base
Las tablas subyacentes que almacenan información sobre la base de datos asociada. Sólo Oracle
debe escribir y leer estas tablas. Los usuarios no acceder a ellas directamente, ya que se
normalizan, y la mayoría de los datos se almacenan en un formato críptico.
Accesible por el usuario Vistas
Las opiniones que resumen y mostrar la información almacenada en las tablas base del
diccionario de datos. Estos puntos de vista decodificar los datos de la tabla base en información
útil, tales como nombres de usuario o una mesa, con uniones y DONDE cláusulas para
simplificar la información. La mayoría de los usuarios tienen acceso a los puntos de vista en lugar
http://www.wix.com/oracle10gutn/bdd2 33
de las tablas base.
SYS, propietario del Diccionario de Datos
El usuario de Oracle SYS posee todas las tablas de la base y accesibles para el usuario puntos de
vista del diccionario de datos. Ningún usuario de Oracle debe nunca alterar (
ACTUALIZACIÓN , DELETE , o INSERTAR ) las filas o los objetos de esquema que figura en el
SYS esquema, ya que dicha actividad puede comprometer la integridad de los datos. El
administrador de seguridad debe mantener un control estricto de la cuenta central.
Precaución:
Alterar o manipular los datos en las tablas del diccionario de datos de forma
permanente y puede dañar la operación de una base de datos.
¿Cómo el diccionario de datos se utiliza
El diccionario de datos tiene tres usos principales:
• Oracle accede al diccionario de datos para encontrar información sobre los usuarios, los
objetos de esquema, y las estructuras de almacenamiento.
• Oracle modifica el diccionario de datos cada vez que un lenguaje de definición de datos
(DDL) se emite.
• Cualquier usuario de Oracle puede utilizar el diccionario de datos como referencia de
sólo lectura para obtener información sobre la base de datos.
Forma en que Oracle utiliza el diccionario de datos
Los datos de las tablas base del diccionario de datos es necesaria para Oracle funcione . Por lo
tanto, sólo Oracle debe escribir o cambiar la información del diccionario de datos. Oracle
proporciona secuencias de comandos para modificar las tablas del diccionario de datos cuando
una base de datos está subido o bajado.
http://www.wix.com/oracle10gutn/bdd2 34
Precaución:
No hay datos en cualquier tabla de diccionario de datos deben ser alterados o
borrados por otros usuarios.
Durante la operación de bases de datos, Oracle dice el diccionario de datos para cerciorarse de
que existen objetos de esquema y que los usuarios tienen un acceso adecuado a ellos. Oracle
también actualiza el diccionario de datos continuamente para reflejar los cambios en las
estructuras de base de datos, auditoría, las subvenciones, y los datos.
Por ejemplo, si el usuario Kathy crea una tabla llamada partes , a continuación, se agregan
nuevas filas al diccionario de datos que reflejan la nueva tabla, las columnas, segmentos,
extensiones, y los privilegios que Kathy tiene sobre la mesa. Esta nueva información es entonces
visible la próxima vez vistas del diccionario se consultan.
Sinónimos públicos de Vistas del Diccionario de Datos
Oracle crea sinónimos públicos de muchos puntos de vista del diccionario de datos que los
usuarios puedan acceder a ellos cómodamente. El administrador de seguridad También puede
crear sinónimos públicos para objetos de esquema que se utilizan en todo el sistema. Los usuarios
deben evitar nombrar a sus propios objetos de esquema con los mismos nombres que se utilizan
para sinónimos públicos.
La memoria caché del diccionario de datos para un acceso rápido
Gran parte de la información del diccionario de datos se mantiene en el SGA en la memoria
caché de diccionario , ya que Oracle siempre tiene acceso al diccionario de datos durante la
operación de bases de datos para validar el acceso de los usuarios y verificar el estado de los
objetos de esquema. Toda la información se almacena en la memoria con el usado menos
recientemente (LRU) algoritmo.
Información de análisis se suele mantener en el caché. La COMENTARIOS columnas que
describen las tablas y sus columnas no se almacenan en caché a menos que se accede con
frecuencia.
http://www.wix.com/oracle10gutn/bdd2 35
Otros programas y el Diccionario de Datos
Otros productos de Oracle pueden hacer referencia a puntos de vista existentes y crear otras
tablas del diccionario de datos o puntos de vista de su propia cuenta. Los desarrolladores de
aplicaciones que escriben programas que se refieren al diccionario de datos deben referirse a los
sinónimos públicos en lugar de las tablas subyacentes: los sinónimos son menos propensos a
cambiar de versiones de software.
Cómo usar el diccionario de datos
Los puntos de vista del diccionario de datos sirven como referencia para todos los usuarios de
bases de datos. Acceder a las vistas del diccionario de datos con sentencias SQL. Algunos puntos
de vista son accesibles a todos los usuarios de Oracle, y otros están pensados para
administradores de bases de datos solamente.
El diccionario de datos siempre está disponible cuando la base de datos está abierta. Que reside
en el Sistema de tablas, que está siempre en línea.
El diccionario de datos consiste de un conjunto de puntos de vista. En muchos casos, un
conjunto formado por tres puntos de vista con información similar y distinguen entre sí por sus
prefijos:
Tabla 4-1 Datos prefijos Diccionario Vista
Prefijo Alcance
USERS Punto de vista del usuario (lo que está en el esquema del usuario)
ALL De usuarios ampliada de vista (lo que el usuario puede acceder)
DBA Punto de vista del administrador de base de datos (lo que está en los esquemas de todos
los usuarios)
http://www.wix.com/oracle10gutn/bdd2 36
SISTEMAS DE RECUPERACIÓN
Export / Import Oracle 10g
¿Qué es un export/import en Oracle?
Export/Import es una utilidad de Oracle para realizar backups lógicos de Oracle ( y luego
poderlos restaurar ). Esto significa que copian el contenido de la BD pero sin almacenar la
posición física de los datos. Para realizar estas operaciones la base de datos tiene que estar abierta.
Para crear el fichero de backup se utiliza la utilidad export y para importar el contenido o
recuperar la base de datos se realiza import.
Este tipo de backup se utiliza en los siguientes casos:
• Para realizar backups de bases de datos ( pequeñas/medianas bases de datos )
• Para corregir "Row Migration & Row Chaining"
• Detectar alguna corrupción en la base de datos, puesto que al hacer el export se lee toda
la bd.
• Para "migrar" una base de datos a otro servidor
Ejemplo1: Copia completa de la base de datos
$exp file=/oracle9/export_orasite.dmp full=yes log=/oracle9/log/export_orasite.log
buffer=1000000
$exp file=/oracle9/export_orasite.dmp full=yes log=/oracle9/log/export_orasite.log
buffer=1000000
file=/oracle9/export_orasite.dmp > Nombre y ubicación del archivo del export ( el usuario oracle
tiene que tener permisos para escribir ahi. La extensión de este archivo es dmp.
http://www.wix.com/oracle10gutn/bdd2 37
full=yes> Con esto indicamos que el export es completo, todos los esquemas de la base de datos y
sus datos permisos, privilegios ..
log=/oracle9/log/export_orasite.log > fichero para tener el log del export, el usuario oracle
también tiene que tener permisos en ese directorio para escribir.
buffer=1000000 > reservamos buffer para la operación.
Ejemplo2: Copia de tablas especificas de un usuario
$exp scott/tiger file=orasitescott.dmp tables=(emp,dept) buffer=1000000
En este caso realizamos sólo un backup de las tablas especificadas en el argumento tables del
usuario scott
Ejemplo3: Copiar tablas de un usuario con una condición especifica
$exp scott/tiger file=c:\orasitempleados.dmp tables=emp query=\"where deptno=10\"
Exportamos la tabla emp del usuario scott y en el argumento query espeficificamos una condición
para realizar el export de esa tabla
"Export interactivo"
Otra forma de realizar un export es poniendo simplemente en la línea de comando exp y esperar
a que te vaya pidiendo la utilidad los parámetros que requiere.
De esta forma te pedirá el usuario, constraseña, si quieres hacer copia sólo de la estructura, con
datos, sin datos, nombre del archivo ... etc.
Recomendaciones:
Se pueden hacer exports con diferentes versiones de Oracle, aunque es recomendable realizar el
export con la misma versión de la base de datos. En todo caso si se hace con un cliente, si la
versión es superior o la misma a la de la base de datos, Oracle "asegura" que no existe ningún
problema en realizarlo.
http://www.wix.com/oracle10gutn/bdd2 38
IMPORTACIÓN DE ARCHIVOS
Ejemplo1: Importar todo el archivo exportado
$imp system/manager file=c:\orasitefull.dmp full=yes ignore=yes
log=c:\orasite\log\import_log.log buffer=1000000
Importamos con el usuario system que tiene permisos para importar el archivo orasitefull.dmp
dejando un log de dicha importación en import_log.log reservando un buffer de 100000
http://www.wix.com/oracle10gutn/bdd2 39
Ejemplo2: Importar una tabla de un usuario concreto
$imp scott/tiger file=orasitempleados.dmp fromuser=scott touser=scott tables=dept
Importamos del archivo orasitempleados.dmp sólo del usuario scott de ese archivo al esquema del
usuario scott la tabla departamento
"Import interactivo"
Otra forma de realizar un import al igual que el export es introducir en la línea de comando imp
y esperar a que te vaya pidiendo la utilidad los parámetros que requiere.
De esta forma te pedirá el usuario, constraseña, el archivo para importar, qué quieres importar
del archivo ... etc.
http://www.wix.com/oracle10gutn/bdd2 39
Informe: Nro. 7
Tema:
Manejo de Transacciones desde Java
1.- Presentaciones. Elegimos esta opción para crear la presentación de la base de datos.
http://www.wix.com/oracle10gutn/bdd2 39
2. Clic derecho en base de datos. Esto para crear una conexión hacia la bdd.
3. Nueva conexión
3.1 En la opción driver seleccionamos “Oracle thin”
3.2 Agregamos la dirección del driver ojdbc lo podemos descargar aquí
http://www.oracle.com/technetwork/database/features/jdbc/index-091264.html
http://www.wix.com/oracle10gutn/bdd2 39
4. Especificar la conexión
4.1 SERVIDOR. Local host seria: 172.0.0.1
4.2 SERVICIO. Es la instancia de Oracle esta es Express Edition (EX).
4.3 PUERTO. El puerto listener e la bdd. 1521 por edfecto.
4.4 USURIO. El usuario de la bdd con privilegios para acceder remotamente.
5. Selección de tablas. Desplegamos la nueva conexión que se creó.
http://www.wix.com/oracle10gutn/bdd2 39
5. Pruebas. Ya con la conexión correctamente y todos los datos mostrados podemos
ejecutar comandos.
Podemos ver que los datos se despliegan correctamente.
Todos los comandos admitidos en SQL*PLUS servían de igual forma en la hoja de comandos
de SQL de Neetbeans.
http://www.wix.com/oracle10gutn/bdd2 39
TABLA DE BUSQUEDAS, ESDISTICAS Y TIEMPO DE RESPUESTA
1. BUSQUEDA POR CLAVE CANDIDATA PERO NO ESTA ORENADA POR
ATRIBUTO DE BUSQUEDA
1.1 podemos ver que el campo ID_ESTUDIANTE tiene todas sus filas desordenadas pero es
una clave primaria.
‚select id_estudiante from estudiantes where id_estudiante=80‛
1.2 ESTADISTICAS:
http://www.wix.com/oracle10gutn/bdd2 39
2. BUSQUEDA POR CLAVE Y ATRIBUTOS ORDENADOS
La búsqueda será ‚select id_docente from docentes where id_docente=15‛
Estadísticas:
http://www.wix.com/oracle10gutn/bdd2 39
3. BUSQUEDA POR NO CLAVE Y ATRIBUTOS ORDENADOS
Estadísticas: