Está en la página 1de 74

Curso

Fundamentos 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. Ofrecevarias
características y funcionalidades implementadas en la version Enterprise.
Opciones de
Base de Datos como Data Guard, Particionamiento, Spatial, etc no vienen incluidas
con esta version. Esta version estandar aplica a servidores de 1 a 4 CPU’s , si se
exceden  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 2
procesadores.

○ Oracle Database Express Edition (XE).

Introducida en 2.005, ofrece una versión Oracle 10g libre para distribuirse sobre
plataformas Windows y Linux, tiene restricciones de solo un CPU, 4 Gigas de datos y
usa máximo 1 GB de RAM, el soporte de esta versión se encuentra en foros y no a
través de Oracle Corporation.
La única edición gratuita es la Express Edition, que es compatible con las demás
ediciones de Oracle Database 10gR2 y Oracle Database 11g.
Esta version puede embeberse con otras aplicaiones de terceros y se puede distribuir
gratuitamente.

○ Oracle Database Personal Edition (PE).

La personal edition es una versión de base de datos singular para usuario.  Es casi
igual 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 con
una 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 2009­09­01)

Sistemas Operativos y Arquitecturas Soportadas en Oracle 10g R2

○ Oracle Database 10g Release 2 (10.2.0.4) for MAC OS X on Intel x86­64
○ 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 (64­bit 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 x86­64
○ 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 HP­UX PA­RISC
○ Oracle Database 10g Release 2 (10.2.0.1.0) for HP­UX 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 (x86­64)
○ Oracle  Database  10g  Release  2  (10.2.0.1.0)   for  Solaris  Operating  System  (SPARC)
(64­bit)
○ 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 (32­bit)
○ Microsoft Windows (x64)
○ Linux x86
○ Linux x86­64
○ Solaris (SPARC) (64­bit)
○ Solaris (x86­64)
○ HP­UX Itanium
○ HP­UX PA­RISC (64­bit)
○ 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 base
de datos relacional, esta versión no tenía soporte de transacciones pero implementaba
funcionalidades 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 tiene
funcionalidades para soportar transacciones como son COMMIT y ROLLBACK.
1984: Oracle Corporation lanza la versión 4, el cual tiene soporte de read­consistency.
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 de
datos propiamente dicha). Esta versión también tenía bloqueo de fila y copias de seguridad en
caliente.
1989: Oracle Corporation entra en el mercado de productos de aplicaciones y desarrolla su
ERP (Que luego llegará a hacer parte de Oracle E­Bussiness Suite), basada en la base de
datos relacional Oracle.
1990: Se lanza Oracle Applications versión 8.
1992: Aparece Oracle versión 7 con soporte de integridad referencial, procedimientos
almacenados y triggers.
1997: Oracle Corporation lanza la versión 8, que apoyo el desarrollo orientado a objetos y
aplicaciones multimedia.
1999: Se lanza la versión Oracle8i dirigido a proporcionar una base de datos interactue mejor
con Internet (La letra i en su nombre viene de “Internet”). Esta versión también incorpora una
máquina virtual de JAVA nativa en la base de datos (Oracle JVM).
2000: Oracle E­Business Suite 11i son pioneros en integrar software enterprise application.
2001: Oracle9i se lanza con 400 nuevas características, incluyendo entre ellas la posibilidad de
leer y escribir documentos XML. También se provee una opción para Oracle RAC “Real
Application 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 TPC­H.
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 apt­get 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 non­free

3. Guardar el archivo y salir.
4. Obtener la llave GPG de autorización

$ wget http://oss.oracle.com/el4/RPM­GPG­KEY­oracle ­O­ | sudo
apt­key add ­

5. Actualizar la base de datos de paquetes

$ sudo apt­get update

6. Luego de actualizados los repositorios, instalar el Oracle XE

$ sudo apt­get install oracle­xe

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/oracle­xe 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 apt­get, puede
usar lo siguiente.

Listar los paquetes instalados (Buscar los que sean de Oracle)

$ dpkg ­­get­selections oracle*

$ dpkg ­­l oracle*

Deberia tenerse un paquete con el nombre: oracle­xe ó oracle­xe­universal.
Tras identificar el paquete, proceder a desinstalarlo digitando un comando   tras
otro así:

$ sudo apt­get remove oracle­xe­universal

$ sudo apt­get purge oracle­xe­universal

$ 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.104­1_i386.deb
oracle­xe­universal_10.2.0.1­1.0_i386.deb

2. El paquete libaio_0.3.104­1_i386.deb contiene unas librerías de
dependencia que se
requieren previamente antes de instalar la base de datos, para su instalación
digitaremos lo siguiente:

$ sudo dpkg ­i libaio_0.3.104­1_i386.deb

3. tras finalizar la instalación de esta libreria, proseguir con el siguiente comando para
la instalación de la base de datos.

$ sudo dpkg ­i oracle­xe­universal_10.2.0.1­1.0_i386.deb

4. Configurar la base de datos luego de la instalación

$ sudo /etc/init.d/oracle­xe 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, puede
usar lo siguiente.

Listar los paquetes instalados (Buscar los que sean de Oracle)

$ dpkg ­­get­selections oracle*

$ dpkg ­­l oracle*

Deberia tenerse un paquete con el nombre: oracle­xe ó oracle­xe­universal.
Tras identificar el paquete, proceder a desinstalarlo digitando un comando   tras
otro así:

$ sudo dpkg ­­remove oracle­xe­universal

$ sudo dpkg ­­purge oracle­xe­universal

$ sudo apt­get 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 de
apt­get.

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 se
definió 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:

SELECT
DBMS_XDB.GETHTTPPORT "Puerto­HTTP"
FROM
DUAL;

2. Ejecutar el siguiente bloque para cambiar el puerto al que queramos:

BEGIN
DBMS_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 apt­get install ssh

1. Descargar las siguientes y complementos necesarios para la instalación.

$ sudo apt­get install unzip build­essential x11­utils rpm ksh lsb­rpm 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.

$ wget
http://security.ubuntu.com/ubuntu/pool/universe/i/ia32­libs/ia32­libs_2.7ubuntu6.1_amd6
4.deb

$ dpkg­deb ­x ia32­libs_2.7ubuntu6.1_amd64.deb ia32­libs

$ sudo cp ia32­libs/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:

$ wget
http://mirrors.kernel.org/ubuntu/pool/universe/g/gcc­3.3/libstdc++5_3.3.6­17ubuntu1_am
d64.deb

$ dpkg­deb ­x libstdc++5_3.3.6­17ubuntu1_amd64.deb ia64­libs

$ sudo cp ia64­libs/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 aliases
if [ ­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/oracle
export ORACLE_BASE

ORACLE_HOME=/u01/app/oracle/product/10.2.0/db_1
export ORACLE_HOME

ORACLE_SID=capacita
export ORACLE_SID

ORACLE_TERM=xterm
export ORACLE_TERM

ORACLE_OWNER=oracle
export ORACLE_OWNER

# TNS_ADMIN=/home/oracle/config/10.2.0 export TNS_ADMIN

NLS_LANG=SPANISH_SPAIN.WE8ISO8859P1
export NLS_LANG

#ORA_NLS10=${ORACLE_HOME}/db_1/nls/data; export ORA_NLS10

CLASSPATH=${CLASSPATH}:${ORACLE_HOME}/jdbc/lib/classes12.zip
LD_LIBRARY_PATH=${ORACLE_HOME}/lib
export LD_LIBRARY_PATH

DISABLE_HUGETLBFS=1
export DISABLE_HUGETLBFS

TEMP=/tmp
export TEMP

TMPDIR=/tmp
export 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ón
actual de nuestro sistema ejecutar los siguientes comandos:

# sysctl ­a | grep sem

# sysctl ­a | grep shm

# sysctl ­a | grep file­max

# sysctl ­a | grep ip_local_port_range

9. Para actualizar el fichero de configuración se debe proceder a sacar una copia
del 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 = 2097152
kernel.shmmax = 2147483648
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
fs.file­max = 65536
net.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 sobre
el botón Siguiente.
En nombre de la base de datos global, digitamos capacitacion.datacenter.com.co
En el SID, nos quedaron los 8 caracteres del nombre global: capacita.
Como Juego de carácteres escogemos: Unicode estándar UTF­8 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 por
defecto y pulsamos sobre el botón Siguiente.
Escogemos como opción de almacenamiento Sistema de Archivos, y escogemos el directorio
que 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 manera
automática y clic en Siguiente.
Escogemos que vamos a manejar una sola contraseña para los usuarios, la ingresamos y
damos 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 la
base 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 datos
Oracle. El listener está configurado para escuchar la conexión en un puerto específico en el
servidor de base de datos. Cuando una se pide una conexión a la base de datos, el listener
devuelve la información relativa a la conexión. La información de una conexión para una
instancia de una base de datos provee el nombre de usuario, la contraseña y el SID de la base
de 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 a
descriptores 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 instancia
2. Montar la base de datos
3. 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 sysdba
connected
SQLPLUS> startup nomount
Oracle 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 SYSTEM
3. 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 mount
database mounted

En caso de que queramos iniciar la base de datos en este estado bastaría con hacer lo
siguiente:

SQLPLUS> connect sys as sysdba
connected
SQLPLUS> startup mount
Oracle Instance started
Database mounted

3. Abrir base de datos

En esta parte de proceso abren todos los ficheros asociados a los tablespaces y los
ficheros 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 open
database opened

En caso de que queramos iniciar la base de datos en este estado bastaría con hacer lo
siguiente:

SQLPLUS> connect sys as sysdba
connected
SQLPLUS> startup
Oracle Instance started
Database 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ón
diferente 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*DBA
después de haber establecido una conexión como SYS AS SYSDBA

Existen tres tipos de shutdown

1. shutdown normal
2. shutdown immediate
3. 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 “Shutdown
in 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 sysdba
connected
SQLPLUS> 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 los
que 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 aquellas
transacciones 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 sysdba
connected
SQLPLUS> shutdown immediate

3. Shutdown abort

Parada drástica, no espera a que los usuarios conectados actualmente finalicen sus
transacciones. 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 aquellas
transacciones que no estén validadas.

Si necesita recuperacion al arrancar la base de datos

SQLPLUS> connect sys as sysdba
connected
SQLPLUS> shutdown abort

Arquitectura de Oracle

Una Base de Datos Oracle es un conjunto de datos almacenados y accesible según el formato
de 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 correspondencia
entre los ficheros y las tablas es posible gracias a las estructuras internas de la BD, que
permiten 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 a
un tablespace.

Cada tabla o indice de oracle pertenece a un tablespace, es decir cuando se crea una tabla o
indice se crea en un tablespace determinado.

Hay varias razones que justifican este modo de organización de las tablas en espacios de
tablas:

● Un espacio de tablas puede quedarse offline debido a un fallo de disco, permitiendo que
el SGBD continúe funcionando con el resto.
● Los espacios de tablas pueden estar montados sobre dispositivos ópticos si son de
só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, se
utilice o no. Si este espacio inicial se ha quedado pequeño Oracle puede gestionar el
crecimiento dinámico de los ficheros sobre los que se asientan los espacios de tablas. Esto
elimina la posibilidad de error en las aplicaciones por fallos de dimensionamiento inicial. Los
parámetros de crecimiento del tamaño de los espacios de tablas se especifican en la creación
de 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 se
almacena 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 en
cualquier 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 (por
ejemplo 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, aunque
internamente 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 el
espacio que creó inicialmente.

Un datafile está asociado a un solo tablespace y, a su vez, un tablespace está asociado a uno
o varios datafiles. Es decir, la relación lógica entre tablespaces y datafiles es de 1­N,
maestro­detalle.

Los datafiles tienen una propiedad llamada AUTOEXTEND, que se si está activa, se encarga
de que el datafile crezca automáticamente (según un tamaño indicado) cada vez que se
necesite espacio y no exista. Al igual que los tablespaces, los datafiles también puede estar en
lí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 tome
máximo. Esto lo conseguimos con "maxsize unlimited", pero es muy peligroso porque por
algún problema descontrolado, nos puede crecer tanto que nos quedemos si disco en la
má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 on
ts_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 y
todos 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 es
correcto 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 valor
de 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 hacer
como 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, se
puede 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 y
schema). 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 un
ESQUEMA es el conjunto de objetos que ese USUARIO posee. Si bien es cierto que uno de
los pasos cuando uno crea un usuario es la creación del ESQUEMA en el que se almacenaran
sus objetos, y que el nombre que se le asocia es el mismo que tiene el usuario, es bastante
simple 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 varchar2
de 30 caracteres, esta misma tabla se debe crear para dos usuarios, e insertar un dato con el
nombre 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 FROM
V$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 solamente
cambia el ESQUEMA por defecto del USUARIO. No modifica los privilegios que tenemos sobre
ese ESQUEMA, ni cambian los resultados cuando hacemos una consulta que depende del
nombre 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 disponibles
para  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_LIMIT
Suma  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_TIME
Tiempo permitido de conexión por sesión en minutos.

CPU_PER_CALL
Máximo tiempo de CPU por llamada en centésimas de segundo.

CPU_PER_SESSION
Máximo tiempo de CPU por sesión en centésimas de segundo.

IDLE_TIME
Tiempo  máximo  permitido  sin  actividad por  el  usuario  antes de  ser desconectado. Se expresa
en minutos.

LOGICAL_READS_PER_CALL
Máximo número de bloques de base de datos leídos por llamada.

LOGICAL_READS_PER_SESSION
Máximo numero de bloques de base de datos leídos por sesión.

PRIVATE_SGA
Má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_USER
Máximo número de sesiones concurrentes permitidas por usuario.

FAILED_LOGIN_ATTEMPTS
Número  de  intentos  fallidos  de  conexión  de  un  usuario,  antes  de  que  Oracle  ponga  la  cuenta
bloqueada.

PASSWORD_GRACE_TIME
Nú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_TIME
Número de días de vida de un password.

PASSWORD_LOCK_TIME
Número  de  días  que  permanecerá  bloqueado  un   usuario  después  de  rebasar  el  límite
FAILED_LOGIN_ATTEMPTS.

PASSWORD_REUSE_MAX
Número de veces que un password puede ser re­usado.

PASSWORD_REUSE_TIME
Número de días que tienen que pasar para poder re­usar un password.

PASSWORD_VERIFY_FUNCTION
En  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 usuario
que 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 la
versión de la base de datos. Existe un perfil llamado default el cual, regirá a todos los usuarios
de 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 valor
del 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 usuario
administrador:

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 by
resource_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 by
resource_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 1
failed_login_attempts 1
sessions_per_user 1;

Consultar el perfil del usuario:

SQL>select username, default_tablespace, temporary_tablespace, profile
from 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 usuarios
con 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] OBJETO
TO {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 de
un tipo especificado. Por ejemplo, el privilegio para crear TABLESPACES es un privilegio de
sistema. 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 esos
mismos privilegios a otros usuarios o roles.

Retirada de privilegios de objetos a los usuarios

REVOKE {PRIV_OBJETO [,PRIV_OBJETO]… | ALL [PRIVILEGES]}
ON [USUARIO.]OBJETO
FROM {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 la
creació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 NOMBREUSUARIO
DEFAULT {[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 las
siguientes consultas:

SQL>SELECT GRANTED_ROLE "Rol", ADMIN_OPTION "Admin" FROM
USER_ROLE_PRIVS;

SQL>SELECT PRIVILEGE "Privilegio", ADMIN_OPTION "Admin" FROM
USER_SYS_PRIVS;

Si se desea hacer esta consulta para otros usuarios, se deberán utilizar la vista
dba_role_privs.

Tipos de Objetos en Oracle

○ Tablas
Son la unidad básica de almacenamiento de datos en Oracle. Los datos son
almacenados en filas y columnas. La tabla se define a través de:

Nombre.
Conjunto de columnas (nombre y tipo)

○ Sinonimos
Un  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.

○ Funciones
Una función es un conjunto de instrucciones en PL/SQL, que pueden ser llamados
usando el nombre con que se le haya creado. Se diferencian de los procedimientos, en
que las funciones retornan un valor al ambiende desde donde fueron llamadas.

○ Procedimientos
Un procedimiento almacenado es un conjunto de instrucciones en PL/SQL, que pueden
ser llamado usando el nombre que se le haya asignado.

○ Paquetes
Los paquetes en Oracle se utilizan para guardar subprogramas y otros objetos de la
base de datos. Un paquete consta de los siguientes elementos:

Especificación o cabecera: contiene las declaraciones públicas (es decir, accesibles
desde 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.

○ Triggers
Un 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 se
ejecuta sobre dicha tabla una sentencia INSERT, una sentencia UPDATE o una
sentencia DELETE, es decir, es un procedimiento que permite realizar distintas
operaciones cuando un registro de una tabla Oracle es actualizado o borrado, o cuando
se añade un registro nuevo a dicha tabla.

○ Indices
Un índice es una estructura de datos que permite acceder a diferentes filas de una
misma tabla a través de un campo (o campos clave). Un índice permite un acceso
mucho 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 query
language) es un lenguaje declarativo de acceso a bases de datos relacionales que permite
especificar diversos tipos de operaciones en éstas. Una de sus características es el manejo
del álgebra y el cálculo relacional permitiendo efectuar consultas con el fin de recuperar ­de
una forma sencilla­ información de interés de una base de datos, así como también hacer
cambios 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 datos
basado en el cálculo de predicados. Basándose en estas ideas, los laboratorios de IBM definen
el lenguaje SEQUEL (Structured English QUEry Language) que más tarde sería ampliamente
implementado 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 primera
vez en 1979 en un programa comercial.

El SEQUEL terminaría siendo el predecesor de SQL, siendo éste una versión evolucionada del
primero. El SQL pasa a ser el lenguaje por excelencia de los diversos sistemas de gestión de
bases 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 "SQL­86" 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 e
incluye 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 "SQL­92" o
"SQL2".

En la actualidad el SQL es el estándar de facto de la inmensa mayoría de los SGBD
comerciales. Y, aunque la diversidad de añadidos particulares que incluyen las distintas
implementaciones comerciales del lenguaje es amplia, el soporte al estándar SQL­92 es
general y muy amplio.

El ANSI SQL sufrió varias revisiones y agregados a lo largo del tiempo:

Año Nombre Alias Comentarios

1986 SQL­86 SQL­87 Primera publicación hecha por ANSI.


Confirmada por ISO en 1987.

1989 SQL­89 Revisión menor.

1992 SQL­92 SQL2 Revisión mayor.

1999 SQL:1999 SQL2000 Se agregaron expresiones regulares,


consultas recursivas (para relaciones
jerárquicas), triggers y algunas
características orientadas a objetos.

2003 SQL:2003 Introduce algunas características de XML,


cambios en las funciones, estandarización
del objeto sequence y de las columnas
autonumericas. (Ver Eisenberg et al.:
SQL:2003 Has Been Published.)

2006 SQL:2006 ISO/IEC 9075­14:2006 Define las maneras


en las cuales el SQL se puede utilizar
conjuntamente con XML. Define maneras
importar y guardar datos XML en una base
de datos SQL, manipulándolos dentro de la
base de datos y publicando el XML y los
datos SQL convencionales en forma XML.
Además, proporciona facilidades que
permiten a las aplicaciones integrar dentro
de su código SQL el uso de XQuery,
lenguaje de consulta XML publicado por el
W3C (World Wide Web Consortium) para
acceso concurrente a datos ordinarios SQL
y documentos XML.

2008 SQL:2008 Permite el uso de la cláusula ORDER BY


fuera de las definiciones de los cursores.
Incluye los disparadores del tipo INSTEAD
OF. 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.
CREATE
Este  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.

ALTER
Este  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.

RENAME
Cambia el nombre a una tabla, vista, secuencia o sinonimo privado.

DROP
Este  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.

TRUNCATE
Este  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 un
lenguaje proporcionado por el sistema de gestión de base de datos que permite a los usuarios
llevar a cabo las tareas de consulta o manipulación de los datos, organizados por el modelo de
datos adecuado.

El lenguaje de manipulación de datos más popular hoy día es SQL, usado para recuperar y
manipular datos en una base de datos relacional.

INSERT
Una sentencia INSERT de SQL agrega uno o más registros a una (y sólo una) tabla en una
base de datos relacional.

UPDATE
Una   sentencia  UPDATE  de  SQL  es  utilizada  para  modificar  los  valores   de  un  conjunto  de
registros existentes en una tabla.

MERGE
lo  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.
DELETE
Una 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 las
instrucciones 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 GRANT
y 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 Entre 1 y 2000 bytes como


(alfanuméricos) de longitud fija 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 Entre 1 y 4000 bytes como


longitud variable máximo. El tamaño del campo
dependerá del valor que
contenga, es de longitud
variable.

VARCHAR Cadena de caracteres de En desuso, se utiliza


longitud variable VARCHAR2 en su lugar

NCHAR Cadena de caracteres de Entre 1 y 2000 bytes como


longitud fija que sólo almacena máximo. El juego de
caracteres Unicode 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 Entre 1 y 4000 bytes como
longitud variable que sólo máximo. El juego de
almacena caracteres Unicode 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 Como máximo admite hasta 2


longitud variable 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
DISTINCT
Una tabla sólo puede contener
una columna de tipo LONG.
Sólo soporta acceso
secuencial.

LONG RAW Almacenan cadenas binarias Hasta 2 GB.


de ancho variable En desuso, se sustituye por
los tipos LOB.

RAW Almacenan cadenas binarias Hasta 32767 bytes.


de ancho variable En desuso, se sustituye por
los tipos LOB.

LOB (BLOG, CLOB, NCLOB, Permiten almacenar y Admiten hasta 8 terabytes


BFILE) manipular bloques grandes de (8000 GB).
datos no estructurados (tales Una tabla puede contener
como texto, imágenes, videos, varias columnas de tipo LOB.
sonidos, etc) en formato Soportan acceso aleatorio.
binario o del carácter Las tablas con columnas de
tipo LOB no pueden ser
replicadas.

BLOB Permite almacenar datos Admiten hasta 8 terabytes


binarios no estructurados

CLOB Almacena datos de tipo Admiten hasta 8 terabytes


carácter

NCLOB Almacena datos de tipo Admiten hasta 8 terabytes.


carácter Guarda los datos según el
juego de caracteres Unicode
nacional.

BFILE Almacena datos binarios no Admiten hasta 8 terabytes.


estructurados en archivos del El administrador de la base de
sistema operativo, fuera de la datos debe asegurarse de que
base de datos. Una columna exista el archivo en disco y de
BFILE almacena un localizador que los procesos de Oracle
del archivo a uno externo que tengan permisos de lectura
contiene los datos para el archivo .

ROWID Almacenar la dirección única ROWID físico almacena la


de cada fila de la tabla de la dirección de fila en las tablas,
base de datos 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 clientes
Ejemplo 2:
SELECT ROWID,
SUBSTR(ROWID,15,4)
"Fichero", SUBSTR(ROWID,1,8)
"Bloque",
SUBSTR(ROWID,10,4) "Fila"
FROM proveedores
Ejemplo 3: una forma de saber
en cuántos ficheros de datos
está alojada una tabla:
SELECT
COUNT(DISTINCT(SUBSTR(RO
WID,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 Se admiten hasta 38 dígitos de


punto flotante 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 NUMBER
opcionalmente 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 Es un tipo NUMBER que sólo


numéricos en punto flotante almacena números en punto
flotante

DATE Almacena un punto en el El tipo de datos DATE


tiempo (fecha y hora) 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 Almacena datos de tipo hora Cuando se usa un SELECT
ZONE incluyendo la zona horaria para mostrar los datos de este
local (relativa), franccionando tipo, el valor de la hora será
los segundos ajustado a la zona horaria de
la sesión actual

XMLType Tipo de datos abstracto. En Se asocia a un esquema XML


realidad se trata de un CLOB. 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 select * from emp where


miembros entre paréntesis cod_dep in (100, 300);

not in Distinto a cualquiera de los select * from emp where


miembros entre paréntesis 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 select * from emp where


partir del segundo carácter y nombre like 'Ma%';
luego cualquier cadena de
caracteres

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 select abs(-15) from 15


absoluto de n. dual;

CEIL(n) Calcula el valor entero select ceil(15.7) from 16


inmediatamente dual;
superior o igual a n.

FLOOR(n) Calcula el valor entero select floor(15.7) from 15


inmediatamante dual;
inferior o igual a n.

MOD(m,n) Calcula el resto select mod(11,4) from 3


resultante de dividir m dual;
entre n.

POWER(m,n) Calcula la potencia select power(3,2) 9


n-esima de m. from dual;

ROUND(m,n) Calcula el redondeo de select 123.5


m a n decimales. Si round(123.456,1) from
n<0 el redondeo se dual;
efectua a por la
izquierda del punto
decimal.

SQRT(n) Calcula la raíz select sqrt(4) from 2


cuadrada de n. dual;

TRUNC(m,n) Calcula m truncado a select 123.4


n decimales (n puede trunc(123.456,1) from
ser negativo). dual;

SIGN(n) Calcula el signo de n, select sign(-12) from -1


devolviendo -1 si n<0, dual;
0 si n=0 y 1 si n>0.

Funciones de Cadenas de Caracteres


Función Cometido Ejemplo Resultado

CHR(n) Devuelve el carácter select chr(65) from A


cuyo valor codificado dual;
es n.

ASCII(cad) Devuelve el valor ascii select ascii('A') from 65


de cad. dual;

CONCAT(cad1,cad2) Devuelve cad1 select Cano es Presidente,


concatenada con concat(concat(nombr etc.
cad2. Esta función es e,' es '),oficio) from
esquivalente al emp;
operador ||.

LOWER(cad) Devuelve la cadena select minusculas


cad con todas sus lower('MinUsCulAs')
letras convertidas a from dual;
minúsculas.

UPPER(cad) Devuelve la cadena select MAYUSCULAS


cad con todas sus upper('maYuSCulAs')
letras convertidas a from dual;
mayúsculas.

INITCAP(cad) Devuelve cad con el select initcap('isabel') Isabel


primer caracter en from dual;
mayúsculas.

LPAD(cad1,n,cad2) Devuelve cad1 con select lpad('P',5,'*') ****P


longitud n, y ajustada from dual;
a la derecha,
rellenando por la
izquierda con cad2.

RPAD(cad1,n,cad2) Devuelve cad1 con select rpad('P',5,'*') P****


longitud n, y ajustada from dual;
a la izquierda,
rellenando por la
derecha con cad2.

REPLACE(cad,ant,nue) Devuelve cad en la select diego


que cada ocurrencia replace('digo','i','ie')
de la cadena ant ha from dual;
sido sustituida por la
cadena nue.

SUBSTR(cad,m,n) Devuelve la select CD


sudcadena de cad substr('ABCDEFG',3,2)
compuesta por n from dual;
caracteres a partir de
la posicion m.

LENGTH(cad) Devuelve la longitud select 6


de cad. length('cadena') from
dual;

Funciones de Manejo de Fechas


Función Cometido Ejemplo Resultado

SYSDATE Devuelve la fecha y select sysdate from 14-MAR-97


hora actuales. dual;

ADD_MONTHS(d,n) Devuelve la fecha d select 14-JUL-97


incrementada en n add_months(sysdate,
meses. 4) from dual;

LAST_DAY(d) Devuelve la fecha del select 31-MAR-97


último día del mes de last_day(sysdate)
d. from dual;

MONTHS_BETWEEN(d1 Devuelve la diferencia select 2.43409424


, d2) en meses entre las months_between(sysd
fechas d1 y d2. ate,'01-JAN-97') from
dual;

NEXT_DAY(d,cad) Devuelve la fecha del select 16-MAR-97


primer día de la next_day(sysdate,
semana cad después 'sunday') from dual;
de la fecha d.

Funciones de Conversión de Tipos


Función Cometido Ejemplo Resultado
TO_NUMBER(cad,fmto Convierte la cadena select 124345
) cad a un número, to_number('12345')
opcionalmente de from dual;
acuerdo con el
formato fmto.

TO_CHAR(d, fmto) Convierte la fecha d a select '14-MAR-97'


una cadena de to_char(sysdate) from
caracteres, dual;
opcionalmente de
acuerdo con el
formato fmto.

TO_DATE(cad,fmto) Convierte la cadena select 01-JAN-97


cad de tipo varchar2 to_date('1-JAN-97')
a fecha, from dual;
opcionalmente de
acuerdo con el
formato fmto.

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. select 20


to_char(sysdate,'cc')
from dual;

y,yyy ó sy,yyy Año con coma, con o select 1,997


sin signo. to_char(sysdate,'y,yy
y') from dual;

yyyy ó yyy ó yy ó y Año sin signo con select 1997


cuatro, tres, dos o un to_char(sysdate,'yyyy
dígitos. ') from dual;

q Trimestre. select 1
to_char(sysdate,'q')
from dual;

ww ó w Número de la semana select 11


del año o del mes. to_char(sysdate,'ww')
from dual;

mm Número del mes. select 03


to_char(sysdate,'mm')
from dual;

ddd ó dd ó d Número del día del select 073


año, del mes o de la to_char(sysdate,'ddd')
semana. from dual;

hh ó hh12 ó hh24 La hora en formato select 12


12h. o 24h. to_char(sysdate,'hh')
from dual;

mi Los minutos de la select 15


hora. to_char(sysdate,'mi')
from dual;

ss ó sssss Los segundos dentro select 44159


del minuto, o desde to_char(sysdate,'ssss
las 0 horas. s') from dual;

Máscaras de Formato de Caracteres


Formato Cometido Ejemplo Resultado

syear ó year Año en Inglés select nineteen ninety-seven


to_char(sysdate,'syea
r) from dual;

month o mon Nombre del mes o su select march


abreviatura de tres to_char(sysdate,'mont
letras. h') from dual;

day ó dy Nombre del día de la select friday


semana o su to_char(sysdate,'day')
abreviatura de tres from dual;
letras.

a.m. ó p.m. El espacio del día. select p.m.


to_char(sysdate,'a.m.'
) from dual;

b.c. ó a.d. Indicador del año select a.d.


respecto al del to_char(sysdate,'b.c.'
nacimiento de Cristo. ) from dual;

Otras Funciones
Función Cometido Ejemplo Resultado

DECODE(var, val1, Convierte el valor de select decode(oficio, P, D, X, ...


cod1, val2, cod2, ..., var, de acuerdo con 'Presidente', 'P',
defecto) la codificación. 'Director', 'D', 'X') from
emp;

GREATEST(exp1, Devuelve el mayor sin ejemplo. sin ejemplo.


exp2, ...) valor de una lista.

LEAST(cad,fmto) Devuelve el menor sin ejemplo. sin ejemplo.


valor de una lista.

NVL(val, exp) Devuelve la expresión select 450000, 350000, ...


exp si val es NULL, y salario+nvl(comision,0
val si en otro caso. ) from emp;
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 select count(nombre),oficio
agrupadas. from emp group by oficio;

AVG(col) Calcula el valor medio de todos select avg(salario),oficio from


los valores de la columna col. emp group by oficio;

MAX(col) Calcula el valor máximo de select max(salario),oficio from


todos los valores de la emp group by oficio;
columna col.

MIN(col) Calcula el valor mínimo de select min(salario),oficio from


todos los valores de la emp group by oficio;
columna col.

SUM(col) Calcula la suma de los valores select sum(salario), oficio from


de la columna col. emp group by oficio;

STDDEV(col) Calcula la desviación típica de select stddev(salario), oficio


los valores de la columna col from emp group by oficio;
sin tener en cuenta los valores
nulos.

VARIANCE(col) Calcula la varianza de los select variance(salario), oficio


valores de la columna col sin from emp group by oficio;
tener en cuenta los valores
nulos.

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  auto­combinación,
SELF­JOIN.

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 ilustrar
el 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 departamento
ON empleado.IDdepartamento = departamento.IDdepartamento

B. Ejemplo de la sentencia INNER JOIN implícita:

SELECT *
FROM   empleado, departamento
WHERE  empleado.IDdepartamento = departamento.IDDepartamento

Resultados:

Empleado.Apellido Empleado.IDdep departamento.No departamento.ID


artamento mbreDepartamen Departamento
to

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 theta­join.

C. Ejemplo de combinación tipo theta:

SELECT *
FROM   empleado
INNER JOIN departamento
ON empleado.IDDepartamento < departamento.IDDepartamento

Las  operaciones  INNER  JOIN  puede  ser  clasificadas  como   de  equivalencia,  naturales,  y
cruzadas.

De equivalencia (equi­join)
Es   una   especie  de  theta­join  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   empleado
INNER JOIN departamento
ON 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 caso
se comparan todas las columnas que tengan el mismo nombre en ambas tablas. La tabla resultante
contiene 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.NombreD
epartamento

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.Apelli Empleado.IDDep Departamento.N Departamento.I


do artamento ombreDepartam DDepartamento
ento

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   empleado
LEFT OUTER JOIN departamento
ON empleado.IDDepartamento = departamento.IDDepartamento

Empleado.Apelli Empleado.IDDep Departamento.N Departamento.I


do artamento ombreDepartam DDepartamento
ento
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 derecha
con los valores de la tabla de la izquierda correspondientes, o retorna un valor nulo NULL en
caso de no correspondencia.

I. Ejemplo de tabla derecha para la combinación externa:

SELECT *
FROM   empleado
RIGHT OUTER JOIN departamento
ON empleado.IDDepartamento = departamento.IDDepartamento

Empleado.Apelli Empleado.IDDep Departamento.N Departamento.I


do artamento ombreDepartam DDepartamento
ento

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   empleado
FULL OUTER JOIN departamento
ON empleado.IDDepartamento = departamento.IDDepartamento

Empleado.Apelli Empleado.IDDep Departamento.N Departamento.I


do artamento ombreDepartam DDepartamento
ento

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   empleado
LEFT JOIN departamento
ON empleado.IDDepartamento = departamento.IDDepartamento
UNION
SELECT *
FROM   empleado
RIGHT JOIN departamento
ON empleado.IDDepartamento = departamento.IDDepartamento
WHERE  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 la
estructura 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 los
usuarios, 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  1­N  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 y
vistas.

Estas tablas se mantienten por medio de la sentencia COMMENT.

Con todas esta información en la base de datos, podemos escribir procedimientos o scripts
SQL para generar documentación o generar a su vez scripts.

Fuentes

http://www.gplivna.eu/papers/sql_join_types.htm#p4

http://www.oracle­developer.net/display.php?id=213

http://www.oraclepassport.com/OracleJoins.html

http://www.smart­soft.co.uk/Oracle/oracle­tips­and­tricks.htm

http://www.java2s.com/Code/Oracle/CatalogOracle.htm

http://es.wikipedia.org/wiki/Join

http://www.plsql.biz/2007/01/hints­en­plsql­para­determinar­el­mtodo.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/installing­oracle­11gr2­enterprise­edition­on­ub
untu­10­04­lucid­lynx/

http://ubuntulife.wordpress.com/2007/02/11/instalar­oracle­10g­release­2­en­ubuntu ­edgy/
http://www.taringa.net/posts/linux/5400558/Aplicaciones­X­remotas­desde­Window 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/esquema­usuario.html

http://orlandoolguin.wordpress.com/2009/09/20/manejo­de­perfiles/

http://cursos.atica.um.es/cursosdba/dba10g1.php

http://www.desarrolloweb.com/manuales/tutorial­oracle.html

http://www.elartedeprogramar.cl/foro/sql/mini­guia­de­programacion­oracle­pl­sql/?PHPSESSI
D=d5f1570a72e581449b195c2a4f5d1857

http://www.devjoker.com/gru/Tutorial­PLSQL/PLSQ/Tutorial­PLSQL.aspx

http://www.dataprix.com/como­crear­un­nuevo­esquema­en­oracle­paso­paso

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/s1600­h/qu
ery.jpg

http://www.dba­oracle.com/oracle_tips_like_sql_index.htm

http://carcasco.blogspot.com/2009/05/oracle­busquedas­like­fuzzy­contains.html

http://www.dba­oracle.com/plsql/

http://www.dba­oracle.com/oracle_tips_like_sql_index.htm
http://www.orafaq.com/node/1918

http://knoworacle.wordpress.com/2010/02/25/oracle­10g­top­10­oracle­plsql­performance­tips/

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/bucles­y­problemas­de­rendimiento.html

http://www.devshed.com/c/a/Oracle/Tuning­PLSQL­Code/

http://www.dba­oracle.com/oracle_news/2004_2_5_rittman.htm

http://www.dbspecialists.com/files/presentations/bulk_binds.html

http://daust.blogspot.com/2006/01/xe­changing­default­http­port.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/oracle­­data­dictionary­used.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.oracle­base.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

También podría gustarte