Mis Apuntes Oracle PL-SQL
Transcript of Mis Apuntes Oracle PL-SQL
CursoFundamentos de Oracle, SQL y PLSQL
Creado por:José Alexander Rodríguez Vargas
1. Fundamentos de Oracle
¿Qué es Oracle?
Oracle es un sistema de gestión de base de datos relacional (o RDBMS por el acrónimo en inglés de Relational Data Base Management System), desarrollado por Oracle Corporation.
Se considera a Oracle como uno de los sistemas de bases de datos más completos, destacando:
soporte de transacciones estabilidad escalabilidad Soporte multiplataforma.
Su dominio en el mercado de servidores empresariales ha sido casi total hasta hace poco, recientemente sufre la competencia del Microsoft SQL Server de Microsoft y de la oferta de otros RDBMS con licencia libre como PostgreSQL, MySql o Firebird. Las últimas versiones de Oracle han sido certificadas para poder trabajar bajo GNU/Linux.
Licencias de Oracle
Oracle a partir de la versión 10g Release 2, cuenta con 6 ediciones:
Oracle Database Enterprise Edition(EE).
La versión empresarial es la más alta del rango en las versiones de Bases de Datos oracle para servidor, cuenta con opciones tales com RAC, Particionamiento, Spatial, etc, y estas opciones pueden manejarse de manera separada para mejorar la funcionabilidad de la base de datos. Esta licencia se usa generalmente en servidores que tienen más de 4 CPU’s. y no tiene limites de memoria.
Oracle Database Standard Edition (SE).
La version standard es diseñada para empresas medianas y pequeñas. Ofrecevariascaracterísticas y funcionalidades implementadas en la version Enterprise.
Opciones deBase de Datos como Data Guard, Particionamiento, Spatial, etc no vienen incluidascon esta version. Esta version estandar aplica a servidores de 1 a 4 CPU’s , si seexceden los cuatro CPU’s deberá entonces adquirir una licencia de Enterprise Edition,la versión de Standard Edition no tiene limites de memoria y puede usarse en clustering con Oracle RAC sin cargo adicional a partir de la versión 10g.
Oracle Database Standard Edition One (SE1)
La version Standar edition one es de menor costo y menos nivel que la Standar Edition.Se introdujo con Oracle 10g , tiene algunas restricciones en sus funcionalidades,puede ser licenciada solo para pequeños servidores con una capacidad maxima de 2procesadores.
Oracle Database Express Edition (XE).
Introducida en 2.005, ofrece una versión Oracle 10g libre para distribuirse sobreplataformas Windows y Linux, tiene restricciones de solo un CPU, 4 Gigas de datos yusa máximo 1 GB de RAM, el soporte de esta versión se encuentra en foros y no através de Oracle Corporation.La única edición gratuita es la Express Edition, que es compatible con las demásediciones de Oracle Database 10gR2 y Oracle Database 11g.Esta version puede embeberse con otras aplicaiones de terceros y se puede distribuirgratuitamente.
Oracle Database Personal Edition (PE).
La personal edition es una versión de base de datos singular para usuario. Es casiigual a la version Enterprise Edition, pero no soporta opciones avanzadas como RAC,Streams, XMLDB, etc.
Oracle Database Lite Edition (LE).
Destinado para funcionar en dispositivos móviles tales como celulares, PDA’s, etc.Incrusta una base de datos móvil situada en el dispositivo y se puede sincronizar conuna instalación basada en servidor.
Versiones de Oracle
Oracle5 Oracle6 Oracle7: 7.0.16—7.3.4 Oracle8 Database: 8.0.3—8.0.6 Oracle8i Database Release 1: 8.1.5.0—8.1.5.1 Oracle8i Database Release 2: 8.1.6.0—8.1.6.3 Oracle8i Database Release 3: 8.1.7.0—8.1.7.4 Oracle9i Database Release 1: 9.0.1.0—9.0.1.5 (patchset as of December 2003) Oracle9i Database Release 2: 9.2.0.1—9.2.0.8 (patchset as of April 2007) Oracle Database 10g Release 1: 10.1.0.2—10.1.0.5 (patchset as of February 2006) Oracle Database 10g Release 2: 10.2.0.1—10.2.0.5 (patchset as of April 2010) Oracle Database 11g Release 1: 11.1.0.6—11.1.0.7 (patchset as of September 2008) Oracle Database 11g Release 2: 11.2.0.1 (released 20090901)
Sistemas Operativos y Arquitecturas Soportadas en Oracle 10g R2
Oracle Database 10g Release 2 (10.2.0.4) for MAC OS X on Intel x8664
Oracle Database 10g Release 2 (10.2.0.4) for Microsoft Windows Vista x64, Microsoft Windows Server 2008 R2 x64, Windows 7 x64
Oracle Database 10g Release 2 (10.2.0.3/10.2.0.4) for Microsoft Windows Vista, Windows Server 2008, Windows 7
Oracle Database 10g Release 2 (10.2.0.1.0) for Microsoft Windows Oracle Database 10g Release 2 (10.2.0.1.0) for Microsoft Windows (x64) Oracle Database 10g Release 2 (10.2.0.1.0) for Microsoft Windows (64bit Itanium) Oracle Database 10g Release 2 (10.2.0.1.0) for Linux x86 Oracle Database 10g Release 2 (10.2.0.1.0) for Linux x8664 Oracle Database 10g Release 2 (10.2.0.1.0) for Linux Itanium Oracle Database 10g Release 2 (10.2.0.1.0) for Linux on Power Oracle Database 10g Release 2 (10.2.0.1.0) for AIX5L Oracle Database 10g Release 2 (10.2.0.1.0) for HPUX PARISC Oracle Database 10g Release 2 (10.2.0.1.0) for HPUX Itanium Oracle Database 10g Release 2 (10.2.0.2) for HP Tru64 UNIX Oracle Database 10g Release 2 (10.2.0.2) for HP OpenVMS Alpha Oracle Database 10g Release 2 (10.2.0.2) for OpenVMS Itanium Oracle Database 10g Release 2 (10.2.0.2) for Solaris Operating System (x86) Oracle Database 10g Release 2 (10.2.0.1.0) for Solaris Operating System (x8664) Oracle Database 10g Release 2 (10.2.0.1.0) for Solaris Operating System (SPARC)
(64bit) Oracle Database 10g Release 2 (10.2.0.2) for z/Linux Oracle Database 10g Release 2 (10.2.0.2) for z/OS (OS/390) Oracle Database 10g Release 2 (10.2.0.2.20) for Fujitsu Siemens BS2000/OSD
Sistemas Operativos y Arquitecturas Soportadas en Oracle 11g R2
Microsoft Windows (32bit) Microsoft Windows (x64) Linux x86 Linux x8664 Solaris (SPARC) (64bit) Solaris (x8664) HPUX Itanium HPUX PARISC (64bit) AIX (PPC64)
Reseña Histórica de Oracle
1977: Larry Ellison y unos amigos, fundaron Software Development Laboratories.1979: SDL cambia su nombre a "Relational Software, Inc."RSI introdujo su producto Oracle V2 como la primera versión temprana de un sistema de basede datos relacional, esta versión no tenía soporte de transacciones pero implementabafuncionalidades básicas de consultas SQL y JOIN’s. RSI, nunca lanzó la versión 1.1982: RSI, cambia su nombre nuevamente siendo ahora conocida como “Oracle Corporation”para alinearse más estrechamente con su producto estrella, como estrategía de marketing.1983: La compañia lanza Oracle versión 3, el cual fue reescrito usando lenguaje C, y tienefuncionalidades para soportar transacciones como son COMMIT y ROLLBACK.1984: Oracle Corporation lanza la versión 4, el cual tiene soporte de readconsistency.1985: Oracle Corporation lanza la versión 5 con soporte Cliente Servidor.
1986: Oracle version 5.1 es lanzado con soporte para queryes distribuidos.1988: Oracle lanza la versión 6 que viene con soporte de PL/SQL embebido con Oracle Forms versión 3 (La versión 6 de Oracle, no podía almacenar el código de PL/SQL en la base dedatos propiamente dicha). Esta versión también tenía bloqueo de fila y copias de seguridad encaliente.1989: Oracle Corporation entra en el mercado de productos de aplicaciones y desarrolla suERP (Que luego llegará a hacer parte de Oracle EBussiness Suite), basada en la base dedatos relacional Oracle.1990: Se lanza Oracle Applications versión 8.1992: Aparece Oracle versión 7 con soporte de integridad referencial, procedimientosalmacenados y triggers.1997: Oracle Corporation lanza la versión 8, que apoyo el desarrollo orientado a objetos yaplicaciones multimedia.1999: Se lanza la versión Oracle8i dirigido a proporcionar una base de datos interactue mejorcon Internet (La letra i en su nombre viene de “Internet”). Esta versión también incorpora unamáquina virtual de JAVA nativa en la base de datos (Oracle JVM).2000: Oracle EBusiness Suite 11i son pioneros en integrar software enterprise application.2001: Oracle9i se lanza con 400 nuevas características, incluyendo entre ellas la posibilidad deleer y escribir documentos XML. También se provee una opción para Oracle RAC “RealApplication Clusters”2003: Oracle Corporation lanza Oracle Database 10g, el cual soporta expresiones regulares.(la g viene de “Grid”, haciendo incapie en un enfoque de marketing)2005: se lanza el release 2 (Oracle Database 10.2.0.1 10gR2).2006: Oracle Corporation anuncia Unbreakable Linux.2007: Oracle Database 10g release 2 establece un nuevo record mundial TPCH.2007: Oracle Corporation lanza la versión de base de datos 11g para Linux y Windows.2008: Oracle Corporation adquiere BEA Systems.2010: Oracle Corporation adquiere Sun Microsystems.
Para más información, consultar el siguiente enlace.|
http://www.oracle.com/timeline/index.html
Instalación Básica de Una Base de Datos Oracle XE
Se demostrarán dos maneras de instalar la base de datos Oracle XE
1. Instalación mediante el gestor de paquetes aptget de Ubuntu.
1. Editar el fichero sources.list
$ sudo nano /etc/apt/sources.list
2. Ingresar el repositorio para descargar el Oracle XE, adicionando la siguiente linea.
deb http://oss.oracle.com/debian unstable main nonfree
3. Guardar el archivo y salir.
4. Obtener la llave GPG de autorización
$ wget http://oss.oracle.com/el4/RPMGPGKEYoracle O | sudoaptkey add
5. Actualizar la base de datos de paquetes
$ sudo aptget update
6. Luego de actualizados los repositorios, instalar el Oracle XE
$ sudo aptget install oraclexe
Se le solicitará al usuario confirmación de la instalación de paquetes adicionales y la base de datos, se debe indicar la autorización digitando “yes”.
7. Configurar la base de datos luego de la instalación
$ sudo /etc/init.d/oraclexe configure
Configurar la contraseña para los usuarios SYS y SYSTEM Configurar el puerto del listener. Por defecto es el 1521 Configurar el puerto para acceder al servicio de la base de datos via web. Por
defecto es el 8080.
Si desea realizar la desinstalación de la base de datos por el método aptget, puedeusar lo siguiente.
Listar los paquetes instalados (Buscar los que sean de Oracle)
$ dpkg getselections oracle*
ó
$ dpkg l oracle*
Deberia tenerse un paquete con el nombre: oraclexe ó oraclexeuniversal.Tras identificar el paquete, proceder a desinstalarlo digitando un comando tras
otro así:
$ sudo aptget remove oraclexeuniversal
$ sudo aptget purge oraclexeuniversal
$ sudo rm rf /usr/lib/oracle
$ sudo deluser oracle
$ sudo delgroup dba
2. Instalación mediante el gestor de paquetes dpkg de Ubuntu, teniendo el instalador.deb de la base de Datos.
1. Verificar que se tengan los dos instaladores siquientes:
libaio_0.3.1041_i386.deboraclexeuniversal_10.2.0.11.0_i386.deb
2. El paquete libaio_0.3.1041_i386.deb contiene unas librerías dedependencia que serequieren previamente antes de instalar la base de datos, para su instalacióndigitaremos lo siguiente:
$ sudo dpkg i libaio_0.3.1041_i386.deb
3. tras finalizar la instalación de esta libreria, proseguir con el siguiente comando parala instalación de la base de datos.
$ sudo dpkg i oraclexeuniversal_10.2.0.11.0_i386.deb
4. Configurar la base de datos luego de la instalación
$ sudo /etc/init.d/oraclexe configure
Configurar la contraseña para los usuarios SYS y SYSTEM Configurar el puerto del listener. Por defecto es el 1521 Configurar el puerto para acceder al servicio de la base de datos via web. Por
defecto es el 8080
Si desea realizar la desinstalación de la base de datos por el método dpkg, puedeusar lo siguiente.
Listar los paquetes instalados (Buscar los que sean de Oracle)
$ dpkg getselections oracle*
ó
$ dpkg l oracle*
Deberia tenerse un paquete con el nombre: oraclexe ó oraclexeuniversal.Tras identificar el paquete, proceder a desinstalarlo digitando un comando tras
otro así:
$ sudo dpkg remove oraclexeuniversal
$ sudo dpkg purge oraclexeuniversal
$ sudo aptget autoremove
$ sudo rm rf /usr/lib/oracle
$ sudo deluser oracle
$ sudo delgroup dba
Nota: Se recomienda para hacer la desintalación de paquetes usar el método deaptget.
Verificación de la Instalación de la Base de Datos
Ingresar por el browser la siguiente URL:
http://127.0.0.1:8080/apex
Verificar el ingreso a la aplicación con los usuarios SYS y SYSTEM y la contraseña que sedefinió en la instalación.
Nota: Si se desea cambiar el puerto por defecto en el que se ejecuta el apex, es decir el 8080,nos conectamos como usuario SYSTEM y ejecutamos los pasos siguientes::
1. Verificar el puerto en el que se esta ejecutando la aplicación:
SELECTDBMS_XDB.GETHTTPPORT "PuertoHTTP"
FROMDUAL;
2. Ejecutar el siguiente bloque para cambiar el puerto al que queramos:
BEGINDBMS_XDB.SETHTTPPORT('9090');
END;/
Instalación Básica de Una Base de Datos Oracle Enterprise
Prerrequisitos:
La documentación de Oracle dice que el sistema debe tener 512Mb mínimo de RAM y 1 Gb de swap.
Para ver la cantidad de RAM y Swap ejecuta los siguientes comandos:
$ grep MemTotal /proc/meminfo
$ grep SwapTotal /proc/meminfo
Para ver el espacio libre en disco ejecuta:
$ df h
Instalar un servidor ssh en la máquina
$ sudo aptget install ssh
1. Descargar las siguientes y complementos necesarios para la instalación.
$ sudo aptget install unzip buildessential x11utils rpm ksh lsbrpm libaio1
2. Ubuntu 10.4 viene con las librerias libstdc++6 instaladas, sin embargo para Oracle 10gR2 y 11gR2 se requiere libstdc++5, para instalarlas requerimos de seguir los siguientes pasos para una arquitectura de 32 bits.
$ wgethttp://security.ubuntu.com/ubuntu/pool/universe/i/ia32libs/ia32libs_2.7ubuntu6.1_amd64.deb
$ dpkgdeb x ia32libs_2.7ubuntu6.1_amd64.deb ia32libs
$ sudo cp ia32libs/usr/lib32/libstdc++.so.5.0.7 /usr/lib/
$ cd /usr/lib
$ sudo ln s libstdc++.so.5.0.7 libstdc++.so.5
Si la arquitectura es de 64 bits, se deberá usar:
$ wgethttp://mirrors.kernel.org/ubuntu/pool/universe/g/gcc3.3/libstdc++5_3.3.617ubuntu1_amd64.deb
$ dpkgdeb x libstdc++5_3.3.617ubuntu1_amd64.deb ia64libs
$ sudo cp ia64libs/usr/lib/libstdc++.so.5.0.7 /usr/lib64/
$ cd /usr/lib64/
$ sudo ln s libstdc++.so.5.0.7 libstdc++.so.5
3. Ejecutar los siguientes pasos como usuario root. Crear los grupos oinstall y dba
$ sudo su
# addgroup oinstall
# addgroup dba
4. Crear el usuario oracle y asignarlo a los dos grupos creados en el paso 3.
# useradd g oinstall G dba p password d /home/oracle s /bin/bash oracle
# mkdir /home/oracle
# chown R oracle:dba /home/oracle
5. Cambiar el password al usuario oracle creado.
# passwd oracle
6. Crear algunos enlaces simbólicos necesarios en el sistema, y asignación de permisos.
# 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
Creamos el directorio base de oracle (/u01/app/oracle)
# mkdir p /u01/app/oracle
y opcionalmente un directorio de datos para las bases de datos que creemos (/u02/oradata):
# mkdir p /u02/oradata
# chown R oracle:dba /u01 /u02
# chmod R 775 /u01 /u02
7. Crear el archivo .bashrc para el usuario oracle
# su oracle
$ touch .bash_profile
Editar el fichero con:
$ nano .bash_profile
Ahora, adicionar las siguientes líneas a este fichero:
#!/bin/bash
# enable color support of ls and also add handy aliasesif [ x /usr/bin/dircolors ]; then
test r ~/.dircolors && eval "$(dircolors b ~/.dircolors)" || eval "$(dircolors b)"alias ls='ls color=auto'#alias dir='dir color=auto'#alias vdir='vdir color=auto'
alias grep='grep color=auto'alias fgrep='fgrep color=auto'alias egrep='egrep color=auto'
fi
umask 022
ORACLE_BASE=/u01/app/oracleexport ORACLE_BASE
ORACLE_HOME=/u01/app/oracle/product/10.2.0/db_1export ORACLE_HOME
ORACLE_SID=capacitaexport ORACLE_SID
ORACLE_TERM=xtermexport ORACLE_TERM
ORACLE_OWNER=oracleexport ORACLE_OWNER
# TNS_ADMIN=/home/oracle/config/10.2.0 export TNS_ADMIN
NLS_LANG=SPANISH_SPAIN.WE8ISO8859P1export NLS_LANG
#ORA_NLS10=$ORACLE_HOME/db_1/nls/data; export ORA_NLS10
CLASSPATH=$CLASSPATH:$ORACLE_HOME/jdbc/lib/classes12.zipLD_LIBRARY_PATH=$ORACLE_HOME/libexport LD_LIBRARY_PATH
DISABLE_HUGETLBFS=1export DISABLE_HUGETLBFS
TEMP=/tmpexport TEMP
TMPDIR=/tmpexport TMP
PATH=.:$PATH:/u01/app/oracle/product/10.2.0/db_1/bin
export PATH
Salir del usuario oracle y retornar al usuario root, para proseguir con la instalación digitando exit sobre el prompt
$ exit
También se deberan crear los siguientes directorios como sigue:
# mkdir p /home/oracle/config/10.2.0
# mkdir /var/lock/subsys
8. Es necesario también ajustar algunos parámetros del kernel. Para ver la configuraciónactual de nuestro sistema ejecutar los siguientes comandos:
# sysctl a | grep sem
# sysctl a | grep shm
# sysctl a | grep filemax
# sysctl a | grep ip_local_port_range
9. Para actualizar el fichero de configuración se debe proceder a sacar una copiadel fichero así:
# cp /etc/sysctl.conf /etc/sysctl.conf.old
Luego editar el fichero con el comando:
# nano /etc/sysctl.conf
y finalmente, adicionar o reemplazar los parámetros con los siguientes valores:
kernel.shmall = 2097152kernel.shmmax = 2147483648kernel.shmmni = 4096kernel.sem = 250 32000 100 128fs.filemax = 65536net.ipv4.ip_local_port_range = 1024 65000
Al reiniciar se leerá la con figuración del kernel de /etc/sysctl.conf y se aplicaran los cambios. Pero si queremos que los cambios se apliquen inmediatamente ejecutamos la siguiente instrucción:
# sysctl p
10. Verificar los límites de shell, así:
# ulimit a
Por defecto, hay un límite por usuario de 1024 descriptores de fichero, y 2047 procesos, para modificar estos valores, primero sacamos una copia al fichero /etc/security/limits.conf de la siguiente manera:
# cp /etc/security/limits.conf /etc/security/limits.conf.old
Luego Editamos el fichero con la instrucción:
# nano /etc/security/limits.conf
para modificar estos valores así:
* soft nproc 2047* hard nproc 16384* soft nofile 1024* hard nofile 65536
Las dos últimas líneas imponen un límite inicial de 1024, pero permiten que un usuario aumente el límite a 65536 usando el comando ulimit n 65536.Las dos primeras líneas limitan el número de procesos.
11. Se debe modificar el fichero pam_limits.so que es el módulo que procesa la configuración del fichero /etc/security/limits.conf que se cambió en el paso anterior. Primero sacar una copia de seguridad de la siguiente manera:
# cp /etc/pam.d/login /etc/pam.d/login.old
Luego editar el fichero así:
# nano /etc/pam.d/login
buscar en el apartado de /etc/security/limits.conf y verificar si existe la línea
session required pam_limits.so
ó
session required /lib/security/pam_limits.so
de no existir, agregarla.
13. Ahora comenzaremos el proceso de Instalación y deberemos salir del usuario root y continuar con el usuario del SO, para ello digitar la palabra exit sobre la consola así:
# exit
12. Ubicarse en el directorio que contiene el zip de instalación y luego descomprimirlo.
$ unzip oracle_10gr2_linux32.zip
13. Tras el proceso de descompresión, se debió crear una carpeta llamada database, ubicarse allí.
$ cd database
14. En este paso se requiere ejecutar un asistente gráfico para proseguir el proceso de instalación. Sí la instalación se ha ejecutado en una máquina diferente en donde queremos instalar Oracle, podríamos exportar el sistema X remoto a nuestra máquina local, a continuación se detallan estos pasos, y si nos encontramos directamente sobre la maquina de la instalación solo sería ejecutar el entorno gráfico y omitir estos pasos.
En la máquina local o cliente
$ xhost + IP_SERVER_ORACLE
En la máquina remota (Servidor Oracle)
$ export DISPLAY=IP_CLIENTE:0
De nuevo en la máquina local o cliente, ejecutar lo siguiente
$ ssh oracle@IP_SERVER_ORACLE X
ya estando en el servidor Oracle, buscar la carpeta “database” y Ejecutar el shell de instalación así:
$ ./runInstaller ignoreSysPreReqs
Ponemos el flag “ignoreSysPreReqs” porque por defecto se espera instalar en una maquina Red Hat, y fallaria la comprobacion de seguridad al comprobar que nuestro sistema operativo no es ese. con este flag le forzamos a que continue la instalación independientemente del sistema que tengamos. Ahora se visualizaran las pantallas del asistente y las configuraciones apropiadas.
Pantalla de Bienvenida a la instalación de Oracle 10g, puslamos sobre el botón siguiente.
Buscamos el directorio oracle en el /home y digitamos “oraInventory”, luego escogemos en Nombre de grupo “oinstall”luego clic en Siguiente.
Seleccionamos en el tipo de instalación, Enterprise Edition y pulsamos Siguiente.
Se visualiza el nombre de la instalación y su directorio raíz, pulsamos en Siguiente.
Se realizan una serie de chequeos para determinar si se cumplen algunos requisitos, se muestra una advertencia sobre el Sistema Operativo, que no es certificado por Oracle, pero a pesar de ello pulsamos sobre el botón Siguiente.
Se le mostrará una advertencia que algunos requisitos han fallado y que si desea continuar, pulsar sobre Sí.
Seleccionamos Crear Base de Datos y pulsamos sobre el botón Siguiente.
Escogemos que deseamos crear una base de datos de propósito general, y pulsamos sobreel botón Siguiente.
En nombre de la base de datos global, digitamos capacitacion.datacenter.com.coEn el SID, nos quedaron los 8 caracteres del nombre global: capacita.Como Juego de carácteres escogemos: Unicode estándar UTF8 AL32UTF8.Adicionalmente, indicamos que queremos instalar los esquemas de ejemplo.Finalmente, damos clic en Siguiente.
Dejamos para la opción de Gestión de la base de datos, la opción de administración pordefecto y pulsamos sobre el botón Siguiente.
Escogemos como opción de almacenamiento Sistema de Archivos, y escogemos el directorioque previamente se había destinado para ello: /u02/oradata. Luego pulsamos Siguiente.
En la opción de Copias de Seguridad, escogemos que no deseamos realizarlas de maneraautomática y clic en Siguiente.
Escogemos que vamos a manejar una sola contraseña para los usuarios, la ingresamos ydamos clic en Siguiente.
Verificar usuarios SYS, SYSTEM, SYSMAN y DBSNMP
Se presenta un resumen de las configuraciones y productos que van a ser instalados,pulsamos sobre el botón Instalar, para copiar los archivos necesarios al equipo y ejecutar labase de datos
Se presenta un resumen de la instalación, y damos clic en Aceptar.
Se le solicita al usuario conectarse como usuario root y ejecutar dos scripts:
# /home/oracle/oraInventory/orainstRoot.sh
# /u01/app/oracle/product/10.2.0/db_1/root.sh
Configuración de la red de Oracle
Listener de Oracle
TNS Listener es un proceso servidor que provee la conectividad de red con la base de datosOracle. El listener está configurado para escuchar la conexión en un puerto específico en elservidor de base de datos. Cuando una se pide una conexión a la base de datos, el listenerdevuelve la información relativa a la conexión. La información de una conexión para unainstancia de una base de datos provee el nombre de usuario, la contraseña y el SID de la basede datos. Si estos datos no son correctos se devolverá un mensaje de error.
Por defecto el puerto del listener es el 1521 El listener no limita el número de conexiones a la base de datos
Toda la información del listener la contiene un archivo denominado listener.ora($ORACLE_HOME/network/admin. )
El comando para gestionar el listener es lsnrctl. Mediante este comando podemos:
Parar el listener. Ver el estado del listener. Arrancar el listener. Rearrancar el listener.
Archivo TNSNAMES.ora
Archivo ubicado en los clientes,contiene los nombres de servicio de red, asignados adescriptores a través de los cuales se nos permite acceder
Parámetros del archivo:
HOST: Dirección ip del servidor con el cual queremos conectar
PORT: Puerto donde escucha la base de datos
SERVICE_NAME: Nombre del servicio de base de datos al que queremos conectar
DESCRIPTOR DE CONEXION: Nombre o Alias con el que se identifica la conexión.
Podemos comprobar si la conexión es correcta mediante el comando TNSPING
Arranque y parada de la base de Datos
Arrancar base de datos
El arranque de una base de datos ORACLE requiere tres etapas
1. Arrancar la instancia2. Montar la base de datos3. Abrir la base de datos
1. Arrancar la base de datos
En esta parte del arranque se generan los procesos background.
Se crea la SGA. Sus dimensiones se basan en el fichero de inicialización “init.ora”.
SQLPLUS> connect sys as sysdbaconnectedSQLPLUS> startup nomountOracle Instance started
2. Montar la base de datos
En esta parte del proceso de arranque se produce la conexión al/los archivo/s de control.
En este estado se puede:
1. Cambiar el modo de archivado de la B.D.2. Renombrado de archivos de Redo Log o del asociado al tablespace SYSTEM3. Crear, modificar o suprimir nuevos Redo Log o grupos de Redo Log
Partiendo del anterior estado ( nomount ), montamos la base de datos de la siguiente forma:
SQLPLUS> alter database mountdatabase mounted
En caso de que queramos iniciar la base de datos en este estado bastaría con hacer losiguiente:
SQLPLUS> connect sys as sysdbaconnectedSQLPLUS> startup mountOracle Instance startedDatabase mounted
3. Abrir base de datos
En esta parte de proceso abren todos los ficheros asociados a los tablespaces y losficheros de Redo Log.
La B.D. está accesible para todos los usuarios
Si es necesaria una recuperación (por un fallo de luz o CPU), se produce en este momento.
Partiendo del anterio estando ( mount ), abrimos la base de datos de la siguiente forma:
SQLPLUS> alter database opendatabase opened
En caso de que queramos iniciar la base de datos en este estado bastaría con hacer losiguiente:
SQLPLUS> connect sys as sysdbaconnectedSQLPLUS> startupOracle Instance startedDatabase opened
Mas alternativas para el arranque de base de datos
Arranque solo para usuarios con el privilegio RESTRICTED SESSION
SQLPLUS> startup restrict
Arranque forzado
SQLPLUS> startup force
Arranque con un fichero de parámetros distinto al habitual o localizado en una situacióndiferente a donde se encuentra por defecto
SQLPLUS> startup pfile=/oracle/database/init2.ora
Parada base de datos
La parada de una B.D. Oracle se realiza mediante el comando SHUTDOWN desde SQL*DBAdespués de haber establecido una conexión como SYS AS SYSDBA
Existen tres tipos de shutdown
1. shutdown normal2. shutdown immediate3. shutdown abort
1. Shutdown normal
Espera a que los usuarios conectados actualmente finalicen TODAS las operaciones.
Evita nuevas conexiones. Los usuarios que intentan conectarse reciben el mensaje “Shutdownin progress”.
Cierra y desmonta la B.D. Cierra la SGA para los procesos background.
No necesita recuperacion al arrancar la base de datos
SQLPLUS> connect sys as sysdbaconnectedSQLPLUS> shutdown normal
2. Shutdown immediate
Espera a que las transacciones actuales se completen
Evita nuevas transacciones y nuevas conexiones. Los usuarios que intentan conectarse o losque ya están conectados al intentar realizar una nueva transacción reciben el mensaje“Shutdown in progress”.
El proceso PMON finaliza las sesiones no activas y realiza ROLLBACK de aquellastransacciones que no estén validadas.
Cierra y desmonta la B.D. Cierra la SGA para los procesos background.
No necesita recuperacion al arrancar la base de datos
SQLPLUS> connect sys as sysdbaconnectedSQLPLUS> shutdown immediate
3. Shutdown abort
Parada drástica, no espera a que los usuarios conectados actualmente finalicen sustransacciones. El usuario conectado recibe el mensaje “No logged on”.
No se realiza ROLLBACK de las transacciones pendientes.
El proceso PMON finaliza las sesiones no activas y realiza ROLLBACK de aquellastransacciones que no estén validadas.
Si necesita recuperacion al arrancar la base de datos
SQLPLUS> connect sys as sysdbaconnectedSQLPLUS> shutdown abort
Arquitectura de Oracle
Una Base de Datos Oracle es un conjunto de datos almacenados y accesible según el formatode tablas relacionales. Una tabla relacional tiene un nombre y unas columnas, su definición.Los datos están almacenados en las filas. Las tablas pueden estar relacionadas con otras.
Una Base de Datos Oracle está almacenada físicamente en ficheros, y la correspondenciaentre los ficheros y las tablas es posible gracias a las estructuras internas de la BD, quepermiten que diferentes tipos de datos estén almacenados físicamente separados. Estádivisión lógica se hace gracias a los espacios de tablas, tablespaces.
Tablespaces
Un tablespace es una unidad lógica de almacenamiento dentro de una base de datos oracle.Es un puente entre el sistema de ficheros del sistema operativo y la base de datos.
Cada tablespace se compone de, al menos, un datafile y un datafile solo puede pertenecer aun tablespace.
Cada tabla o indice de oracle pertenece a un tablespace, es decir cuando se crea una tabla oindice se crea en un tablespace determinado.
Hay varias razones que justifican este modo de organización de las tablas en espacios detablas:
Un espacio de tablas puede quedarse offline debido a un fallo de disco, permitiendo queel SGBD continúe funcionando con el resto.
Los espacios de tablas pueden estar montados sobre dispositivos ópticos si son desólo lectura.
Permiten distribuir a nivel lógico/físico los distintos objetos de las aplicaciones. Son una unidad lógica de almacenamiento, pueden usarse para aislar completamente
los datos de diferentes aplicaciones. Oracle permite realizar operaciones de backup/recovery a nivel de espacio de tabla
mientras la BD sigue funcionando.
Cuando se crean se les asigna un espacio en disco que Oracle reserva inmediatamente, seutilice o no. Si este espacio inicial se ha quedado pequeño Oracle puede gestionar elcrecimiento dinámico de los ficheros sobre los que se asientan los espacios de tablas. Estoelimina la posibilidad de error en las aplicaciones por fallos de dimensionamiento inicial. Losparámetros de crecimiento del tamaño de los espacios de tablas se especifican en la creaciónde los mismos.
Se pueden ver los espacios de tablas definidos en nuestra BD con el comando SQL siguiente:
SQL> select * from user_tablespace;
Datafiles
Un datafile es la representación física de un tablespace. Son los "ficheros de datos" donde sealmacena la información físicamente. Un datafile puede tener cualquier nombre y extensión(siempre dentro de las limitaciones del sistema operativo), y puede estar localizado encualquier directorio del disco duro, aunque su localización típica suele ser$ORACLE_HOME/Database. Un datafile tiene un tamaño predefinido en su creación (porejemplo 100Mb) y este puede ser alterado en cualquier momento. Cuando creemos un datafile,este ocupará tanto espacio en disco como hayamos indicado en su creación, aunqueinternamente esté vacío. Oracle hace esto para reservar espacio continuo en disco y evitar asíla fragmentación. Conforme se vayan creando objetos en ese tablespace, se irá ocupando elespacio que creó inicialmente.
Un datafile está asociado a un solo tablespace y, a su vez, un tablespace está asociado a unoo varios datafiles. Es decir, la relación lógica entre tablespaces y datafiles es de 1N,maestrodetalle.
Los datafiles tienen una propiedad llamada AUTOEXTEND, que se si está activa, se encargade que el datafile crezca automáticamente (según un tamaño indicado) cada vez que senecesite espacio y no exista. Al igual que los tablespaces, los datafiles también puede estar enlínea o fuera de ella.
Ejemplo de creación y manipulación de tablespaces y Datafiles
Conocer el tablespace por defecto
SQL>select property_value from database_properties where property_name ='DEFAULT_PERMANENT_TABLESPACE';
Ver el tamaño en Megas de los Tablespace
SQL>select tablespace_name, file_name, bytes / 1024 / 1024 from dba_data_files;
Crear un tablespace
SQL> create tablespace ts_prueba_dat datafile'/u02/oradata/capacita/ts_prueba_dat_01.dbf' size 10M;
Aumentar el tamaño de un datafile
SQL>alter database datafile '/u02/oradata/capacita/ts_prueba_dat_01.dbf' resize 20M;
Adicionar un nuevo datafile al tablespace
alter tablespace ts_prueba_dat add datafile '/u02/oradata/capacita/ts_prueba_dat02.dbf' size 10M autoextend on next 1M maxsize 20M;
Con esta instrucción lo que estamos haciendo es añadir un nuevo datafile llamado “/u02/oradata/capacita/ts_prueba_dat02.dbf” a nuestro tablespace “ts_prueba_dat” con 10 Mbytes de tamaño. Además, estamos indicando que queremos que aumente por si mismo cada vez que se llene y que aumente en bloques de 1 Mb cada vez. Finalmente le ponemos un tope al tamaño total que queremos que tenga nuestro datafile con la instrucción maxsize, por lo que una vez que llegue a 20 Mb, si se llena, no volverá a crecer más.Para indicar en cualquier momento que queremos que un datafile no crezca más automáticamente, podemos utilizar:
SQL>alter database datafile nombre_datafile autoextend off;
Y para indicar en cualquier momento que un determinado datafile crezca automáticamente, la instrucción que ejecutaremos será:
SQL>alter database datafile nombre_datafile autoextend on next 1 M maxize 300 M;
Nota: en esta sentencia, se puede indicar que queremos que crezca indefinidamente, sin tomemáximo. Esto lo conseguimos con "maxsize unlimited", pero es muy peligroso porque poralgún problema descontrolado, nos puede crecer tanto que nos quedemos si disco en lamáquina y luego es muy complicado restaurar un tamaño normal.
Cambiar el tablespace por defecto de un usuario
SQL>alter user usuario default tablespace ts_prueba_dat quota unlimited onts_prueba_dat;
Borrar un tablespace
SQL>drop tablespace ts_prueba_dat including contents cascade constraints;
***************************************** Pausa Activa *****************************************
La papelera de Reciclaje en Oracle
Cuando la RecycleBin está activada, las tablas que borremos en realidad no se eliminan.En cambio, cuando se elimina una tabla, Oracle sólo cambia el nombre de la tabla ytodos sus objetos asociados (índices, triggers, segmentos de línea de negocio, etc)a un nombre generado por el sistema que se inicia con BIN$.
Por defecto la papelera de reciclaje viene activada en Oracle, para verificar que esto escorrecto se puede hacer la verificación por el SQLPlus como usuario SYSTEM así:
SQL> show parameter recyclebin
Ejemplo de Uso de la papelera
1. Crear una tabla como sigue:
create table tabla1( version varchar2(10) not null, fecha varchar2(10) default to_char(sysdate , 'dd/mm/yyyy') not null, hora varchar2(8) default to_char(sysdate , 'hh24:mi:ss') not null);
2. Insertar un dato para la verificación.
SQL>insert into tabla1 (version) values ('version 1');
3. Borrar la tabla
SQL> drop table tabla1;
4. Listar las tablas del usuario así:
SQL>select * from user_tables;
ó
SQL>select * from tab;
5. Listar los objetos de la papelera de reciclaje
SQL>select object_name, original_name, type, can_undrop as "UND", can_purge as"PUR", droptime from recyclebin;
6. Recobrar la tabla de la papelera de reciclaje
SQL>flashback table tabla1 to before drop;
7. Listar las tablas del usuario y el contenido de la tabla recuperada
SQL>select * from tab;
SQL>select * from tabla1;
8. Borrar nuevamente la tabla, ejecutando el paso 3.
9. Crear nuevamente la tabla exactamente igual que en el paso 1.
10. realizar el siguiente insert.
SQL>insert into tabla1 (version) values ('version 2');
11. Listar las tablas del usuario y el contenido de tabla1, como en el paso 7.
12. Borrar la tabla nuevamente
SQL> drop table tabla1;
13. Listar los objetos de la papelera de reciclaje.
SQL>select object_name, original_name, type, can_undrop as "UND", can_purge as"PUR", droptime from recyclebin;
14. Recobrar nuevamente la tabla: tabla1
SQL>flashback table tabla1 to before drop;
15. Listar la información de la tabla. ¿Qué versión aparece y porqué?
16. Borrar nuevamente la tabla.
17. Listar nuevamente la papelera de reciclaje y verificar las columnas droptime o base_object, para identificar el primer objeto en ingresar a la papelera.
18 recuperar este objeto mediante la instrucción del paso 14, sustituyendo tabla1 por el valorde la columna object_name entre comillas dobles.
19, Listar el contenido de la tabla.
Ahora bien, si deseamos borrar una tabla omitiendo la papelera de reciclaje, se puede hacercomo sigue:
SQL>drop table tabla1 purge;
Si se desea vaciar la papelera de reciclaje, se puede hacer así:
SQL>purge recyclebin;
Si se desea que las tablas borradas durante la sesión no vayan a la papelera de reciclaje, sepuede desactivar la papelera de la sesión así:
SQL>alter session set recyclebin=on;
Vale la pena aclarar que si antes de realizar esta acción ya habían objetos en la papelera estos permanecerán allí, a no ser que se liberen explícitamente.
Ofuscación de Código (wrap)
Generar el resultado de una consulta en un archivo (spool)
Cargar la información de un archivo de texto a una tabla de la dase de datos (sqlldr)
***************************************** Pausa Activa *****************************************
Oracle : Instancia
La instancia en Oracle describe varios procesos residentes en la memoria del computador(es) y un área de memoria compartida por aquellos procesos. En arquitecturas de bases de datos tales como, Microsoft SQL Server y IBM DB2, la palabra instancia indica una colección de bases de datos que comparten recursos de memoria en común, o sea, la relación entre instancia y bases de datos es 1 a N. Pero la relación entre la instancia de Oracle y la base de datos es 1 a 1 o n a 1. Cuando hay una relación N a 1, la configuración es llamada RAC (Real Application Cluster), donde la base de datos reside en discos compartidos y las instancias en múltiples computadores anexados a la base de datos.La instancia de Oracle es el motor que procesa los requerimientos de datos desde la base de datos. Está compuesta por procesos en primer plano, en segundo plano y un área de memoria compartida (SGA).
Una instancia de Oracle es un conjunto de estructuras de memoria que están asociadas con los archivos de datos(datafiles) en una máquina. Una base de datos (database) es una colección de archivos físicos.
Esquema <> Usuario
Es muy común escuchar que la gente asocie los términos usuario y esquema (user yschema). Esto puede ser cierto en algunos motores de bases de datos pero no en Oracle.Para Oracle, un USER es un nombre de una cuenta que se agrega a una base de datos, y unESQUEMA es el conjunto de objetos que ese USUARIO posee. Si bien es cierto que uno delos pasos cuando uno crea un usuario es la creación del ESQUEMA en el que se almacenaransus objetos, y que el nombre que se le asocia es el mismo que tiene el usuario, es bastantesimple demostrar por que no es lo mismo una cosa que la otra.
Ejemplo: Crear una tabla llamada mi_tabla con una columna llamada usuario de tipo varchar2de 30 caracteres, esta misma tabla se debe crear para dos usuarios, e insertar un dato con elnombre del usuario.
para cambiar el esquema por defecto, se puede usar:
SQL>ALTER SESSION SET CURRENT_SCHEMA=usuario2;
Verificar el estado de las tablas para cada usuario.
Si se desea ver el usuario y esquema actual, se pueden emplear estas dos consultas:
SQL>SELECT USERNAME USUARIO, SCHEMANAME ESQUEMA FROMV$SESSION WHERE SID IN (SELECT SID FROM V$MYSTAT);
ó
SQL>SELECT USER USUARIO, SYS_CONTEXT('USERENV', 'CURRENT_SCHEMA') ESQUEMA FROM DUAL;
Lo más importante a recordar es que el comando alter session set current_schema solamentecambia el ESQUEMA por defecto del USUARIO. No modifica los privilegios que tenemos sobreese ESQUEMA, ni cambian los resultados cuando hacemos una consulta que depende delnombre del usuario, como por ejemplo las consultas sobre las USER_ views.
Que es un perfil
Los perfiles se utilizan para limitar la cantidad de recursos del sistema y de la BD disponiblespara un usuario. Si no se definen perfiles para un usuario se utiliza el perfil por defecto, que especifica recursos ilimitados.
Los recursos que pueden ser limitados via perfil son los siguientes:
COMPOSITE_LIMITSuma del máximo de CPU_PER_SESSION, CONNECT_TIME, LOGICAL_READS_PER_SESSION y PRIVATE_SGA. Si este limite es excedido, Oracle aborta la sesión y regresa un error.
CONNECT_TIMETiempo permitido de conexión por sesión en minutos.
CPU_PER_CALLMáximo tiempo de CPU por llamada en centésimas de segundo.
CPU_PER_SESSIONMáximo tiempo de CPU por sesión en centésimas de segundo.
IDLE_TIMETiempo máximo permitido sin actividad por el usuario antes de ser desconectado. Se expresa en minutos.
LOGICAL_READS_PER_CALLMáximo número de bloques de base de datos leídos por llamada.
LOGICAL_READS_PER_SESSIONMáximo numero de bloques de base de datos leídos por sesión.
PRIVATE_SGAMáxima cantidad de bytes de espacio privado reservado en la SGA. Se puede expresar en el formato enteroK para kilobytes o enteroM para megabytes.
SESSIONS_PER_USERMáximo número de sesiones concurrentes permitidas por usuario.
FAILED_LOGIN_ATTEMPTSNúmero de intentos fallidos de conexión de un usuario, antes de que Oracle ponga la cuenta bloqueada.
PASSWORD_GRACE_TIMENúmero de días de gracia para realizar un cambio de password de nuestra cuenta. Si en el periodo de tiempo delimitado no fue cambiado el password, el password expira.
PASSWORD_LIFE_TIMENúmero de días de vida de un password.
PASSWORD_LOCK_TIMENúmero de días que permanecerá bloqueado un usuario después de rebasar el límite FAILED_LOGIN_ATTEMPTS.
PASSWORD_REUSE_MAXNúmero de veces que un password puede ser reusado.
PASSWORD_REUSE_TIMENúmero de días que tienen que pasar para poder reusar un password.
PASSWORD_VERIFY_FUNCTIONEn este parámetro, se puede especificar un script para validar el password. Por ejemplo, que tenga una determinada cantidad de caracteres, que tenga letras y números, etcétera.
Creación, borrado y alteración de perfiles
Para crear un perfil, se requiere tener el privilegio CREATE PROFILE asignado en el usuarioque lo quiere crear, y se usa el siguiente comando:
create profile nombre_perfil limit nombre_limite_1 [valor entero | unlimited | default ] nombre_limite_2 [valor entero | unlimited | default ] ... nombre_limite_n [valor entero | unlimited | default ];
Por default, cada perfil creado tiene todos los límites posibles del mismo de acuerdo a laversión de la base de datos. Existe un perfil llamado default el cual, regirá a todos los usuariosde la base de datos, mientras no sea creado uno nuevo y asignado a un usuario en especial.En el perfil creado, los límites que no sean asignados con un valor predefinido, tendrán el valordel perfil default de la base de datos, como se ve en el siguiente ejemplo:
Para habilitar el uso de perfiles, se debe digitar la siguiente sentencia como usuarioadministrador:
SQL>alter system set resource_limit=true;
Para activar los perfiles el administrador debe ejecutar la siguiente orden:
Ejemplo de creación de un perfil
SQL>create profile per_prueba limit connect_time 45;
Visualizar los atributos del perfil:
SQL>select * from dba_profiles where profile = 'PER_PRUEBA' order byresource_name;
Ejemplo de modificación de un perfil (Se debe tener privilegio de ALTER PROFILE)
SQL>alter profile per_prueba limit password_life_time 30;
SQL>select * from dba_profiles where profile = 'PER_PRUEBA' order byresource_name;
Nota. Si se desea regresar un valor al default, se tendrá que poner dicho valor en vez de un número propiamente.
Para borrar un perfil, nada más tenemos que aplicar el comando drop como en muchos tipos de objetos en Oracle.
SQL>drop profile per_prueba;
Crear un perfil
SQL>create profile per_prueba limit idle_time 1failed_login_attempts 1sessions_per_user 1;
Consultar el perfil del usuario:
SQL>select username, default_tablespace, temporary_tablespace, profilefrom dba_users where username = 'XXX';
Asignar el nuevo perfil al usuario:
SQL>alter user XXX profile per_prueba;
Verificación de los parametros del perfil.
En general, el perfil por defecto debe ser adecuado para los usuarios normales; los usuarioscon requerimientos especiales deberían tener perfiles especiales.
Privilegios
Es la capacidad de un usuario dentro de la base de datos a realizar determinadas operaciones o acceder a determinados objetos de otros usuarios.
Privilegios sobre los objetos
Nos permite acceder y realizar cambios en los datos de otros usuairo. Ejemplo: El privilegio de consultar la tabla de otro usuario es un privilegio sobre objetos.
GRANT PRIV_OBJETO [, PRIV_OBJETO]… | ALL [PRIVILEGES][(COL [,COL]…)]ON [USUARIO] OBJETOTO USUARIO | ROL | PUBLIC [,USUARIO | ROL | PUBLIC…][WITH GRANT OPTION];
ON = Especifica el objeto sobre el que se dan los privilegios.TO = Identifica a los usuarios o roles a los que se conceden los privilegios.ALL = Concede todos los privilegios sobre el objeto especificado.WITH GRANT OPTION = Permite que el receptor del privilegio o rol se lo asigne a otros usuarios o roles.PUBLIC = Asigna los privilegios a todos los usuarios actuales y futuros: El propósito principal del grupo PUBLIC es garantizar el acceso a determinados objetos a todos los usuarios de la base de datos.
Privilegios de sistema
Dan derecho a ejecutar un tipo de comando SQL o a realIzar alguna acción sobre objetos deun tipo especificado. Por ejemplo, el privilegio para crear TABLESPACES es un privilegio desistema. Formato:
GRANT PRIVILEGIO | ROL [, PRIVILEGIO | ROL, …]TO USUARIO | ROL | PUBLIC [,USUARIO | ROL | PUBLIC][WITH ADMIN OPTION];
WITH ADMIN OPTION = Permite que el receptor del privilegio o rol pueda conceder esosmismos privilegios a otros usuarios o roles.
Retirada de privilegios de objetos a los usuarios
REVOKE PRIV_OBJETO [,PRIV_OBJETO]… | ALL [PRIVILEGES]ON [USUARIO.]OBJETOFROM USUARIO | ROL | PUBLIC [, USUARIO | ROL | PUBLIC]…;
Retirada de privilegios de sistema o roles a los usuarios
REVOKE PRIV_SISTEMA | ROL [,PRIV_SISTEMA | ROL]…FROM USUARIO | ROL | PUBLIC [,USUARIO | ROL | PUBLIC]…;
Cada tipo de objeto tiene su propio conjunto de permisos:
Tablas: select, insert, update, delete, alter, debug, flashback, on commit refresh, query rewrite, references, all
Vistas: select, insert, update, delete, under, references, flashback, debug
Secuencias: alter, select
Paquetes, Procedimientos, Funciones, Clases JAVA: execute, debug
Vistas Materializadas: delete, flashback, insert, select, update
Directorios: read, write
Librerias: execute
Tipos de Datos: execute, debug, under
Operadores: execute
Indextypes: execute
Roles
Conjunto de privilegios agrupados. Formato:
CREATE ROLE NOMBREROL [IFENTIFIED BY CONTRASEÑA];
Nota: Un rol puede decidir el acceso de un usuario a un objeto, pero no puede permitir lacreación de objetos.
Supresión de privilegios en los roles
REVOKE NOMBREPRIVILEGIO ON NOMBRETABLA FROM NOMBREROL;
REVOKE NOMBREPRIVILEGIO FROM NOMBREROL;
Supresión de un rol
DROP ROLE NOMBREROL;
Establecer un rol por defecto
ALTER USER NOMBREUSUARIODEFAULT [ROLE NOMBRE_ROL] | [NONE];
NONE = Hace que el usuario no tenga rol por defecto.
Para la verificación de los roles y privilegios asignados a la sesión actual, se pueden usar lassiguientes consultas:
SQL>SELECT GRANTED_ROLE "Rol", ADMIN_OPTION "Admin" FROMUSER_ROLE_PRIVS;
SQL>SELECT PRIVILEGE "Privilegio", ADMIN_OPTION "Admin" FROMUSER_SYS_PRIVS;
Si se desea hacer esta consulta para otros usuarios, se deberán utilizar la vistadba_role_privs.
Tipos de Objetos en Oracle
TablasSon la unidad básica de almacenamiento de datos en Oracle. Los datos sonalmacenados en filas y columnas. La tabla se define a través de:
Nombre.Conjunto de columnas (nombre y tipo)
SinonimosUn sinónimo es un nombre alternativo que identifica un tabla en la base de datos. Con un sinónimo se pretende normalmente simplificar el nombre original de la tabla, aunque también se suelen utilizar para evitar tener que escribir el nombre del propietario de la tabla.
FuncionesUna función es un conjunto de instrucciones en PL/SQL, que pueden ser llamadosusando el nombre con que se le haya creado. Se diferencian de los procedimientos, enque las funciones retornan un valor al ambiende desde donde fueron llamadas.
ProcedimientosUn procedimiento almacenado es un conjunto de instrucciones en PL/SQL, que pueden ser llamado usando el nombre que se le haya asignado.
PaquetesLos paquetes en Oracle se utilizan para guardar subprogramas y otros objetos de labase de datos. Un paquete consta de los siguientes elementos:
Especificación o cabecera: contiene las declaraciones públicas (es decir, accesiblesdesde cualquier parte de la aplicación) de sus programas, tipos, constantes, variables,cursores, excepciones, etc.
Cuerpo: contiene los detalles de implementación y declaraciones privadas, es decir,accesibles solamente desde los objetos del paquete.
TriggersUn Trigger en PLSQL es un tipo especial de procedimiento almacenado asociado con
una tabla de la base de datos Oracle y que se "dispara" (is triggered) cada vez que seejecuta sobre dicha tabla una sentencia INSERT, una sentencia UPDATE o unasentencia DELETE, es decir, es un procedimiento que permite realizar distintasoperaciones cuando un registro de una tabla Oracle es actualizado o borrado, o cuandose añade un registro nuevo a dicha tabla.
IndicesUn índice es una estructura de datos que permite acceder a diferentes filas de unamisma tabla a través de un campo (o campos clave). Un índice permite un accesomucho más rápido a los datos.
Constraints Secuencias JAVA DBLinks Usuarios Jobs Types Directorios Perfiles Tablespaces Vistas Vistas Materializadas Roles
2. Fundamentos de SQL
Definición
El lenguaje de consulta estructurado o SQL (por sus siglas en inglés structured querylanguage) es un lenguaje declarativo de acceso a bases de datos relacionales que permiteespecificar diversos tipos de operaciones en éstas. Una de sus características es el manejodel álgebra y el cálculo relacional permitiendo efectuar consultas con el fin de recuperar deuna forma sencilla información de interés de una base de datos, así como también hacercambios sobre ella. Es un lenguaje informático de cuarta generación (4GL).
Orígenes y Evolución
Los orígenes del SQL están ligados a los de las bases de datos relacionales. En 1970 E. F.Codd propone el modelo relacional y asociado a éste un sublenguaje de acceso a los datosbasado en el cálculo de predicados. Basándose en estas ideas, los laboratorios de IBM definenel lenguaje SEQUEL (Structured English QUEry Language) que más tarde sería ampliamenteimplementado por el sistema de gestión de bases de datos (SGBD) experimental System R,desarrollado en 1977 también por IBM. Sin embargo, fue Oracle quien lo introdujo por primeravez en 1979 en un programa comercial.
El SEQUEL terminaría siendo el predecesor de SQL, siendo éste una versión evolucionada delprimero. El SQL pasa a ser el lenguaje por excelencia de los diversos sistemas de gestión debases de datos relacionales surgidos en los años siguientes y es por fin estandarizado en
1986 por el ANSI, dando lugar a la primera versión estándar de este lenguaje, el "SQL86" o"SQL1". Al año siguiente este estándar es también adoptado por la ISO.Sin embargo, este primer estándar no cubre todas las necesidades de los desarrolladores eincluye funcionalidades de definición de almacenamiento que se consideraron suprimir. Asíque en 1992 se lanza un nuevo estándar ampliado y revisado del SQL llamado "SQL92" o"SQL2".
En la actualidad el SQL es el estándar de facto de la inmensa mayoría de los SGBDcomerciales. Y, aunque la diversidad de añadidos particulares que incluyen las distintasimplementaciones comerciales del lenguaje es amplia, el soporte al estándar SQL92 esgeneral y muy amplio.
El ANSI SQL sufrió varias revisiones y agregados a lo largo del tiempo:
Año Nombre Alias Comentarios
1986 SQL86 SQL87 Primera publicación hecha por ANSI.Confirmada por ISO en 1987.
1989 SQL89 Revisión menor.
1992 SQL92 SQL2 Revisión mayor.
1999 SQL:1999 SQL2000 Se agregaron expresiones regulares,consultas recursivas (para relacionesjerárquicas), triggers y algunascaracterísticas orientadas a objetos.
2003 SQL:2003 Introduce algunas características de XML,cambios en las funciones, estandarizacióndel objeto sequence y de las columnasautonumericas. (Ver Eisenberg et al.:SQL:2003 Has Been Published.)
2006 SQL:2006 ISO/IEC 907514:2006 Define las manerasen las cuales el SQL se puede utilizarconjuntamente con XML. Define manerasimportar y guardar datos XML en una basede datos SQL, manipulándolos dentro de labase de datos y publicando el XML y losdatos SQL convencionales en forma XML.Además, proporciona facilidades quepermiten a las aplicaciones integrar dentrode su código SQL el uso de XQuery,
lenguaje de consulta XML publicado por elW3C (World Wide Web Consortium) paraacceso concurrente a datos ordinarios SQLy documentos XML.
2008 SQL:2008 Permite el uso de la cláusula ORDER BYfuera de las definiciones de los cursores.Incluye los disparadores del tipo INSTEADOF. Añade la sentencia TRUNCATE. (Ver[1].)
Características Generales
El SQL es un lenguaje de acceso a bases de datos que explota la flexibilidad y potencia de los sistemas relacionales permitiendo gran variedad de operaciones en éstos últimos.
Es un lenguaje declarativo de "alto nivel" o "de no procedimiento", que gracias a su fuerte base teórica y su orientación al manejo de conjuntos de registros, y no a registros individuales, permite una alta productividad en codificación y la orientación a objetos. De esta forma una sola sentencia puede equivaler a uno o más programas que se utilizarían en un lenguaje de bajo nivel orientado a registros.
Optimización
Como ya se dijo arriba, y suele ser común en los lenguajes de acceso a bases de datos de alto nivel, el SQL es un lenguaje declarativo. O sea, que especifica qué es lo que se quiere y no cómo conseguirlo, por lo que una sentencia no establece explícitamente un orden de ejecución.
El orden de ejecución interno de una sentencia puede afectar gravemente a la eficiencia del SGBD, por lo que se hace necesario que éste lleve a cabo una optimización antes de su ejecución. Muchas veces, el uso de índices acelera una instrucción de consulta, pero ralentiza la actualización de los datos. Dependiendo del uso de la aplicación, se priorizará el acceso indexado o una rápida actualización de la información. La optimización difiere sensiblemente en cada motor de base de datos y depende de muchos factores.
Existe una ampliación de SQL conocida como FSQL (Fuzzy SQL, SQL difuso) que permite el acceso a bases de datos difusas, usando la lógica difusa. Este lenguaje ha sido implementado a nivel experimental y está evolucionando rápidamente.
Lenguaje de definición de datos (DDL)
El lenguaje de definición de datos (en inglés Data Definition Language, o DDL), es el que se encarga de la modificación de la estructura de los objetos de la base de datos. Existen cuatro operaciones básicas: CREATE, ALTER, DROP y TRUNCATE.
CREATEEste comando crea un objeto dentro de la base de datos. Puede ser una tabla, vista, índice, trigger, función, procedimiento o cualquier otro objeto que el motor de la base de datos soporte.
ALTEREste comando permite modificar la estructura de un objeto. Se pueden agregar/quitar campos a una tabla, modificar el tipo de un campo, agregar/quitar índices a una tabla, modificar un trigger, etc.
RENAMECambia el nombre a una tabla, vista, secuencia o sinonimo privado.
DROPEste comando elimina un objeto de la base de datos. Puede ser una tabla, vista, índice, trigger, función, procedimiento o cualquier otro objeto que el motor de la base de datos soporte. Se puede combinar con la sentencia ALTER.
TRUNCATEEste comando trunca todo el contenido de una tabla. La ventaja sobre el comando DROP, es que si se quiere borrar todo el contenido de la tabla, es mucho más rápido, especialmente si la tabla es muy grande. La desventaja es que TRUNCATE sólo sirve cuando se quiere eliminar absolutamente todos los registros, ya que no se permite la cláusula WHERE. Si bien, en un principio, esta sentencia parecería ser DML (Lenguaje de Manipulación de Datos), es en realidad una DDL, ya que internamente, el comando TRUNCATE borra la tabla y la vuelve a crear y no ejecuta ninguna transacción.
Lenguaje de manipulación de datos DML(Data Manipulation Languaje)
Un lenguaje de manipulación de datos (Data Manipulation Language, o DML en inglés) es unlenguaje proporcionado por el sistema de gestión de base de datos que permite a los usuariosllevar a cabo las tareas de consulta o manipulación de los datos, organizados por el modelo dedatos adecuado.
El lenguaje de manipulación de datos más popular hoy día es SQL, usado para recuperar ymanipular datos en una base de datos relacional.
INSERTUna sentencia INSERT de SQL agrega uno o más registros a una (y sólo una) tabla en unabase de datos relacional.
UPDATEUna sentencia UPDATE de SQL es utilizada para modificar los valores de un conjunto de registros existentes en una tabla.
MERGElo que permite la sentencia SQL MERGE es, dependiendo de una condición lógica, actualizar registros (UPDATE) cuando la condición se cumple, o insertar registros (INSERT) cuando dicha condición no se cumple, de ahí surge la denominación de UPSERT.
DELETEUna sentencia DELETE de SQL borra uno o más registros existentes en una tabla,
Instrucciones de Transferencia
Administran las modificaciones creadas por las instrucciones DML. Lo forman lasinstrucciones ROLLBACK, COMMIT y SAVEPOINT.
Lenguaje de Control de Datos DCL (Data Control Language)
Administran los derechos y restricciones de los usuarios. Lo forman las instrucciones GRANTy REVOKE.
Tipos de Datos en Oracle
Es importante conocer los tipos de datos disponibles en un Sistema Gestor de Base de Datos (SGBD), de esta forma podremos optimizar al máximo el uso de recursos de las aplicaciones.A continuación se indican los tipos de datos de Oracle y sus características básicas:
TIPO CARACTERISTICAS OBSERVACIONES
CHAR Cadena de caracteres (alfanuméricos) de longitud fija
Entre 1 y 2000 bytes como máximo. Aunque se introduzca un valor más corto que el indicado en el tamaño, se rellenará al tamaño indicado. Es de longitud fija, siempre ocupará lo mismo, independientemente del valor que contenga
VARCHAR2 Cadena de caracteres de longitud variable
Entre 1 y 4000 bytes como máximo. El tamaño del campo dependerá del valor que contenga, es de longitud variable.
VARCHAR Cadena de caracteres de longitud variable
En desuso, se utiliza VARCHAR2 en su lugar
NCHAR Cadena de caracteres de longitud fija que sólo almacena caracteres Unicode
Entre 1 y 2000 bytes como máximo. El juego de caracteres del tipo de datos (datatype) NCHAR sólo puede ser AL16UTF16 ó UTF8. El juego de caracteres se especifica cuando se crea la base de datos Oracle
NVARCHAR2 Cadena de caracteres de longitud variable que sólo almacena caracteres Unicode
Entre 1 y 4000 bytes como máximo. El juego de caracteres del tipo de datos (datatype) NCHAR sólo puede ser AL16UTF16 ó UTF8. El juego de caracteres se especifica cuando se crea la base de datos Oracle
LONG Cadena de caracteres de longitud variable
Como máximo admite hasta 2 GB (2000 MB). Los datos LONG deberán ser convertidos apropiadamente al moverse entre diversos sistemas.Este tipo de datos está obsoleto (en desuso), en su lugar se utilizan los datos de tipo LOB (CLOB,NCLOB). Oracle recomienda que se convierta el tipo de datos LONG a alguno LOB si aún se está utilizando.No se puede utilizar en claúsulas WHERE, GROUP BY, ORDER BY, CONNECT BY ni DISTINCTUna tabla sólo puede contener una columna de tipo LONG.Sólo soporta acceso secuencial.
LONG RAW Almacenan cadenas binarias de ancho variable
Hasta 2 GB.En desuso, se sustituye por los tipos LOB.
RAW Almacenan cadenas binarias de ancho variable
Hasta 32767 bytes.En desuso, se sustituye por los tipos LOB.
LOB (BLOG, CLOB, NCLOB, BFILE)
Permiten almacenar y manipular bloques grandes de datos no estructurados (tales como texto, imágenes, videos, sonidos, etc) en formato binario o del carácter
Admiten hasta 8 terabytes (8000 GB).Una tabla puede contener varias columnas de tipo LOB.Soportan acceso aleatorio.Las tablas con columnas de tipo LOB no pueden ser replicadas.
BLOB Permite almacenar datos binarios no estructurados
Admiten hasta 8 terabytes
CLOB Almacena datos de tipo carácter
Admiten hasta 8 terabytes
NCLOB Almacena datos de tipo carácter
Admiten hasta 8 terabytes.Guarda los datos según el
juego de caracteres Unicode nacional.
BFILE Almacena datos binarios no estructurados en archivos del sistema operativo, fuera de la base de datos. Una columna BFILE almacena un localizador del archivo a uno externo que contiene los datos
Admiten hasta 8 terabytes.El administrador de la base de datos debe asegurarse de que exista el archivo en disco y de que los procesos de Oracle tengan permisos de lectura para el archivo .
ROWID Almacenar la dirección única de cada fila de la tabla de la base de datos
ROWID físico almacena la dirección de fila en las tablas, las tablas en clúster, los índices, excepto en las índices-organizados (IOT).ROWID lógico almacena la dirección de fila en tablas de índice-organizado (IOT).Un ejemplo del valor de un campo ROWID podría ser: "AAAIugAAJAAC4AhAAI". El formato es el siguiente:Para "OOOOOOFFFBBBBBBRRR", donde:OOOOOO: segmento de la base de datos (AAAIug en el ejemplo). Todos los objetos que estén en el mismo esquema y en el mismo segmento tendrán el mismo valor.FFF: el número de fichero del tablespace relativo que contiene la fila (fichero AAJ en el ejemplo).BBBBBB: el bloque de datos que contiene a la fila (bloque AAC4Ah en el ejemplo). El número de bloque es relativo a su fichero de datos, no al tablespace. Por lo tanto, dos filas con números de bloque iguales podrían residir en diferentes datafiles del mismo tablespace.RRR: el número de fila en el bloque (fila AAI en el ejemplo).Este tipo de campo no aparece en los SELECT ni se puede modificar en los UPDATE, ni en los INSERT. Tampoco se puede utilizar en los CREATE. Es un tipo de
datos utilizado exclusivamente por Oracle. Sólo se puede ver su valor utilizando la palabra reservada ROWID, por ejemplo:select rowid, nombre, apellidos from clientesEjemplo 2:SELECT ROWID, SUBSTR(ROWID,15,4)"Fichero", SUBSTR(ROWID,1,8) "Bloque",SUBSTR(ROWID,10,4) "Fila" FROM proveedoresEjemplo 3: una forma de saber en cuántos ficheros de datos está alojada una tabla:SELECTCOUNT(DISTINCT(SUBSTR(ROWID,7,3))) "Numero ficheros " FROM facturacion
UROWID ROWID universal Admite ROWID a tablas que no sean de Oracle, tablas externas. Admite tanto ROWID lógicos como físicos.
NUMBER Almacena números fijos y en punto flotante
Se admiten hasta 38 dígitos de precisión y son portables a cualquier entre los diversos sistemas en que funcione Oracle.Para declarar un tipo de datos NUMBER en un CREATE ó UPDATE es suficiente con:nombre_columna NUMBERopcionalmente se le puede indicar la precisión (número total de dígitos) y la escala (número de dígitos a la derecha de la coma, decimales, los cogerá de la precisión indicada):nombre_columna NUMBER (precision, escala)Si no se indica la precisión se tomará en función del número a guardar, si no se indica la escala se tomará escala cero.Para no indicar la precisión y sí la escala podemos utilizar:nombre_columna NUMBER (*, escala)Para introducir números que no estén el el formato estándar
de Oracle se puede utilizar la función TO_NUMBER.
FLOAT Almacena tipos de datos numéricos en punto flotante
Es un tipo NUMBER que sólo almacena números en punto flotante
DATE Almacena un punto en el tiempo (fecha y hora)
El tipo de datos DATE almacena el año (incluyendo el siglo), el mes, el día, las horas, los minutos y los segundos (después de medianoche).Oracle utiliza su propio formato interno para almacenar fechas.Los tipos de datos DATE se almacenan en campos de longitud fija de siete octetos cada uno, correspondiendo al siglo, año, mes, día, hora, minuto, y al segundo.Para entrada/salida de fechas, Oracle utiliza por defecto el formato DD-MMM-AA. Para cambiar este formato de fecha por defecto se utiliza el parámetro NLS_DATE_FORMAT.Para insertar fechas que no estén en el mismo formato de fecha estándar de Oracle, se puede utilizar la función TO_DATE con una máscara del formato: TO_DATE (el “13 de noviembre de 1992”, “DD del MES, YYYY”)
TIMESTAMP Almacena datos de tipo hora, fraccionando los segundos
TIMESTAMP WITH TIME ZONE Almacena datos de tipo hora incluyendo la zona horaria (explícita), fraccionando los segundos
TIMESTAMP WITH LOCAL TIME ZONE
Almacena datos de tipo hora incluyendo la zona horaria local (relativa), franccionando los segundos
Cuando se usa un SELECT para mostrar los datos de este tipo, el valor de la hora será ajustado a la zona horaria de la sesión actual
XMLType Tipo de datos abstracto. En realidad se trata de un CLOB.
Se asocia a un esquema XML para la definición de su estructura.
De los tipos anteriores, los comunmente utilizados son: VARCHAR2 (cadenas de texto no muy grandes), DATE (fechas, horas), NUMBER (números), BLOB (ficheros de tipo word, excel, access, video, sonido, imágenes, etc) y CLOB (cadenas de texto muy grandes).
Actualmente el tipo de dato VARCHAR es sinonimo de VARCHAR2. Sin embargo Oracle no recomienda utilizar el tipo VARCHAR. En el futuro, Oracle redefinirá al tipo de dato VARCHAR como un tipo de datos para cadenas de caracteres de longitud variable con semantica de comparacion diferente a la del VARCHAR2.
Operadores de Comparación
Operador Operación Ejemplo
= Igualdad select * from emp where cod_dep = 100;
!=, <>, ^= Desigualdad select * from emp where cod_dep != 100;
< Menor que select * from emp where cod_dep < 200;
> Mayor que select * from emp where cod_dep > 200;
<= Menor o igual que select * from emp where cod_dep <= 200;
>= Mayor o igual que select * from emp where cod_dep >= 200;
in Igual a cualquiera de los miembros entre paréntesis
select * from emp where cod_dep in (100, 300);
not in Distinto a cualquiera de los miembros entre paréntesis
select * from emp where cod_dep not in (200);
between Contenido en el rango select * from emp where cod_emp between 100 and 199;
not between Fuera del rango select * from emp where cod_emp not between 100 and 199;
like '_abc%' Contiene la cadena 'abc' a partir del segundo carácter y luego cualquier cadena de caracteres
select * from emp where nombre like 'Ma%';
Operadores de Aritméticos
Operador Operación Ejemplo
+ Suma select nombre, salario+comision from emp where oficio='VENDEDOR';
- Resta select nombre from emp where sysdate-fecha_alta > 365;
* Producto select nombre, salario*12 from emp;
/ División select nombre, salario/31 from emp;
Operadores de Cadenas de Caracteres
Operador Operación Ejemplo
|| Concatenación select nombre||oficio from emp;
Oracle Built in Functions
Existen en SQL muchas funciones que pueden complementar el manejo de los datos en las consultas. Se utilizan dentro de las expresiones y actuan con los valores de las columnas, variables o constantes.
Se pueden incluir en las clásulas SELECT, WHERE y ORDER BY.
Pueden anidarse funciones dentro de funciones. Y existe una gran variedad de funciones para cada tipo de datos:
aritméticas,de cadenas de caracteres,de manejo de fechas,de conversión,otras,de grupo.
Funciones Aritméticas
Función Cometido Ejemplo Resultado
ABS(n) Calcula el valor absoluto de n.
select abs(-15) from dual;
15
CEIL(n) Calcula el valor entero inmediatamentesuperior o igual a n.
select ceil(15.7) from dual;
16
FLOOR(n) Calcula el valor entero inmediatamanteinferior o igual a n.
select floor(15.7) from dual;
15
MOD(m,n) Calcula el resto select mod(11,4) from 3
resultante de dividir m entre n.
dual;
POWER(m,n) Calcula la potencia n-esima de m.
select power(3,2) from dual;
9
ROUND(m,n) Calcula el redondeo de m a n decimales. Si n<0 el redondeo se efectua a por la izquierda del punto decimal.
selectround(123.456,1) from dual;
123.5
SQRT(n) Calcula la raíz cuadrada de n.
select sqrt(4) from dual;
2
TRUNC(m,n) Calcula m truncado a n decimales (n puede ser negativo).
selecttrunc(123.456,1) from dual;
123.4
SIGN(n) Calcula el signo de n, devolviendo -1 si n<0, 0 si n=0 y 1 si n>0.
select sign(-12) from dual;
-1
Funciones de Cadenas de Caracteres
Función Cometido Ejemplo Resultado
CHR(n) Devuelve el carácter cuyo valor codificado es n.
select chr(65) from dual;
A
ASCII(cad) Devuelve el valor ascii de cad.
select ascii('A') from dual;
65
CONCAT(cad1,cad2) Devuelve cad1 concatenada con cad2. Esta función es esquivalente al operador ||.
selectconcat(concat(nombre,' es '),oficio) from emp;
Cano es Presidente, etc.
LOWER(cad) Devuelve la cadena cad con todas sus letras convertidas a minúsculas.
selectlower('MinUsCulAs')from dual;
minusculas
UPPER(cad) Devuelve la cadena cad con todas sus letras convertidas a mayúsculas.
selectupper('maYuSCulAs')from dual;
MAYUSCULAS
INITCAP(cad) Devuelve cad con el primer caracter en mayúsculas.
select initcap('isabel') from dual;
Isabel
LPAD(cad1,n,cad2) Devuelve cad1 con select lpad('P',5,'*') ****P
longitud n, y ajustada a la derecha, rellenando por la izquierda con cad2.
from dual;
RPAD(cad1,n,cad2) Devuelve cad1 con longitud n, y ajustada a la izquierda, rellenando por la derecha con cad2.
select rpad('P',5,'*') from dual;
P****
REPLACE(cad,ant,nue) Devuelve cad en la que cada ocurrencia de la cadena ant ha sido sustituida por la cadena nue.
selectreplace('digo','i','ie')from dual;
diego
SUBSTR(cad,m,n) Devuelve la sudcadena de cad compuesta por n caracteres a partir de la posicion m.
selectsubstr('ABCDEFG',3,2)from dual;
CD
LENGTH(cad) Devuelve la longitud de cad.
selectlength('cadena') from dual;
6
Funciones de Manejo de Fechas
Función Cometido Ejemplo Resultado
SYSDATE Devuelve la fecha y hora actuales.
select sysdate from dual;
14-MAR-97
ADD_MONTHS(d,n) Devuelve la fecha d incrementada en n meses.
selectadd_months(sysdate,4) from dual;
14-JUL-97
LAST_DAY(d) Devuelve la fecha del último día del mes de d.
selectlast_day(sysdate)from dual;
31-MAR-97
MONTHS_BETWEEN(d1, d2)
Devuelve la diferencia en meses entre las fechas d1 y d2.
selectmonths_between(sysdate,'01-JAN-97') from dual;
2.43409424
NEXT_DAY(d,cad) Devuelve la fecha del primer día de la semana cad después de la fecha d.
selectnext_day(sysdate,'sunday') from dual;
16-MAR-97
Funciones de Conversión de Tipos
Función Cometido Ejemplo Resultado
TO_NUMBER(cad,fmto)
Convierte la cadena cad a un número, opcionalmente de acuerdo con el formato fmto.
selectto_number('12345')from dual;
124345
TO_CHAR(d, fmto) Convierte la fecha d a una cadena de caracteres,opcionalmente de acuerdo con el formato fmto.
selectto_char(sysdate) from dual;
'14-MAR-97'
TO_DATE(cad,fmto) Convierte la cadena cad de tipo varchar2 a fecha, opcionalmente de acuerdo con el formato fmto.
selectto_date('1-JAN-97')from dual;
01-JAN-97
Con las fechas pueden utilizarse varios formatos. Estos formatos permiten modificar la presentación de una fecha. En la siguiente tabla se presentan algunos formatos de fecha y el resultado que generan.Máscaras de Formato Numéricas
Formato Cometido Ejemplo Resultado
cc ó scc Valor del siglo. selectto_char(sysdate,'cc')from dual;
20
y,yyy ó sy,yyy Año con coma, con o sin signo.
selectto_char(sysdate,'y,yyy') from dual;
1,997
yyyy ó yyy ó yy ó y Año sin signo con cuatro, tres, dos o un dígitos.
selectto_char(sysdate,'yyyy') from dual;
1997
q Trimestre. selectto_char(sysdate,'q')from dual;
1
ww ó w Número de la semana del año o del mes.
selectto_char(sysdate,'ww')from dual;
11
mm Número del mes. selectto_char(sysdate,'mm')from dual;
03
ddd ó dd ó d Número del día del año, del mes o de la semana.
selectto_char(sysdate,'ddd')from dual;
073
hh ó hh12 ó hh24 La hora en formato select 12
12h. o 24h. to_char(sysdate,'hh')from dual;
mi Los minutos de la hora.
selectto_char(sysdate,'mi')from dual;
15
ss ó sssss Los segundos dentro del minuto, o desde las 0 horas.
selectto_char(sysdate,'sssss') from dual;
44159
Máscaras de Formato de Caracteres
Formato Cometido Ejemplo Resultado
syear ó year Año en Inglés selectto_char(sysdate,'syear) from dual;
nineteen ninety-seven
month o mon Nombre del mes o su abreviatura de tres letras.
selectto_char(sysdate,'month') from dual;
march
day ó dy Nombre del día de la semana o su abreviatura de tres letras.
selectto_char(sysdate,'day')from dual;
friday
a.m. ó p.m. El espacio del día. selectto_char(sysdate,'a.m.') from dual;
p.m.
b.c. ó a.d. Indicador del año respecto al del nacimiento de Cristo.
selectto_char(sysdate,'b.c.') from dual;
a.d.
Otras Funciones
Función Cometido Ejemplo Resultado
DECODE(var, val1, cod1, val2, cod2, ..., defecto)
Convierte el valor de var, de acuerdo con la codificación.
select decode(oficio, 'Presidente', 'P', 'Director', 'D', 'X') from emp;
P, D, X, ...
GREATEST(exp1,exp2, ...)
Devuelve el mayor valor de una lista.
sin ejemplo. sin ejemplo.
LEAST(cad,fmto) Devuelve el menor valor de una lista.
sin ejemplo. sin ejemplo.
NVL(val, exp) Devuelve la expresión exp si val es NULL, y val si en otro caso.
selectsalario+nvl(comision,0) from emp;
450000, 350000, ...
Clausula Group by
La cláusula Group By sirve para calcular propiedades de uno o más conjuntos de filas. Si se selecciona más de un conjunto de filas, Group By controla que las filas de la tabla original sean agrupadas en un temporal.
Los datos seleccionados en la sentencia "Select" que lleva el "Group By" deben ser: Una constante. Una función de grupo (SUM, COUNT, AVG…) Una columna expresada en el Group By.
Clausula Having
La cláusula Having se emplea para controlar cual de los conjuntos de filas se visualiza. Se evalúa sobre la tabla que devuelve el Group By. No puede existir sin Group By.
Having es similar al Where, pero trabajo con grupos de filas; pregunta por una característica de grupo, es decir, pregunta por los resultados de las funciones de grupo, lo cual Where no pude hacer.
Funciones de Grupo
Oracle dispone de funciones que nos permiten contar registros, calcular sumas, promedios, obtener valores máximos y mínimos. Las funciones de grupo operan sobre un conjunto de valores (registros) y retornan un solo valor.
Características:
Se pueden usar en una instrucción "select" y combinarlas con la cláusula "group by" Todas estas funciones retornan "null" si ningún registro cumple con la condicion del "where"
(excepto "count" que en tal caso retorna cero). El tipo de dato del campo determina las funciones que se pueden emplear con ellas.
Las relaciones entre las funciones de grupo y los tipos de datos es la siguiente:
count: se puede emplear con cualquier tipo de dato. min y max: con cualquier tipo de dato. sum y avg: sólo en campos de tipo numérico.
Tratamiento de los valores nulos:
Si realiza una consulta con la función "count" incluyendo entre paréntesis un campo y la tabla contiene 18 registros, 2 de los cuales contienen valor nulo, el resultado devuelve un total de 16 filas porque no considera aquellos con valor nulo.
Todas las funciones de grupo, excepto "count(*)", excluye los valores nulos de los campos;
"count(*)" cuenta todos los registros, incluidos los que contienen "null".
Las funciones de grupo que se pueden utilizar son las siguientes.
Función Cometido Ejemplo
COUNT(col) Cuenta el número de filas agrupadas.
select count(nombre),oficio from emp group by oficio;
AVG(col) Calcula el valor medio de todos los valores de la columna col.
select avg(salario),oficio from emp group by oficio;
MAX(col) Calcula el valor máximo de todos los valores de la columna col.
select max(salario),oficio from emp group by oficio;
MIN(col) Calcula el valor mínimo de todos los valores de la columna col.
select min(salario),oficio from emp group by oficio;
SUM(col) Calcula la suma de los valores de la columna col.
select sum(salario), oficio from emp group by oficio;
STDDEV(col) Calcula la desviación típica de los valores de la columna col sin tener en cuenta los valores nulos.
select stddev(salario), oficio from emp group by oficio;
VARIANCE(col) Calcula la varianza de los valores de la columna col sin tener en cuenta los valores nulos.
select variance(salario), oficio from emp group by oficio;
Hay que tener en cuenta que los valores nulos no participan en el cálculo de las funciones de conjuntos. Estas funciones se pueden utilizar con las cláusulas DISTINCT y ALL. También se pueden utilizar aunque no realicemos agrupación alguna en la consulta, considerando a toda la tabla como un grupo.
Operaciones con Conjuntos
Permite combinar los resultados de varios "Select" para obtener un único resultado.
UNION: Combina los resultados de dos consultas. Las filas duplicadas que aparecen se reducen a una fila única.UNION ALL: Como la anterior pero aparecerán nombres duplicados.INTERSECT: Devuelve las filas que son iguales en ambas consultas. Todas las filas duplicadas serán eliminadas.MINUS: Devuelve aquellas filas que están en la primera "Select" y no están en la segunda "Select". Las filas duplicadas del primer conjunto se reducirán a una fila única antes de que empiece la comparación con el otro conjunto.
Reglas para la utilización de operadores de conjunto:
Las columnas de las dos consultas se relacionan en orden, de izquierda a derecha. Los nombres de columna de la primera sentencia "Select" no tiene porque ser los mismos que
los nombres de la segunda. Los "Select" necesitan tener el mismo numero de columnas. Los tipos de datos deben coincidir, aunque la longitud no tiene que ser la misma.
Otras características adicionales en los operadores de conjunto
Los resultados se ordenan ascendentemente por defecto según las columnas de la primer sentencia SELECT, excepto en UNION ALL
La cláusula ORDER BY Puede aparecer sólo una vez al final de la sentencia Puede aceptar el nombre de la columna o el alias de la primer sentencia SELECT o la notación
de posición Los operadores de conjuntos pueden ser usados en subconsultas Cuando se usa un operador de conjuntos en la cláusula WHERE, debe existir coincidencia
entre las columnas de la condición y las del resultado del operador de conjunto
Combinaciones de Tabla (Joins)
La sentencia join en SQL permite combinar registros de dos o más tablas en una base de datos relacional. En el Lenguaje de Consultas Estructurado (SQL), hay tres tipo de JOIN: interno, externo, y cruzado.
En casos especiales una tabla puede unirse a sí misma, produciendo una autocombinación, SELFJOIN.
Matemáticamente, JOIN es composición relacional, la operación fundamental en el álgebra relacional, y generalizando es una función de composición.
Tablas de ejemplo
Todas las explicaciones que están a continuación utilizan las siguientes dos tablas para ilustrarel efecto de diferentes clases de uniones JOIN.
Apellido IDDepartamento
Andrade 31
Jordán 33
Steinberg 33
Róbinson 34
Zolano 34
Gaspar 36
NombreDepartamento IDDepartamento
Ventas 31
Ingeniería 33
Producción 34
Mercadeo 35
La tabla Empleado contiene a los empleados con el número del departamento al que pertenecen; mientras que la tabla Departamento, contiene el nombre de los departamentos de la empresa, se puede notar que existe un empleado que tiene asignado un número de departamento que no se encuentra en la tabla Departamento (Gaspar), igualmente, en la tabla Departamento existe un departamento al cual no pertenece empleado alguno (Mercadeo). Esto servirá para presentar algunos ejemplos más adelante.
Combinación interna (INNER JOIN)
Con esta operación se calcula el producto cruzado de todos los registros; así cada registro en la tabla A es combinado con cada registro de la tabla B; pero sólo permanecen aquellos registros en la tabla combinada que satisfacen las condiciones que se especifiquen.
Este es el tipo de JOIN más utilizado por lo que es considerado el tipo de combinación predeterminado.
SQL:2003 especifica dos formas diferentes para expresar estas combinaciones. La primera, conocida como explícita usa la palabra JOIN, mientras que la segunda es implícita y usa ',' para separar las tablas a combinar en la sentencia FROM de la declaración SELECT. Entonces siempre se genera el producto cruzado del cual se seleccionan las combinaciones que cumplan lo que indica la sentencia WHERE.
Es necesario tener especial cuidado cuando se combinan columnas con valores nulos NULL ya que el valor nulo no se combina con otro valor o con otro nulo, excepto cuando se le agregan predicados tales como IS NULL o IS NOT NULL.
Como ejemplo, la siguiente consulta toma todos los registros de la tabla Empleado y encuentra todas las combinaciones en la tabla Departamento. La sentencia JOIN compara los valores en la columna IDDepartamento en ambas tablas. Cuando no existe esta correspondencia entre algunas combinaciones, éstas no se muestran; es decir que si el número de departamento de un empleado no coincide con los números de departamento de la tabla Departamento, no se mostrará el empleado con su respectivo departamento en la tabla resultante.
Las dos consultas siguientes son similares, y se realizan de manera explicita (A) e implícita (B).
A. Ejemplo de la sentencia INNER JOIN explícita:
SELECT *FROM empleado
INNER JOIN departamentoON empleado.IDdepartamento = departamento.IDdepartamento
B. Ejemplo de la sentencia INNER JOIN implícita:
SELECT *FROM empleado, departamentoWHERE empleado.IDdepartamento = departamento.IDDepartamento
Resultados:
Empleado.Apellido Empleado.IDdepartamento
departamento.NombreDepartamen
to
departamento.IDDepartamento
Zolano 34 Producción 34
Jordán 33 Ingeniería 33
Róbinson 34 Producción 34
Steinberg 33 Ingeniería 33
Andrade 31 Ventas 31
El empleado Gaspar y el departamento de Mercadeo no son presentados en los resultados ya que ninguno de éstos tiene registros correspondientes en la otra tabla. No existe un departamento con número 36 ni existe un empleado con número de departamento 35.A la combinación que utiliza comparaciones dentro del predicado JOIN se le llama thetajoin.
C. Ejemplo de combinación tipo theta:
SELECT *FROM empleadoINNER JOIN departamentoON empleado.IDDepartamento < departamento.IDDepartamento
Las operaciones INNER JOIN puede ser clasificadas como de equivalencia, naturales, y cruzadas.
De equivalencia (equijoin)Es una especie de thetajoin que usa comparaciones de igualdad en el predicado JOIN. Cuando se usan operadores, tales como < o > no se puede clasificar en este rango.
D. Ejemplo de combinación de equivalencia:
SELECT *
FROM empleadoINNER JOIN departamentoON empleado.IDDepartamento = departamento.IDDepartamento
La tabla resultante presenta dos columnas llamadas IDDepartamento, una proveniente de la tabla Empleado y otra de la tabla Departamento.SQL:2003 no tiene una sintaxis específica para esta clase de combinaciones.
Natural (Natural join)Es una especialización de la combinación de equivalencia, anteriormente mencionada. En este casose comparan todas las columnas que tengan el mismo nombre en ambas tablas. La tabla resultantecontiene sólo una columna por cada par de columnas con el mismo nombre.
E. Ejemplo de combinación natural:
SELECT *FROM empleado NATURAL JOIN departamento
El resultado es un poco diferente al del ejemplo D, ya que esta vez la columna IDDepartamento se muestra sola una vez en la tabla resultante.
Empleado.Apellido IDDepartamento Departamento.NombreDepartamento
Zolano 34 Producción
Jordán 33 Ingeniería
Róbinson 34 Producción
Steinberg 33 Ingeniería
Andrade 31 Ventas
El uso de esta sentencia NATURAL puede producir resultados ambiguos y generar problemas si la base de datos cambia, porque al añadir, quitar, o renombrar las columnas, puede perder el sentido la sentencia; por esta razón es preferible expresar el predicado usando las otras expresiones nombradas anteriormente (ejemplos A y B).
Cruzada (Cross join)
Presenta el producto cartesiano de todos los registros de las dos tablas.El código SQL para realizar este producto cartesiano enuncia las tablas que serán combinadas, pero no incluye algún predicado que filtre el resultado.
F. Ejemplo de combinación cruzada explícita:
SELECT *
FROM empleado CROSS JOIN departamento
G. Ejemplo de combinación cruzada implícita:SELECT *FROM empleado, departamento;
Empleado.Apellido
Empleado.IDDepartamento
Departamento.NombreDepartam
ento
Departamento.IDDepartamento
Andrade 31 Ventas 31
Jordán 33 Ventas 31
Steinberg 33 Ventas 31
Zolano 34 Ventas 31
Róbinson 34 Ventas 31
Gaspar 36 Ventas 31
Andrade 31 Ingeniería 33
Jordán 33 Ingeniería 33
Steinberg 33 Ingeniería 33
Solano 34 Ingeniería 33
Róbinson 34 Ingeniería 33
Gaspar 36 Ingeniería 33
Andrade 31 Producción 34
Jordán 33 Producción 34
Steinberg 33 Producción 34
Solano 34 Producción 34
Róbinson 34 Producción 34
Gaspar 36 Producción 34
Andrade 31 Mercadeo 35
Jordán 33 Mercadeo 35
Steinberg 33 Mercadeo 35
Solano 34 Mercadeo 35
Róbinson 34 Mercadeo 35
Gaspar 36 Mercadeo 35
Esta clase de combinaciones son usadas pocas veces, generalmente se les agregan condiciones de filtrado con la sentencia WHERE para hallar resultados específicos.
Combinación externa (OUTER JOIN)Mediante esta operación no se requiere que cada registro en las tablas a tratar tenga un registro equivalente en la otra tabla. El registro es mantenido en la tabla combinada si no existe otro registro que le corresponda.
En SQL:2003 no existe una notación implícita para las combinaciones externas.Este tipo de operación se subdivide dependiendo de la tabla a la cual se le admitirán los registros que no tienen correspondencia, ya sean de tabla izquierda, de tabla derecha, o combinación completa.
de tabla izquierda (LEFT OUTER JOIN o LEFT JOIN)El resultado de esta operación siempre contiene todos los registros de la tabla de la izquierda (la primera tabla que se menciona en la consulta), aun cuando no exista un registro correspondiente en la tabla de la derecha, para uno de la izquierda.
La sentencia LEFT OUTER JOIN retorna la pareja de todos los valores de la tabla izquierda con los valores de la tabla de la derecha correspondientes, o retorna un valor nulo NULL en caso de no correspondencia.A diferencia del resultado presentado en los ejemplos A y B (de combinación interna) donde no se mostraba el empleado cuyo departamento no existía; en el siguiente ejemplo se presentarán los empleados con su respectivo departamento, e inclusive se presentará el empleado, cuyo departamento no existe.
H. Ejemplo de tabla izquierda para la combinación externa:
SELECT distinct *FROM empleadoLEFT OUTER JOIN departamentoON empleado.IDDepartamento = departamento.IDDepartamento
Empleado.Apellido
Empleado.IDDepartamento
Departamento.NombreDepartam
ento
Departamento.IDDepartamento
Jordán 33 Ingeniería 33
Andrade 31 Ventas 31
Róbinson 34 Producción 34
Zolano 34 Producción 34
Gaspar 36 NULL NULL
Steinberg 33 Ingeniería 33
de tabla derecha (RIGHT OUTER JOIN o RIGHT JOIN)Esta operación es inversa a la anterior; el resultado de esta operación siempre contiene todos los registros de la tabla de la derecha (la segunda tabla que se menciona en la consulta), aun cuando no exista un registro correspondiente en la tabla de la izquierda, para uno de la derecha.
La sentencia RIGHT OUTER JOIN retorna la pareja de todos los valores de la tabla derechacon los valores de la tabla de la izquierda correspondientes, o retorna un valor nulo NULL encaso de no correspondencia.
I. Ejemplo de tabla derecha para la combinación externa:
SELECT *FROM empleadoRIGHT OUTER JOIN departamentoON empleado.IDDepartamento = departamento.IDDepartamento
Empleado.Apellido
Empleado.IDDepartamento
Departamento.NombreDepartam
ento
Departamento.IDDepartamento
Zolano 34 Producción 34
Jordán 33 Ingeniería 33
Róbinson 34 Producción 34
Steinberg 33 Ingeniería 33
Andrade 31 Ventas 31
NULL NULL Mercadeo 35
En este caso el área de Mercadeo fue presentada en los resultados, aunque aún no hay
empleados registrados en dicha área.
combinación completa (FULL OUTER JOIN)Esta operación presenta los resultados de tabla izquierda y tabla derecha aunque no tengan correspondencia en la otra tabla. La tabla combinada contendrá, entonces, todos los registros de ambas tablas y presentará valores nulos NULLs para registros sin pareja.J. Ejemplo de combinación externa completa:
SELECT *FROM empleadoFULL OUTER JOIN departamentoON empleado.IDDepartamento = departamento.IDDepartamento
Empleado.Apellido
Empleado.IDDepartamento
Departamento.NombreDepartam
ento
Departamento.IDDepartamento
Zolano 34 Producción 34
Jordán 33 Ingeniería 33
Róbinson 34 Producción 34
Gaspar 36 NULL NULL
Steinberg 33 Ingeniería 33
Andrade 31 Ventas 31
NULL NULL Mercadeo 35
Como se puede notar, en este caso se encuentra el empleado Gaspar con valor nulo en su área correspondiente, y se muestra además el departamento de Mercadeo con valor nulo en los empleados de esa área.
Algunos sistemas de bases de datos no soportan esta funcionalidad, pero esta puede ser emulada a través de las combinaciones de tabla izquierda, tabla derecha y de la sentencia de unión.
K. El mismo ejemplo puede expresarse así:
SELECT *FROM empleadoLEFT JOIN departamentoON empleado.IDDepartamento = departamento.IDDepartamentoUNION
SELECT *FROM empleadoRIGHT JOIN departamentoON empleado.IDDepartamento = departamento.IDDepartamentoWHERE empleado.IDDepartamento IS NULL
El catálogo de Oracle
El catálogo de oracle es un conjunto de tablas y vistas que contienen la definición de laestructura lógica y física de la base de datos.
Esto incluye los objetos existentes, la situación de los datafiles, la configuración de losusuarios, etc.
Los nombres de las tablas de catálogo sigue la siguiente nomenclatura de prefijos:
DBA_ Objetos con información de administrador. Sólo accesibles por usuarios DBA.USER_ Objetos con información del usuario con el que estamos conectado. Proporcionan menos información que los objetos DBA_ALL_ Objetos con información de todos los objetos en base de datos.V_$ ó V$ Tablas virtuales
Existe una tabla de catálogo para cada tipo de objeto posible (en plural).
TABLES, VIEWS, SEQUENCES, TABLESPACES...
Sabiendo esto podemos ver algunos ejemplos:
DBA_TABLES Información para administradores de las tablas en base de datos.USER_VIEWS Información de las vistas creadas por el usuario desde el que accedemos.ALL_SEQUENCES Información de todas las secuencias existentes en base de datos.DBA_TABLESPACES Información de administración sobre los tablespaces.USER_TAB_COLUMNS Todas las columnas de tabla en el usuario activo.
Los objetos de catálogo pueden estar relacionados entre ellos. Por ejemplo, el objeto ALL_TABLES guarda una relación 1N con el objeto ALL_TAB_COLUMNS: Una tabla tiene N columnas.Si se quiere que todos los usuarios tengan algún tipo de acceso a un objeto, podemos dar ese privilegio al rol PUBLIC.
El catálogo público son aquellas tablas (USER_ y ALL_) que son accesibles por todos los usuarios. Normalmente dan información sobre los objetos creados en la base de datos.
El catálogo de sistema (DBA_ y V_$) es accesible sólo desde usuarios DBA y contiene tanto información de objetos en base de datos, como información específica de la base de datos en sí (versión, parámetros, procesos ejecutándose...)
Ciertos datos del catálogo de Oracle debe actualizarse para el buen funcionamiento de la base de datos (ANALYZE).
Disponemos de un par de tablas en el catálogo público que sirven al analista y al programador para crear comentarios sobre tablas y columnas.
ALL_TAB_COMMENTS Contiene los comentarios para tablas y vistas.ALL_COL_COMMENTS Contiene los comentarios para las columnas de tablas yvistas.
Estas tablas se mantienten por medio de la sentencia COMMENT.
Con todas esta información en la base de datos, podemos escribir procedimientos o scriptsSQL para generar documentación o generar a su vez scripts.
Fuentes
http://www.gplivna.eu/papers/sql_join_types.htm#p4
http://www.oracledeveloper.net/display.php?id=213
http://www.oraclepassport.com/OracleJoins.html
http://www.smartsoft.co.uk/Oracle/oracletipsandtricks.htm
http://www.java2s.com/Code/Oracle/CatalogOracle.htm
http://es.wikipedia.org/wiki/Join
http://www.plsql.biz/2007/01/hintsenplsqlparadeterminarelmtodo.html
http://www.oracle.com/index.html
http://es.wikipedia.org/wiki/Oracle
http://en.wikipedia.org/wiki/Oracle_Database
http://www.pythian.com/news/13291/installingoracle11gr2enterpriseeditiononubuntu1004lucidlynx/
http://ubuntulife.wordpress.com/2007/02/11/instalaroracle10grelease2enubuntu edgy/
http://www.taringa.net/posts/linux/5400558/AplicacionesXremotasdesdeWindow s.html
http://www.buanzo.com.ar/lin/x_cliente_servidor.html
http://www.infor.uva.es/~jvegas/cursos/bd/orarq/orarq.html
http://www.infor.uva.es/~jvegas/cursos/bd/oraseg/oraseg.html
http://blobgle.com/blog/?p=51
http://alexhomar.blogspot.com/2007/05/esquemausuario.html
http://orlandoolguin.wordpress.com/2009/09/20/manejodeperfiles/
http://cursos.atica.um.es/cursosdba/dba10g1.php
http://www.desarrolloweb.com/manuales/tutorialoracle.html
http://www.elartedeprogramar.cl/foro/sql/miniguiadeprogramacionoracleplsql/?PHPSESSID=d5f1570a72e581449b195c2a4f5d1857
http://www.devjoker.com/gru/TutorialPLSQL/PLSQ/TutorialPLSQL.aspx
http://www.dataprix.com/comocrearunnuevoesquemaenoraclepasopaso
http://www.programacionweb.net/foros/mensaje/?num=16941
http://www.infor.uva.es/~jvegas/cursos/bd/orarq/orarq.html
http://www.dbasupport.com.mx/index.php?option=com_content&view=article&id=126:Apuntes+de+SQLPlus&catid=1:administracion&Itemid=3
http://www.infor.uva.es/~jvegas/cursos/bd/sqlplus/sqlplus.html#conexion
http://www.orafaq.com/wiki/SQL*Plus_FAQ
http://www.exes.es/ManSQL/index.asp?Pg=sql_plsql_10.htm
http://4.bp.blogspot.com/_nt6c3XlwGIs/Sh2sQXxP6gI/AAAAAAAAAaI/74PTi9JdGPM/s1600h/query.jpg
http://www.dbaoracle.com/oracle_tips_like_sql_index.htm
http://carcasco.blogspot.com/2009/05/oraclebusquedaslikefuzzycontains.html
http://www.dbaoracle.com/plsql/
http://www.dbaoracle.com/oracle_tips_like_sql_index.htm
http://www.orafaq.com/node/1918
http://knoworacle.wordpress.com/2010/02/25/oracle10gtop10oracleplsqlperformancetips/
http://download.oracle.com/docs/cd/B10500_01/appdev.920/a96624/12_tune.htm
http://download.oracle.com/docs/cd/B12037_01/appdev.101/b10807/12_tune.htm
http://www.plsql.biz/2006/08/buclesyproblemasderendimiento.html
http://www.devshed.com/c/a/Oracle/TuningPLSQLCode/
http://www.dbaoracle.com/oracle_news/2004_2_5_rittman.htm
http://www.dbspecialists.com/files/presentations/bulk_binds.html
http://daust.blogspot.com/2006/01/xechangingdefaulthttpport.html
http://www.maestrosdelweb.com/editorial/tutsql1/
http://www.desarrolloweb.com/manuales/9/
http://es.wikipedia.org/wiki/SQL
http://www.redcientifica.com/oracle/c0002p0004.html
http://www.softcov.com/es/database/oracledatadictionaryused.html
http://www.bd.cesma.usb.ve/ci5313/em04/taller4_MEV.pdf
http://www.ajpdsoft.com/modules.php?name=News&file=article&sid=268
http://66.221.222.85/reference/builtin_functions.html
http://techonthenet.com/oracle/functions/
http://www.infor.uva.es/~jvegas/cursos/bd/sqlplus/sqlplus.html#columnas
http://www.oraclebase.com/articles/10g/MergeEnhancements10g.php
http://www.oracleya.com.ar/simulador/simulador.php?cod=212&punto=54
http://oracleya.com.ar/temarios/descripcion.php?cod=190&punto=1
http://www.desarrolloweb.com/articulos/1900.php