Está en la página 1de 94

Tareas del DBA (Administrador de la base de datos)

Las tareas que normalmente debe realizar el DBA son, entre otras: 1. Instalacin del software de Oracle, normalmente en colaboracin y coordinado con el administrador del sistema operativo. Esto incluye motor de la BD, actualizaciones, herramientas administrativas, cambios de hardware, etc... 2. Instalacin de las aplicaciones, propias o ajenas, sobre oracle (CREATE DATABASE). Esto incluye pruebas antes de pasar a produccin. 3. Controlar la seguridad de la BD. Esto incluye la altas y bajas de usuarios (CREATE USER), creacin de roles (CREATE ROLE) y auditorias de seguridad. 4. Monitorizacin y optimizacin del rendimiento de la BD. Este incluye desde modificar parametros del INIT.ORA hasta rehacer tablas o indices. 5. Backups (copias de seguridad). El DBA debe participar en la politica de copias de seguridad y recuperacin de datos. 6. Prevencin de riesgos. Esto incluye estar informado de cambios de hardware y software en el servidor, programar mantenimientos, probar copias de seguridad etc... 7. Apoyar a los desarrolladores. Esto incluye el diseo del modelo de datos, la optimizacin (TUNNING), construccin de procedimientos almacenados y triggers, definicin de estndares de diseo y nomenclatura. 8. Documentar todo lo relativo a la BD.

Create Database
Sirve para crea una base de datos. Desde el punto de vista fsico, una base de datos es, para oracle, un conjunto de ficheros, a saber:
datafiles, ficheros de datos, definidos en la creacin de la base de datos. log files, ficheros de log, definidos tambien en la creacin de la base de datos. init.ora, fichero de texto que contiene los parmetros de configuracin de la base de datos. control files, ficheros de control, definidos en el init.ora password file, fichero con la password del BDA y los operadores (todos los demas usuarios estan definidos en tablas).

Asi para crear una base de datos, una vez instalado oracle, debemos seguir los siguientes pasos:

1) Definir ORACLE_SID ORACLE_HOME = E:\Oracle\Product\10.0.0 ORACLE_SID = GESTION 2) Crear el fichero INIT.ORA C:\>ORACLE_HOME\database\initGESTION.ora

control_files = (/path/to/control1.ctl,/path/to/control2.ctl,/path/to/control3.ctl) undo_management = AUTO undo_tablespace = UNDOTBS1 db_name = GESTION db_block_size = 8192 sga_max_size = 1073741824 sga_target = 1073741824 3) Definir fichero de passwords $ORACLE_HOME\bin\orapwd file=ORACLE_HOME\database\pwdGESTION.ora password=oracle entries=10
Podemos generar los pasos 2) y 3) con una sola instruccin:

oradim -new -sid GESTION -intpwd

-maxusers 20 -startmode auto

-pfile E:\Oracle\Product\10.0.0\Database\initGESTION.ora 4) Arrancar la instancia C:\>sqlplus / as sysdba

sql> startup nomount 5) Crea la base de datos con el nombre(o SID) GESTION y el char set WE8ISO8859P1 CREATE DATABASE GESTION LOGFILE 'E:\OraData\GESTION\LOG1GESTION.ORA' SIZE 2M, 'E:\OraData\GESTION\LOG2GESTION.ORA' SIZE 2M, 'E:\OraData\GESTION\LOG3GESTION.ORA' SIZE 2M, 'E:\OraData\GESTION\LOG4GESTION.ORA' SIZE 2M, 'E:\OraData\GESTION\LOG5GESTION.ORA' SIZE 2M EXTENT MANAGEMENT LOCAL MAXDATAFILES 100 DATAFILE 'E:\OraData\GESTION\SYS1GESTION.ORA' SIZE 50 M DEFAULT TEMPORARY TABLESPACE temp TEMPFILE 'E:\OraData\GESTION\TEMP.ORA' SIZE 50 M UNDO TABLESPACE undo DATAFILE 'E:\OraData\GESTION\UNDO.ORA' SIZE 50 M NOARCHIVELOG CHARACTER SET WE8ISO8859P1;

6) Ejecutar sql de creacin: catalog.sql y catproc.sql


Sintaxis completa:

CREATE DATABASE nombreDB opciones


Donde las opciones:

DATAFILE filespec AUTOEXTEND OFF DATAFILE filespec AUTOEXTEND ON [NEXT int K | M] [MAXSIZE int K | M] MAXDATAFILES int EXTENT MANAGEMENT LOCAL DEFAULT TEMPORARY TABLESPACE tablespace [TEMPFILE filespec] [EXTENT MANAGEMENT LOCAL] [UNIFORM [SIZE int K | M]] UNDO TABLESPACE tablespace [DATAFILE filespec] LOGFILE [GROUP int] filespec MAXLOGFILES int MAXLOGMEMBERS int MAXLOGHISTORY int MAXINSTANCES int ARCHIVELOG | NOARCHIVELOG CONTROLFILE REUSE CHARACTER SET charset NATIONAL CHARACTER SET charset SET TIMEZONE = 'time_zone_region' SET TIMEZONE = '{+|-} hh:mm' FORCE LOGGING USER SYS IDENTIFIED BY password USER SYSTEM IDENTIFIED BY password Se puede poner mas de un DATAFILE o LOGFILE separando los nombres de fichero con comas DATAFILE filespec1, filespec2, filespec3 Si no se especifican claves, Oracle establece "change_on_install" para SYS y "manager" para SYSTEM. Despues de crear la base de datos podemos cambiar entre los modos ARCHIVELOG, NOARCHIVELOG con la sentencia ALTER DATABASE.

Create User
Esta sentencia sirve para crear un usuario oracle. Un usuario es un nombre de acceso a la base de datos oracle. Normalmente va asociado a una clave (password). Lo que puede hacer un usuario una vez ha accedido a la base de datos depende de los permisos que tenga asignados ya sea directamente (GRANT) como sobre algun rol que tenga asignado (CREATE ROLE). El perfil que tenga asignado influye en los recursos del sistema de los que dispone un usuario a la hora de ejecutar oracle (CREATE PROFILE).
La sintaxis es:

CREATE USER username IDENTIFIED {BY password | EXTERNALLY | GLOBALLY AS 'external_name'} options; Donde options: DEFAULT TABLESPACE tablespace TEMPORARY TABLESPACE tablespace QUOTA int {K | M} ON tablespace QUOTA UNLIMITED ON tablespace PROFILE profile_name PASSWORD EXPIRE ACCOUNT {LOCK|UNLOCK}
Crea un usuario sin derecho a guardar datos o crear objetos:

CREATE USER usuariolimitado IDENTIFIED BY miclavesecreta;


Crea un usuario con todos los derechos para guardar datos o crear objetos:

DROP USER miusuario CASCADE; CREATE USER miusuario IDENTIFIED BY miclavesecreta DEFAULT TABLESPACE data TEMPORARY TABLESPACE temp QUOTA UNLIMITED ON data; CREATE ROLE programador; GRANT CREATE session, CREATE table, CREATE view, CREATE procedure,CREATE synonym, ALTER table, ALTER view, ALTER procedure,ALTER synonym, DROP table, DROP view, DROP procedure,DROP synonym, TO conn; GRANT programador TO miusuario; Es neceario crear el usuario antes de asignar permisos con GRANT o un ROLE por defecto.

Create Role
Esta sentencia sirve para crear un rol de usuario. Un rol es una forma de agrupar permisos (o privilegios) para asignarlos luego a los usuarios. Cada usuario puede tener varios roles.
Ejemplo de creacin de un rol:

CREATE ROLE MI_PROPIO_ROLE


Crea un rol sin password:

CREATE ROLE role NOT IDENTIFIED

Crea un rol con password:

CREATE ROLE role IDENTIFIED BY password


Crea un rol de aplicacin:

CREATE ROLE role IDENTIFIED USING [schema.]package


Crea un rol basado en uno del S.O.:

ALTER ROLE role IDENTIFIED EXTERNALLY


Crea un rol basado en el servicio de directorio:

ALTER ROLE role IDENTIFIED GLOBALLY


Ejemplo para crear un script que asigna todos los permisos de actual esquema

SELECT decode(object_type, 'TABLE','GRANT SELECT, INSERT, UPDATE, DELETE , REFERENCES ON'||&OWNER||'.', 'VIEW','GRANT SELECT ON '||&OWNER||'.', 'SEQUENCE','GRANT SELECT ON '||&OWNER||'.', 'PROCEDURE','GRANT EXECUTE ON '||&OWNER||'.', 'PACKAGE','GRANT EXECUTE ON '||&OWNER||'.', 'FUNCTION','GRANT EXECUTE ON'||&OWNER||'.' )||object_name||' TO MI_PROPIO_ROLE ;' FROM user_objects WHERE OBJECT_TYPE IN ( 'TABLE', 'VIEW', 'SEQUENCE', 'PROCEDURE', 'PACKAGE','FUNCTION') ORDER BY OBJECT_TYPE

Alter system
Sirve para que el DBA interactue con el sistema de ejecucin.
Para matar un sesin:

SELECT SID,SERIAL# FROM V$SESSION WHERE USERNAME='NOMBRE-USUARIO'; ALTER SYSTEM KILL SESSION 'session-id,session-serial';

Actualizar estadsticas
Consiste en recopilar y actualizar el CATALOGO de oracle con datos estadsticos. En las ultimas versiones, estos datos estadsticos son muy importantes para que oracle pueda elegir el plan de ejecucin ms adecuado a cada sentencia (EXPLAIN PLAN). Estos datos no pueden actualizarse en tiempo real porque penalizaras mucho el rendimiento general de la base de datos.

Se actualizan datos como el nmero de registros de una tabla, el tamao de los objetos, etc. Actualmente hay dos formas de actualiza las estadsticas de las tablas e indices, con el comando ANALYZE y con el paquete DBMS_UTILITY.

Comando ANALYZE
El comando ANALYZE sirve para recopilar y actualizar el CATALOGO de oracle con datos estadsticos. La clusula COMPUTE hace un clculo exacto de la estadsticas (tarda ms en realizarse en ANALYZE) La clusula ESTIMATE hace una estimacin partiendo del anterior valor calculado y de un posible factor de variacin. La clusula DELETE borra las anteriores estadsticas.
Para analizar tabla con sus indices:

ANALYZE TABLE T_PEDIDOS COMPUTE STATISTICS;


Para analizar solo la tabla:

ANALYZE TABLE T_PEDIDOS COMPUTE STATISTICS FOR TABLE;


Para analizar solo sus indices:

ANALYZE TABLE T_PEDIDOS COMPUTE STATISTICS FOR ALL INDEXES;


Para analizar tabla con sus indices por estimacin mirando el 20% de las filas:

ANALYZE TABLE T_PEDIDOS ESTIMATE STATISTICS SAMPLE 20 PERCENT;


Para borrar las estadsticas:

ANALYZE TABLE T_PEDIDOS DELETE STATISTICS;


Sintaxis completa:

ANALYZE TABLE tabla COMPUTE|ESTIMATE|DELETE STATISTICS ptnOption options ANALYZE INDEX indice COMPUTE|ESTIMATE|DELETE STATISTICS ptnOption options ANALYZE CLUSTER cluster COMPUTE|ESTIMATE|DELETE STATISTICS options
donde ptnOption puede ser:

PARTITION (partion) SUBPARTITION (subpartition)


y donde options puede ser:

VALIDATE STRUCTURE [CASCADE] [INTO tablename] LIST CHAINED ROWS [INTO tablename] COMPUTE|ESTIMATE STATISTICS FOR TABLE COMPUTE|ESTIMATE STATISTICS FOR ALL COLUMNS COMPUTE|ESTIMATE STATISTICS FOR ALL INDEXED COLUMNS COMPUTE|ESTIMATE STATISTICS FOR COLUMNS [SIZE int] column [SIZE int]

cuando queremos hacer solo una estimacin debemos elegir una de estas opciones:

... ESTIMATE STATISTICS SAMPLE n ROWS ... ESTIMATE STATISTICS SAMPLE n PERCENT Al validar la estructura se realiza un control de la integridad y puede bloquear la tabla/indice/cluster mientras esta en marcha. El reclculo de las estadsticas necesita gran cantidad de espacio de forma temporal. Podriamos tener que incrementar el valor para SORT_AREA_SIZE. Si usamos la clausula INTO para almacenar una lista de filas enlazadas, la tabla por defecto es CHAINED_ROWS.

Con el paquete DBMS_UTILITY


El comando ANALYZE esta disponible en todas las versiones de oracle, pero es ms comodo, ms rapido y se obtienen mejores resultados si se usa el paquete DBMS_UTILITY y esta disponible a partir de la version 8.0. DBMS_UTILITY.ANALYZE_SCHEMA('PROGRAMADOR','ESTIMATE', NULL, 10) DBMS_UTILITY.ANALYZE_DATABASE('ESTIMATE',NULL,20,NULL)

Audit
Audita una sentencia SQL o el acceso a un objeto especfico de la base de datos.
Para una sentencia SQL:

AUDIT ALL|ALL PRIVILEGES|sentencia_sql|privilegio_sistema [opciones]

Opciones: BY user

BY proxy [ON BEHALF OF ANY|user] BY ACCESS|SESSION [WHENEVER [NOT] SUCCESSFUL]


Para objetos:

AUDIT action on schema.object BY ACCESS|SESSION [WHENEVER [NOT] SUCCESSFUL] AUDIT action on DEFAULT BY ACCESS|SESSION [WHENEVER [NOT] SUCCESSFUL] AUDIT action on DIRECTORY dir_name BY ACCESS|SESSION [WHENEVER [NOT] SUCCESSFUL]

Donde action es una de las siguientes: ALTER, AUDIT, COMMENT, DELETE, EXECUTE, GRANT, INDEX, INSERT, LOCK, RENAME, SELECT, UPDATE Es necesario habilitar la auditoria con el parmetro del init.ora AUDIT_TRAIL = YES

Catlogo
El catlogo de oracle es un conjunto de tablas y vistas que contienen la definicin de la estructura lgica y fsica de la base de datos. Esto incluye los objetos existentes, la situacin de los datafiles, la configuracin de los usuarios, etc.
Los nombres de las tablas de catlogo sigue la siguiente nomenclatura de prefijos:

DBA_ Objetos con informacin de administrador. Slo accesibles por usuarios DBA. USER_ Objetos con informacin del usuario con el que estamos conectado. Proporcionan menos informacin que los objetos DBA_ ALL_ Objetos con informacin de todos los objetos en base de datos. V_$ V$ Tablas virtuales
Existe una tabla de catlogo para cada tipo de objeto posible (en plural).

TABLES, VIEWS, SEQUENCES, TABLESPACES...


Sabiendo esto podemos ver algunos ejemplos:

DBA_TABLES Informacin para administradores de las tablas en base de datos. USER_VIEWS Informacin de las vistas creadas por el usuario desde el que accedemos. ALL_SEQUENCES Informacin de todas las secuencias existentes en base de datos. DBA_TABLESPACES Informacin de administracin sobre los tablespaces.

USER_TAB_COLUMNS Todas las columnas de tabla en el usuario activo. Los objetos de catlogo pueden estar relacionados entre ellos. Por ejemplo, el objeto ALL_TABLES guarda una relacin 1-N con el objeto ALL_TAB_COLUMNS: Una tabla tiene N columnas.
Si se quiere que todos los usuarios tengan algn tipo de acceso a un objeto, podemos dar ese privilegio al rol PUBLIC.

El catlogo pblico son aquellas tablas (USER_ y ALL_) que son accesibles por todos los usuarios. Normalmente dan informacin sobre los objetos creados en la base de datos. El catlogo de sistema (DBA_ y V_$) es accesible slo desde usuarios DBA y contiene tanto informacin de objetos en base de datos, como informacin especfica de la base de datos en s (versin, parmetros, procesos ejecutndose...) Ciertos datos del catlogo de Oracle debe actualizarse para el buen funcionamiento de la base de datos (ANALYZE). Disponemos de un par de tablas en el catlogo pblico 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 informacin en la base de datos, podemos escribir procedimientos o scripts SQL para generar documentacin o generar a su vez scripts.

Dependencias (Recompilacin)
Las actualizaciones, parches y cambios de librerias pueden invalidar objetos del esquema. Una vez realizados los cambios los objetos dependientes sern revalidados de forma AUTOMATICA cuando se usan. Esto puede tardar un rato e incluso tardar un tiempo inaceptable por lo que lo logico es recompilar las dependencias antes de las llamadas de los usuarios. Esto adems permite descubrir si los cambios han afecteado al resto del codigo.
Identificacin de objetos descompilados:

SELECT owner, object_type, object_name, status FROM dba_objects WHERE status = 'INVALID' ORDER BY owner, object_type, object_name; Con esta informacin podemos decidir que metodo seguir para recompilar.

Recompilacin manual
Para un numero pequeo de objetos es probable que la recompilacin manual sea suficiente.

ALTER PACKAGE my_package COMPILE; ALTER PACKAGE my_package COMPILE BODY; ALTER ALTER ALTER ALTER PROCEDURE my_procedure COMPILE; FUNCTION my_function COMPILE; TRIGGER my_trigger COMPILE; VIEW my_view COMPILE;

Hay que tener en cuenta que es necesario recompilar cabecera y cuerpo del paquete por separado.
Alternativamente podemos usa el paquete DBMS_DDL:

EXEC DBMS_DDL('PACKAGE', 'MY_SCHEMA', 'MY_PACKAGE'); EXEC DBMS_DDL('PACKAGE BODY', 'MY_SCHEMA', 'MY_PACKAGE'); EXEC DBMS_DDL('PROCEDURE', 'MY_SCHEMA', 'MY_PROCEDURE'); EXEC DBMS_DDL('FUNCTION', 'MY_SCHEMA', 'MY_FUNCTION'); EXEC DBMS_DDL('TRIGGER', 'MY_SCHEMA', 'MY_TRIGGER'); Este metodo esta limitado a los objetos PL/SQL por lo que no es aplicable a vistas.

Script a medida
En algunos casos puede ser interesante escribir un script para identificar y compilar objetos descompilados.
Un ejemplo para PACKAGE y PACKAGE BODY seria:

SET SERVEROUTPUT ON SIZE 1000000 BEGIN FOR cur_rec IN (SELECT owner, object_name, object_type, DECODE(object_type, 'PACKAGE', 1,'PACKAGE BODY', 2, 2) AS recompile_order FROM dba_objects WHERE object_type IN ('PACKAGE', 'PACKAGE BODY') AND status != 'VALID' ORDER BY 4) LOOP BEGIN IF cur_rec.object_type = 'PACKAGE' THEN EXECUTE IMMEDIATE 'ALTER ' || cur_rec.object_type || ' "' || cur_rec.owner || '"."' || cur_rec.object_name || '" COMPILE'; ElSE EXECUTE IMMEDIATE 'ALTER PACKAGE "' || cur_rec.owner || '"."' || cur_rec.object_name || '" COMPILE BODY'; END IF; EXCEPTION WHEN OTHERS THEN DBMS_OUTPUT.put_line(cur_rec.object_type || ' : ' || cur_rec.owner || ' : ' || cur_rec.object_name);

END; END LOOP; END; / Con este metodo hay que tener mucho cuidado ya que puedes acabar recompilando algunos objetos varias veces dependiendo del orden de ejecucion de la recompilacin. Los procedimientos que nos da oracle y que estn explicados a continuacin si que tiene en cuenta el orden adecuado.

DBMS_UTILITY.COMPILE_SCHEMA
El procedimiento COMPILE_SCHEMA del paquete DBMS_UTILITY compila todos los procedures, functions, packages, y triggers de un esquema. Hay que tener muy en cuenta que tampoco recompila las vistas. EXEC DBMS_UTILITY.COMPILE_SCHEMA(schema => 'PROGRAMADOR');

UTL_RECOMP
El paquete UTL_RECOMP contiene 2 procedimientos para recompilar objetos descompilados. RECOMP_SERIAL recompila los objetos uno por uno mientras que RECOMP_PARALLEL recompila en paralelo usando el numero de threads especificado.
Para esquemas:

EXEC UTL_RECOMP.RECOMP_SERIAL('PROGRAMADOR'); EXEC UTL_RECOMP.RECOMP_PARALLEL(4, 'PROGRAMADOR');-- 4 es el numero de threads a utilizar


Para base de datos:

EXEC UTL_RECOMP.RECOMP_SERIAL(); --todos los esquemas EXEC UTL_RECOMP.RECOMP_PARALLEL(4);


Usando el valor de job_queue_processes

EXEC UTL_RECOMP.RECOMP_PARALLEL(); --se usa para theads el valor de "job_queue_processes" EXEC UTL_RECOMP.RECOMP_PARALLEL(NULL, 'PROGRAMADOR');
Restricciones del paquete:

La ejecucion en paralelo utiliza la cola de trabajos. Todos los trabajos se dehabilitan hasta que la operacin termina. Debe ejecutarse con el usuario SYS u otros con permisos de SYSDBA. Deber exitir STANDARD, DBMS_STANDARD, DBMS_JOB and DBMS_RANDOM. El ejecutar comandos DDL a la vez puede provocar interbloqueos.

EXPLAIN PLAN (plan de ejecucin)


Esta sentencia guarda el plan de ejecucin para una sentencia SQL en una tabla. Cada vez que ejecutamos una sentencia una de las cosas que hace oracle es crear un plan de ejecucin de la sentencia. Un plan de ejecucin define la forma en que oracle busca o graba los datos. Decide, por ejemplo, si va a usar o no los indices en una sentencia SELECT.
Esta es la sintaxis general:

EXPLAIN PLAN [SET STATEMENT_ID = 'text'] FOR sentencia;


Podemos usar nuestra propia tabla de explain:

EXPLAIN PLAN [SET STATEMENT_ID = 'text'] INTO [esquema.]tabla@dblink FOR sentencia; Si no definimos nuestra propia tabla se usa la tabla PLAN_TABLE.
Ejemplo:

DELETE PLAN_TABLE; EXPLAIN PLAN FOR SELECT * FROM T_PEDIDOS WHERE CODPEDIDO = 5;
Para ver el resultado:

SELECT SUBSTR (LPAD(' ', LEVEL-1) || OPERATION || ' (' || OPTIONS || ')',1,30 ) "OPERACION", OBJECT_NAME "OBJETO" FROM PLAN_TABLE START WITH ID = 0 CONNECT BY PRIOR ID=PARENT_ID;
Sobre todo hay que evitar bsquedas del tipo FULL TABLE SCAN.

Export
Es una utilidad que genera un archivo binario con toda la informacin de estructura y contenido de una base de datos. Estos archivos slo pueden ser ledos por la utilidad de importacin de Oracle (IMPORT). Incluye todas las definiciones de objetos y los datos que se deseen dentro de una base de datos.
En unix es simplemente exp.

EXP80

usuario/password

[opciones...]

Para simplificar la utilizacin del comando, las opciones se pueden escribir en un archivo de texto y referenciar desde la lnea de comandos de la siguiente manera:

EXP80

usuario/password

PARFILE=archivo

[opciones...]

Es posible obtener una lista de las opciones disponibles escribiendo:

EXP80 HELP=Y;
Usos:

Backup de la base de datos: Puede usarse para hacer una copia completa de la base de datos, aunque no es lo mas eficiente. Mover datos entre bases de datos: Los datos y objetos exportados desde una base de datos pueden perfectamente ser recuperados en otra diferente. Reconstruir una base de datos: Si su base de datos tiene los tablespaces demasiado fragmentados, sta es una buena opcin para volver a compactarlos. Reorganizar los datafiles: Siguiendo la misma lgica anterior, tambin se puede redistribuir la informacin en los archivos fsicos que se desee.

Y las opciones son siempre del tipo PARMETRO=valor. Ya sea que se utilice un archivo paramtrico o no, la mayora de los parmetros que se pueden utilizar en la sintaxis de este comando son:

BUFFER=bytes Especifica el tamao del buffer de copia (en bytes). Si el valor es cero, entonces se recuperan las filas de a una.

COMPRESS=[Y o N] Este parmetro indica cmo deber tratarse la extensin inicial. Con "Y", entonces toda la informacin se consolidar dentro de una nica extensin. Con "N", se utilizarn los parmetros vigentes para la clusula STORAGE. Por defecto es "Y". CONSISTENT=[Y o N] Con "Y", espera a que la informacin que se est actualizando sea confirmada. Es una opcin muy costosa en tiempo y recursos. Por defecto es "N". CONSTRAINTS=[Y o N] Indica si se exportan las restricciones de las tablas. Por defecto es "Y". FILE=nombre_archivo Especifica el nombre del archivo de salida, es decir, del archivo de exportacin. FULL=[Y o N] Indica si se hace una exportacin completa de la base de datos. Por defecto es "N". GRANTS=[Y o N] Indica si se exportan los permisos (grants) de cada usuario sobre los objetos exportados. INDEXES=[Y o N] Indica si se exportan los ndices. Por defecto es "Y".

ROWS=[Y o N] Indica si se exportan los datos ("Y") o solo la estructura de los objetos ("N"). OWNER=usuarios Es la lista de usuarios (esquemas) desde donde se realizar la exportacin. Se separan por coma. TABLES=(tabla1, tabla2...) Lista de tablas que se van a exportar. Es vlido cuando slo se exporta un solo esquema de usuario.

Import
Realiza la carga de un archivo binario en la base de datos, previamente generado con la utilidad EXPORT. Las opciones de esta utilidad son similares a las de exportacin.
Es posible obtener una lista de las opciones disponibles escribiendo:

IMP80 HELP=Y;
A continuacin slo presentaremos algunas de ellas, que no son comunes a ambos programas.

FROMUSER=usuario Si un fichero de export contiene varios esquemas podemos seleccionar que esquema importar. TOUSER=usuario Es el esquema de destino hacia donde se desean importar los objetos desde el archivo. IGNORE=[Y o N] Con "Y" no se har ninguna advertencia ni se detendr al dar errores. Con "N" la importacin se detendr ante cualquier error. TABLES=(tabla1, tabla2,...) Es la lista de tablas que se desean importar desde el archivo.

Hints (Sugerencias al optimizador)


Los hints son parametros que pasamos a las sentencias SQL para influir en el optimizador de oracle. SELECT /*+ HINT */ . . . Toda consulta SELECT se ejecuta dentro del servidor en varios pasos. Para la misma consulta, pueden existir distintos caminos para conseguir el mismo resultados, por lo que el servidor es el responsable de decidir qu camino seguir para conseguir el mejor tiempo de respuesta. La parte de la base de datos que se encarga de estas decisiones se llama Optimizador. El camino seguido por el servidor para la ejecucin de una consulta se denomina "Plan de ejecucin" (ver EXPLAIN PLAN).

Hay que tener en cuenta que: 1. si no es posible efectuar lo que se indica con el hint, Oracle lo ignorar, 2. los Hints fuerzan el uso del Optimizador por costes (a excepcin de rule) 3. no afectan a subconsultas en la misma sentencia SQL.

Optimizador por reglas (RULE)


se basa en ciertas reglas para realizar las consultas. Por ejemplo, si se filtra por un campo indexado, se utilizar el ndice. Si la consulta contiene un ORDER BY, se utilizar un algoritmo Quick Sort, etc. No tiene en cuenta el estado actual de la base de datos, ni el nmero de usuarios conectados, ni la carga de datos de los objetos, etc. Es un sistema de optimizacin esttico, no vara de un momento a otro.

Optimizador por costes (CHOOSE)


se basa en las reglas bsicas, pero teniendo en cuenta el estado actual de la base de datos. Es decir, tiene en cuenta el nmero de registros de las tablas, el nmero de usuarios accediendo a ellas, etc. Por ejemplo, si se hace una consulta utilizando un campo indexado, mirar primero el nmero de registros y si es suficientemente grande entonces merecer la pena acceder por el ndice, si no, acceder directamente a la tabla. Para averiguar el estado actual de la base de datos se basa en los datos del catlogo pblico, por lo que es recomendable que est lo ms actualizado posible (a travs de la sentencia ANALYZE), ya que de no ser as, se pueden tomar decisiones a partir de datos desfasados (la tabla tena 10 registros hace un mes pero ahora tiene 10.000). Oracle recomienda que todas las consultas se hagan por costes, aunque hay ciertos casos en los que una consulta no se resuelve (o tarda mucho) por costes y por reglas es inmediata. Y cmo hacer que una consulta se ejecute por reglas o por costes? Pues hay dos modos de forzar a Oracle a que utilice un optimizados.
La primera es modificando la sesin activa para que todas las consultas sean optimizadas de una manera:

ALTER SESSION SET OPTIMIZER_GOAL = [RULE|CHOOSE];


Con esto todas las consultas se ejecutarn utilizando el optimizador indicado. La otra manera es forzando a Oracle a que utilice un optimizador en una consulta concreta. Esto se hace a travs de los hits o sugerencias. Un hint es un comentario dentro de una consulta SELECT que informa a Oracle del modo en que tiene que trazar el plan de ejecucin. Los hint deben ir junto detrs de la palabra SELECT: A continuacin se muestra una lista de algunos de los hints posibles:

/*+ ALL_ROWS */ Pone la consulta a costes y la optimiza para que consuma el menor nmero de recursos posibles. /*+ FIRST_ROWS */ Pone la consulta a costes la optimiza para conseguir el mejor tiempo de respuesta. /*+ CHOOSE */ Pone la consulta a costes. /*+ RULE */ Pone la consulta a reglas.

/*+ INDEX( tabla ndice ) */ Fuerza la utilizacin del ndice indicado para la tabla indicada /*+ ORDERED */ Hace que las combinaciones de las tablas se hagan en el mismo orden en que aparecen en el join.

Comando shutdown
Para una instancia de la base de datos. SHUTDOWN SHUTDOWN ABORT SHUTDOWN IMMEDIATE SHUTDOWN NORMAL SHUTDOWN TRANSACTIONAL SHUTDOWN TRANSACTIONAL LOCAL Es necesario estar conectado como SYSDBA o SYSOPER.

Comando startup
Arranca una instancia de la base de datos. STARTUP STARTUP NOMOUNT STARTUP MOUNT STARTUP RESTRICT STARTUP OPEN RECOVER

STARTUP PFILE = /PATH/TO/INIT.ORA Es necesario estar conectado como SYSDBA o SYSOPER

SQL Trace (Trazas de ejecucin)


Las trazas de ejecucin de oracle sirven para mostrar las sentencias SQL y su plan de ejecucin de programas que acceden a bases de datos Oracle. No es necesario disponer del cdigo fuente ni de la sentencia SQL para saber qu y cmo se ejecutado.

Bsicamente, activar la traza de ejecucin consiste en ejecutar un procedimiento que tiene predefinido Oracle dentro del paquete DBMS_SYSTEM.
El procedimiento tiene la siguiente cabecera:

SYS.DBMS_SYSTEM.SET_SQL_TRACE_IN_SESSION( sid, serial#, TRUE/FALSE );


Podemos obtener estos parmetros:

SELECT SID, SERIAL#, MACHINE, TERMINAL, PROGRAM FROM SYS.V_$SESSION WHERE USERNAME = 'usuario'; SID y SERIAL# definen la sesin a la cual queremos hacer con la traza. El tercer parmetro indica si queremos activar/desactivar la traza de ejecucin. Una vez activada la traza con SET_SQL_TRACE_IN_SESSION, toda sentencia ejecutada sobre la sesin indicada quedar registrada en un archivo .TRC, normalmente bajo el directorio ORACLE_HOME/trace80 Este fichero contiene informacin detallada (pero ilegible) de los planes de ejecucin. Para conseguir una salida legible de esta traza se debe ejecutar la utilidad TKPROF.

Trazas con SQL*Plus


Otra forma de hacer trazas de ejecucin es en SQL*Plus, con la instruccin: SET AUTO TRACE ON/OFF Una vez activada la auto-traza, toda sentencia ejecutada en SQL*Plus vendr acompaada de su plan y estadsticas de ejecucin. Si, adems, queremos cronometrar el tiempo de ejecucin de cada consulta, podemos activar el cronmetro con: SET TIMING ON

SET
Configuracin SQLPLUS.

SET TERM

OFF

-- TERM = ON will display on terminal screen (OFF = show in LOG only)

SET ECHO

ON

-- ECHO = ON will Display the command on screen (+ spool)

-- ECHO = OFF will Display the command on screen but not in spool files. -- Interactive commands are always echoed to screen/spool.

SET TRIMOUT ON -- TRIMOUT = ON will remove trailing spaces from output SET TRIMSPOOL ON -- TRIMSPOOL = ON will remove trailing spaces from spooled output SET HEADING OFF -- HEADING = OFF will hide column headings SET FEEDBACK OFF -- FEEDBACK = ON will count rows returned SET PAUSE OFF -- PAUSE = ON .. press return at end of each page SET PAGESIZE 0 -- PAGESIZE = height 54 is 11 inches (0 will supress all headings and page brks) SET LINESIZE 80 -- LINESIZE = width of page (80 is typical) SET VERIFY OFF -- VERIFY = ON will show before and after substitution variables -- Start spooling to a log file SPOOL C:\TEMP\MY_LOG_FILE.LOG --- The rest of the SQL commands go here -SELECT * FROM GLOBAL_NAME; SPOOL OFF

Tunning (optimizacin)
El objetivo de tunning es la puesta a punto (optimizacin) de las sentencias SQL, desde el punto de vista del tiempo de ejecucin y consumo de recursos.
Podemos examinar el comportamiento de una sentencia SQL analizando su plan de ejecucin: 1. con la sentencia EXPLAIN PLAN 2. con trazas TRACE Para optimizar las sentencias SQL podemos: 1. Crear indices adecuados y fomentar su uso (CREATE INDEX). 2. Aplicar HINTS para modificar o influenciar las decisiones del optimizador. 3. Actualizar estadsticas periodicamente (ANALYZE). 4. Usar clausulas STORAGE adecuada en la creacin de tablas (CREATE TABLE). 5. Usar EXPORT IMPORT. 6. Cuidar la programacin.

En particular debemos prestar atencin la sentencias SELECT que son ms dadas a la complejidad.

Indices
Respecto a los indices debemos tener en cuenta: 1. Crear ndices sobre columnas lo ms selectivas posibles (aquellas que reducen al mximo el espacio de bsqueda). 2. En el caso de los ndices compuestos, el orden en el que se declaran estas columnas deber ser de la ms selectiva a la menos selectiva (siempre que sea posible). 3. En algunos casos es conveniente sustituir ndices compuestos por varios ndices simples.

Programacin
Respecto a la programacin: 1. Limitar los accesos a tablas remotas. 2. Utilizar la clusula UNION ALL en lugar de UNION siempre que sea posible. 3. Evitar el uso de llamadas a funciones PL/SQL en sentencias SQL. 4. En cambio para determinados problemas, puede ser til el uso de procedimientos o funciones PL/SQL almacenados en la base de datos en lugar de una sentencia SQL (con un cursor p.ej.). 5. Considerar que hay distintas opciones para obtener el mismo resultado. 6. El orden de las tablas en el Join puede ser importante. 7. Se deben optimizar tambien las subconsultas. 8. Considerar en algunos casos alternativas al Join (consultas anidadas, clusula exists subconsulta , outer-join etc...). 9. Revisar las consultas periodicamente, pueden no se ya optimas debido al constante cambio en el tamao de las tablas, la distribucin de los valores, el esquema etc....

Adems
1. Gestin de las sentencias SQL que contienen vistas. Si una consulta contiene una vista, el optimizador tiene dos formas de actuar: resolver primero la vista y despus la consulta o integrar la vista en el texto de la misma. Si se resuelve primero la vista, el resultado completo de la vista se determina en primer lugar y, el resto de las condiciones de la consulta se aplican como filtro. Dependiendo del tamao de las tablas involucradas puede resultar conveniente hacerlo de un modo u otro. Debemos tener en cuenta que, si una vista contiene una operacin de conjunto (GROUP BY, SUM, COUNT o DISTINCT), no podr ser integrada en la consulta. 2. Considerar el uso de las bind variables: Las sentencias pueden recoger los parmetros por valor (where salario>1000) o una vez compilada la sentencia haciendo uso de Bind Variables (where salario>:b1). La ventaja de la segunda opcin es que Oracle compila un nica vez la sentencia y reutiliza el cdigo compilado para cada uno de los valores para los parmetros. En este segundo caso, Oracle no puede calcular el grado de selectividad de una consulta y, en su lugar, aplica un grado de selectividad por defecto (asociado a cada tipo de operacin), lo cual puede dar lugar a decisiones "equivocadas". Por lo tanto, trabajando por costes es desaconsejable el uso de Bind Variables, salvo que trabajemos con sentencias que se van a ejecutar repetidas veces y que no ofrezcan muchas dudas en cuanto a los posibles planes de acceso que puede generar. 3. Utilizar las clusulas start with y connect by en el caso de consultas sobre datos relacionados por alguna relacin de herencia.

Tratamiento de usuarios y permisos para el administrador de la base de datos (DBA)


Aqui esta definida la sintaxis de las sentencias que puede (y debe) usar el administrador de la base de datos o DBA (Database administrator) de oracle como CREATE USER, CREATE ROLE, CREATE PROFILE, etc... Es necesario tener clara la diferencia entre usuarios, roles, perfiles, permisos (privilegios) y limites. Un rol es una forma de agrupar permisos (o privilegios) para asignarlos luego a los usuarios. Un permiso se puede asignar a un usuario o a un rol. Los permisos se asignan mediante la sentencia GRANT y se quitan mediante la sentencia REVOKE.
La forma correcta de trabajar es: Crear uno o varios Role (CREATE ROLE) Dar permisos de objeto y sistema al rol (GRANT ... TO mirole) Dar el rol a los usuarios (GRANT mirole TO miusuario) Esta forma de trabajar tiene varias ventajas:

La asignacin de recursos es mas rapida. Nuevos permisos asignados a un rol estaran inmediatamente disponibles a los usuarios conectados. Sin embargo los nuevos permisos asignados a un usuario necesitan de reconexin. El permiso de UNLIMITED TABLESPACE debe ser directo. Permisos a usuarios que ejecutan trabajos en segundo plano (dbms_job.submit) deben ser directos, cuando el trabajo comienza no hay roles activos.

Excepciones:

Create profile
Esta sentencia sirve para crear un perfil de usuario. Un perfil de usuario es una forma de limitar los recursos que puede utilizar un usuario. Cada usuario puede tener un nico perfil. Antes de asignar un perfil a un usuario es necesario que este perfil exista en la base de datos. Un perfil se asigna en la creacin de un usuario CREATE USER o modificandolo ALTER USER.
Un ejemplo de script sera:

CREATE PROFILE app_user LIMIT SESSIONS_PER_USER CPU_PER_SESSION CPU_PER_CALL CONNECT_TIME 2 10000 1 UNLIMITED --- decimas de segundo -- decimas de segundo -- minutos

IDLE_TIME 30 LOGICAL_READS_PER_SESSION DEFAULT LOGICAL_READS_PER_CALL DEFAULT -- COMPOSITE_LIMIT DEFAULT PRIVATE_SGA 20M FAILED_LOGIN_ATTEMPTS 3 PASSWORD_LIFE_TIME 30 PASSWORD_REUSE_TIME 12 PASSWORD_REUSE_MAX UNLIMITED PASSWORD_LOCK_TIME DEFAULT PASSWORD_GRACE_TIME 2 PASSWORD_VERIFY_FUNCTION NULL;

------------

minutos DB BLOCKS DB BLOCKS

dias dias dias

Los recursos que limitamos son recursos del kernel: uso de la CPU, duracin de sesion,... Y tambien limites de uso de las claves de acceso (passwords): duracin, intentos de acceso, reuso, ...
Por ejemplo:

ALTER PROFILE default LIMIT IDLE_TIME

20;

Limita el perfil por defecto a 20 minutos. IDLE_TIME: Es el tiempo que puede estar una sesin sin hacer nada antes de ser cerrada.

Create Role
Esta sentencia sirve para crear un rol de usuario. Un rol es una forma de agrupar permisos (o privilegios) para asignarlos luego a los usuarios. Cada usuario puede tener varios roles.
Ejemplo de creacin de un rol:

CREATE ROLE MI_PROPIO_ROLE


Crea un rol sin password:

CREATE ROLE role NOT IDENTIFIED


Crea un rol con password:

CREATE ROLE role IDENTIFIED BY password


Crea un rol de aplicacin:

CREATE ROLE role IDENTIFIED USING [schema.]package


Crea un rol basado en uno del S.O.:

ALTER ROLE role IDENTIFIED EXTERNALLY


Crea un rol basado en el servicio de directorio:

ALTER ROLE role IDENTIFIED GLOBALLY


Ejemplo para crear un script que asigna todos los permisos de actual esquema

SELECT decode(object_type, 'TABLE','GRANT SELECT, INSERT, UPDATE, DELETE , REFERENCES ON'||&OWNER||'.', 'VIEW','GRANT SELECT ON '||&OWNER||'.', 'SEQUENCE','GRANT SELECT ON '||&OWNER||'.', 'PROCEDURE','GRANT EXECUTE ON '||&OWNER||'.', 'PACKAGE','GRANT EXECUTE ON '||&OWNER||'.', 'FUNCTION','GRANT EXECUTE ON'||&OWNER||'.' )||object_name||' TO MI_PROPIO_ROLE ;' FROM user_objects WHERE OBJECT_TYPE IN ( 'TABLE', 'VIEW', 'SEQUENCE', 'PROCEDURE', 'PACKAGE','FUNCTION') ORDER BY OBJECT_TYPE

Create User
Esta sentencia sirve para crear un usuario oracle. Un usuario es un nombre de acceso a la base de datos oracle. Normalmente va asociado a una clave (password). Lo que puede hacer un usuario una vez ha accedido a la base de datos depende de los permisos que tenga asignados ya sea directamente (GRANT) como sobre algun rol que tenga asignado (CREATE ROLE). El perfil que tenga asignado influye en los recursos del sistema de los que dispone un usuario a la hora de ejecutar oracle (CREATE PROFILE).
La sintaxis es:

CREATE USER username IDENTIFIED {BY password | EXTERNALLY | GLOBALLY AS 'external_name'} options; Donde options: DEFAULT TABLESPACE tablespace TEMPORARY TABLESPACE tablespace QUOTA int {K | M} ON tablespace QUOTA UNLIMITED ON tablespace PROFILE profile_name PASSWORD EXPIRE ACCOUNT {LOCK|UNLOCK}
Crea un usuario sin derecho a guardar datos o crear objetos:

CREATE USER usuariolimitado IDENTIFIED BY miclavesecreta;


Crea un usuario con todos los derechos para guardar datos o crear objetos:

DROP USER miusuario CASCADE;

CREATE USER miusuario IDENTIFIED BY miclavesecreta DEFAULT TABLESPACE data TEMPORARY TABLESPACE temp QUOTA UNLIMITED ON data; CREATE ROLE programador; GRANT CREATE session, CREATE table, CREATE view, CREATE procedure,CREATE synonym, ALTER table, ALTER view, ALTER procedure,ALTER synonym, DROP table, DROP view, DROP procedure,DROP synonym, TO conn; GRANT programador TO miusuario; Es neceario crear el usuario antes de asignar permisos con GRANT o un ROLE por defecto.

Grant (dar permisos)


Esta sentencia sirve para dar permisos (o privilegios) a un usuario o a un rol. Un permiso, en oracle, es un derecho a ejecutar un sentencia (system privileges) o a acceder a un objeto de otro usuario (object privileges). El conjunto de permisos es fijo, esto quiere decir que no se pueden crear nuevos tipos de permisos. Si un permiso se asigna a rol especial PUBLIC significa que puede ser ejecutado por todos los usuarios.
Permisos para acceder a la base de datos (permiso de sistema):

GRANT CREATE SESSION TO miusuario;


Permisos para usuario de modificacin de datos (permiso sobre objeto):

GRANT SELECT, INSERT, UPDATE, DELETE ON T_PEDIDOS TO miusuario;


Permisos de solo lectura para todos:

GRANT SELECT ON T_PEDIDOS TO PUBLIC;

Permisos de sistema (system privileges)


Los permisos de sistema mas importantes son CREATE SESSION, CREATE TABLE, CREATE VIEW, CREATE USER, ...
Sintaxis:

GRANT system_priv(s) TO {user, | role, |PUBLIC} [IDENTIFIED BY password] [WITH ADMIN OPTION] GRANT role TO {user, | role, |PUBLIC}

[IDENTIFIED BY password] [WITH ADMIN OPTION] GRANT ALL PRIVILEGES TO {user, | role, |PUBLIC} [IDENTIFIED BY password] [WITH ADMIN OPTION]
Podemos obtener la lista de permisos del sistema asi:

select * from system_privilege_map; Los permisos de sistema son auditables. GRANT CREATE SESSION, CREATE TABLE, CREATE VIEW, CREATE PROCEDURE,CREATE SYNONYM, ALTER TABLE, ALTER VIEW, ALTER PROCEDURE,ALTER SYNONYM, DROP TABLE, DROP VIEW, DROP PROCEDURE,DROP SYNONYM TO programador;

Permisos sobre objetos (object privileges)


Los permisos sobre objetos mas importantes son: SELECT, UPDATE, INSERT, DELETE, ALTER, DEBUG, EXECUTE, INDEX, REFERENCES GRANT object_priv [(column, column,...)] ON [schema.]object TO {user, | role, |PUBLIC} [WITH GRANT OPTION] [WITH HIERARCHY OPTION] GRANT ALL PRIVILEGES [(column, column,...)] ON [schema.]object TO {user, | role, |PUBLIC} [WITH GRANT OPTION] [WITH HIERARCHY OPTION] GRANT object_priv [(column, column,...)] ON DIRECTORY directory_name TO {user, | role, |PUBLIC} [WITH GRANT OPTION] [WITH HIERARCHY OPTION] GRANT object_priv [(column, column,...)] ON JAVA [RE]SOURCE [schema.]object TO {user, | role, |PUBLIC} [WITH GRANT OPTION] [WITH HIERARCHY OPTION] Con la opcion WITH HIERARCHY OPTION damos permisos sobre todos los subojetos, incluso sobre los que se creen despues de ejecutar el GRANT. Con la opcin WITH GRANT OPTION damos permiso para que el que los recibe los pueda a su vez asignar a otros usuarios y roles. La opcin "GRANT ALL PRIVILEGES..." se puede escribir tambien como "GRANT ALL..."

Podemos obtener la lista de permisos de las tablas asi:

select * from all_tab_privs_made;

Notas
Los permisos del sistema pueden ser:

CREATE SESSION - Permite conectar a la base de datos UNLIMITED TABLESPACE - Uso de espacio ilimitado del tablespace.

SELECT ANY TABLE - Consultas en tables, views, or mviews en cualquier esquema UPDATE ANY TABLE - Actualizar filas en tables and views en cualquier esquema INSERT ANY TABLE - Insertar filas en tables and views en cualquier esquema Permisos de administrador para CREATE, ALTER o DROP: cluster, context, database, link, dimension, directory, index, materialized view, operator, outline, procedure, profile, role, rollback segment, sequence, session, synonym, table, tablespace, trigger, type, user, view.
Los roles predefindos son:

SYSDBA, SYSOPER, OSDBA, OSOPER, EXP_FULL_DATABASE, IMP_FULL_DATABASE SELECT_CATALOG_ROLE, EXECUTE_CATALOG_ROLE, DELETE_CATALOG_ROLE AQ_USER_ROLE, AQ_ADMINISTRATOR_ROLE - manejo de la cola SNMPAGENT - Agente inteligente. RECOVERY_CATALOG_OWNER - rman HS_ADMIN_ROLE - servicios heterogeneos mas cualquier rol de usuario que halla disponible Los roles CONNECT, RESOURCE y DBA ya no deben usarse (aunque estan soportados).
Es posible asignar varios Object_Privs en un solo comando GRANT.

GRANT SELECT (empno), UPDATE (sal) ON pepe.tabla TO miusuario


Permisos del rol SYSDBA:

CREATE DATABASE CREATE SPFILE STARTUP and SHUTDOWN ALTER DATABASE: open, mount, back up, or change character set ARCHIVELOG and RECOVERY Includes the RESTRICTED SESSION privilege
Permisos del rol SYSOPER:

CREATE SPFILE STARTUP and SHUTDOWN ALTER DATABASE: open, mount, back up ARCHIVELOG and RECOVERY Includes the RESTRICTED SESSION privilege Cada tipo de objeto tiene su propio conjunto de permisos: Tables: select, insert, update, delete, alter, debug, flashback, on commit refresh, query rewrite, references, all Views: select, insert, update, delete, under, references, flashback, debug Sequence: alter, select Packeges, Procedures, Functions (Java classes, sources...): execute, debug Materialized Views: delete, flashback, insert, select, update Directories: read, write Libraries:execute User defined types: execute, debug, under Operators: execute Indextypes: execute

Revoke (quitar permisos)


Esta sentencia sirve para quitar permisos (o privilegios) a un usuario o a un rol.
No dejamos nada:

REVOKE ALL PRIVILEGES FROM miusuario;


Quitamos todo:

REVOKE ALL ON T_PEDIDOS FROM miusuario;


Sintaxis, quitar un rol asignado:

REVOKE role FROM {user, | role, |PUBLIC}


Quitar un permiso de sistema:

REVOKE system_priv(s) FROM {user, | role, |PUBLIC}

REVOKE ALL FROM {user, | role, |PUBLIC}

system_privs ALTER ANY INDEX, BECOME USER, CREATE TABLE, DROP ANY VIEW RESTRICTED SESSION, UNLIMITED TABLESPACE, UPDATE ANY TABLE y mas...
Quitar un permiso de objeto:

REVOKE object_priv [(column1, column2..)] ON [schema.]object FROM {user, | role, |PUBLIC} [CASCADE CONSTRAINTS] [FORCE] REVOKE object_priv [(column1, column2..)] ON [schema.]object FROM {user, | role, |PUBLIC} [CASCADE CONSTRAINTS] [FORCE] REVOKE object_priv [(column1, column2..)] ON DIRECTORY directory_name FROM {user, | role, |PUBLIC} [CASCADE CONSTRAINTS] [FORCE] REVOKE object_priv [(column1, column2..)] ON JAVA [RE]SOURCE [schema.]object FROM {user, | role, |PUBLIC} [CASCADE CONSTRAINTS] [FORCE] opciones: object_privs ALTER, DELETE, EXECUTE, INDEX, INSERT, REFERENCES, SELECT, UPDATE, ALL PRIVILEGES La opcin FORCE, quita todos los privilegios y descompila todos sus objetos.
roles standard de Oracle:

SYSDBA, SYSOPER, OSDBA, OSOPER, EXP_FULL_DATABASE, IMP_FULL_DATABASE mas todos los roles definidos en la base de datos

Data Definition Language


Aqui esta definida la sintaxis de las sentencias del lenguaje de definicion de datos (Data Definition Language o DDL) de oracle como CREATE TABLE, CREATE INDEX, CREATE USER, etc...,

Alter table
Sirve para cambiar la definicin de una tabla. Podemos cambiar tanto columnas como restricciones (ver CONSTRAINTS).
La sintaxis es:

ALTER TABLE [esquema.]tabla {ADD|MODIFY|DROP}...


Aadir una columna a una tabla:

ALTER TABLE T_PEDIDOS ADD TEXTOPEDIDO Varchar2(35);


Cambiar el tamao de una columna en una tabla:

ALTER TABLE T_PEDIDOS MODIFY TEXTOPEDIDO Varchar2(135);


Hacer NOT NULL una columna en una tabla:

ALTER TABLE T_PEDIDOS MODIFY (TEXTOPEDIDO NOT NULL);


Eliminar una columna a una tabla:

ALTER TABLE T_PEDIDOS DROP COLUMN TEXTOPEDIDO;


Valor por defecto de una columna:

ALTER TABLE T_PEDIDOS MODIFY TEXTOPEDIDO Varchar2(135) DEFAULT 'ABC...';


Aade dos columnas:

ALTER TABLE T_PEDIDOS ADD (SO_PEDIDOS_ID INT, TEXTOPEDIDO Varchar2(135));

Comment
Pone un comentario en le diccionario de datos.
Sintaxis para tablas y vistas:

COMMENT ON TABLE [esquema.]tabla IS 'comentario'; COMMENT ON TABLE [esquema.]vista IS 'comentario'; COMMENT ON TABLE [esquema.]vista_materilizada IS 'comentario';
Sintaxis para columnas:

COMMENT ON COLUMN [esquema.]tabla.columna IS 'comentario'; COMMENT ON COLUMN [esquema.]vista.columna IS 'comentario'; COMMENT ON COLUMN [esquema.]vista_materilizada.columna IS 'comentario';
Ejemplo de tabla y columna:

COMMENT ON TABLE T_PRODUCTOS IS 'Tabla de productos'; COMMENT ON COLUMN T_PRODUCTOS.numproduct IS 'Codigo de 6 digitos del producto'; COMMENT ON COLUMN T_PRODUCTOS.desproduct IS 'Descripcion del producto';
Para borrar un comentario hay que ponerle la cadena vacia ''.

COMMENT ON TABLE T_PRODUCTOS IS ''; COMMENT ON COLUMN T_PRODUCTOS.numproduct IS '';

Constraints
Para cambiar las restricciones y la clave primaria de una tabla debemos usar ALTER TABLE.
Crear una clave primaria (primary key):

ALTER TABLE T_PEDIDOS ADD CONSTRAINT PK_PEDIDOS PRIMARY KEY (numpedido,lineapedido);


Crear una clave externa, para integridad referencial (foreign key):

ALTER TABLE T_PEDIDOS ADD CONSTRAINT FK_PEDIDOS_CLIENTES FOREIGN KEY (codcliente) REFERENCES T_CLIENTES (codcliente));
Crear un control de valores (check constraint):

ALTER TABLE T_PEDIDOS ADD CONSTRAINT CK_ESTADO CHECK (estado IN (1,2,3));


Crear una restriccin UNIQUE:

ALTER TABLE T_PEDIDOS ADD CONSTRAINT UK_ESTADO UNIQUE (correosid); Normalmente una restriccin de este tipo se implementa mediante un indice unico (ver CREATE INDEX).
Borrar una restriccin:

ALTER TABLE T_PEDIDOS DROP CONSTRAINT CON1_PEDIDOS;


Deshabilita una restriccin:

ALTER TABLE T_PEDIDOS DISABLE CONSTRAINT CON1_PEDIDOS;


habilita una restriccin:

ALTER TABLE T_PEDIDOS ENABLE CONSTRAINT CON1_PEDIDOS;


la sintaxis ALTER TABLE para restricciones es:

ALTER TABLE [esquema.]tabla constraint_clause,... [ENABLE enable_clause | DISABLE disable_clause] [{ENABLE|DISABLE} TABLE LOCK] [{ENABLE|DISABLE} ALL TRIGGERS];
donde constraint_clause puede ser alguna de las siguientes entradas:

ADD out_of_line_constraint(s) ADD out_of_line_referential_constraint DROP PRIMARY KEY [CASCADE] [{KEEP|DROP} INDEX]

DROP UNIQUE (column,...) [{KEEP|DROP} INDEX] DROP CONSTRAINT constraint [CASCADE] MODIFY MODIFY MODIFY RENAME CONSTRAINT constraint constrnt_state PRIMARY KEY constrnt_state UNIQUE (column,...) constrnt_state CONSTRAINT constraint TO new_name

donde a su vez constrnt_state puede ser:

[[NOT] DEFERRABLE] [INITIALLY {IMMEDIATE|DEFERRED}] [RELY | NORELY] [USING INDEX using_index_clause] [ENABLE|DISABLE] [VALIDATE|NOVALIDATE] [EXCEPTIONS INTO [schema.]table]
Borrar una restriccin:

ALTER TABLE T_PEDIDOS DROP CONSTRAINT CON1_PEDIDOS;

Create Database
Sirve para crea una base de datos. Desde el punto de vista fsico, una base de datos es, para oracle, un conjunto de ficheros, a saber:
datafiles, ficheros de datos, definidos en la creacin de la base de datos. log files, ficheros de log, definidos tambien en la creacin de la base de datos. init.ora, fichero de texto que contiene los parmetros de configuracin de la base de datos. control files, ficheros de control, definidos en el init.ora password file, fichero con la password del BDA y los operadores (todos los demas usuarios estan definidos en tablas).

Asi para crear una base de datos, una vez instalado oracle, debemos seguir los siguientes pasos:

1) Definir ORACLE_SID ORACLE_HOME = E:\Oracle\Product\10.0.0 ORACLE_SID = GESTION 2) Crear el fichero INIT.ORA C:\>ORACLE_HOME\database\initGESTION.ora

control_files = (/path/to/control1.ctl,/path/to/control2.ctl,/path/to/control3.ctl)

undo_management = AUTO undo_tablespace = UNDOTBS1 db_name = GESTION db_block_size = 8192 sga_max_size = 1073741824 sga_target = 1073741824 3) Definir fichero de passwords $ORACLE_HOME\bin\orapwd file=ORACLE_HOME\database\pwdGESTION.ora password=oracle entries=10
Podemos generar los pasos 2) y 3) con una sola instruccin:

oradim -new -sid GESTION -intpwd

-maxusers 20 -startmode auto

-pfile E:\Oracle\Product\10.0.0\Database\initGESTION.ora 4) Arrancar la instancia C:\>sqlplus / as sysdba

sql> startup nomount 5) Crea la base de datos con el nombre(o SID) GESTION y el char set WE8ISO8859P1 CREATE DATABASE GESTION LOGFILE 'E:\OraData\GESTION\LOG1GESTION.ORA' SIZE 2M, 'E:\OraData\GESTION\LOG2GESTION.ORA' SIZE 2M, 'E:\OraData\GESTION\LOG3GESTION.ORA' SIZE 2M, 'E:\OraData\GESTION\LOG4GESTION.ORA' SIZE 2M, 'E:\OraData\GESTION\LOG5GESTION.ORA' SIZE 2M EXTENT MANAGEMENT LOCAL MAXDATAFILES 100 DATAFILE 'E:\OraData\GESTION\SYS1GESTION.ORA' SIZE 50 M DEFAULT TEMPORARY TABLESPACE temp TEMPFILE 'E:\OraData\GESTION\TEMP.ORA' SIZE 50 M UNDO TABLESPACE undo DATAFILE 'E:\OraData\GESTION\UNDO.ORA' SIZE 50 M NOARCHIVELOG CHARACTER SET WE8ISO8859P1; 6) Ejecutar sql de creacin: catalog.sql y catproc.sql
Sintaxis completa:

CREATE DATABASE nombreDB opciones


Donde las opciones:

DATAFILE filespec AUTOEXTEND OFF DATAFILE filespec AUTOEXTEND ON [NEXT int K | M] [MAXSIZE int K | M] MAXDATAFILES int EXTENT MANAGEMENT LOCAL DEFAULT TEMPORARY TABLESPACE tablespace [TEMPFILE filespec] [EXTENT MANAGEMENT LOCAL] [UNIFORM [SIZE int K | M]] UNDO TABLESPACE tablespace [DATAFILE filespec] LOGFILE [GROUP int] filespec MAXLOGFILES int MAXLOGMEMBERS int MAXLOGHISTORY int MAXINSTANCES int ARCHIVELOG | NOARCHIVELOG CONTROLFILE REUSE CHARACTER SET charset NATIONAL CHARACTER SET charset SET TIMEZONE = 'time_zone_region' SET TIMEZONE = '{+|-} hh:mm' FORCE LOGGING USER SYS IDENTIFIED BY password USER SYSTEM IDENTIFIED BY password Se puede poner mas de un DATAFILE o LOGFILE separando los nombres de fichero con comas DATAFILE filespec1, filespec2, filespec3 Si no se especifican claves, Oracle establece "change_on_install" para SYS y "manager" para SYSTEM. Despues de crear la base de datos podemos cambiar entre los modos ARCHIVELOG, NOARCHIVELOG con la sentencia ALTER DATABASE.

Global Temporary Tables


Crea una tabla temporal personal para cada sesion. Eso significa que los datos no se comparten entre sesiones y se eliminan al final de la misma. CREATE GLOBAL TEMPORARY TABLE tabla_temp ( columna datatype [DEFAULT expr] [column_constraint(s)] [,columna datatype [,...]] ) {ON COMMIT DELETE ROWS | ON COMMIT PRESERVE ROWS}; Con la opcion ON COMMIT DELETE ROWS se borran los datos cada vez que se hace COMMIT en la sesion. Con la opcion ON PRESERVE DELETE ROWS los datos no se borran hasta el final de la sesion.

Create Index
Los indices se usan para mejorar el rendimiento de las operaciones sobre una tabla. En general mejoran el rendimiento las SELECT y empeoran (minimamente) el rendimiento de los INSERT y los DELETE. Una vez creados no es necesario nada ms, oracle los usa cuando es posible (ver EXPLAIN PLAN). En oracle existen tres tipos de indices:
1)Table Index:

CREATE [UNIQUE|BITMAP] INDEX [esquema.]index_name ON [esquema.]table_name [tbl_alias] (col [ASC | DESC]) index_clause index_attribs
2)Bitmap Join Index:

CREATE [UNIQUE|BITMAP] INDEX [esquema.]index_name ON [esquema.]table_name [tbl_alias] (col_expression [ASC | DESC]) FROM [esquema.]table_name [tbl_alias] WHERE condition [index_clause] index_attribs
3)Cluster Index:

CREATE [UNIQUE|BITMAP] INDEX [esquema.]index_name ON CLUSTER [esquema.]cluster_name index_attribs


las index_clauses posibles son:

LOCAL STORE IN (tablespace)

LOCAL STORE IN (tablespace) (PARTITION [partition [LOGGING|NOLOGGING] [TABLESPACE {tablespace|DEFAULT}] [PCTFREE int] [PCTUSED int] [INITRANS int]

[MAXTRANS int] [STORAGE storage_clause] [STORE IN {tablespace_name|DEFAULT] [SUBPARTITION [subpartition [TABLESPACE tablespace]]]]) LOCAL (PARTITION [partition [LOGGING|NOLOGGING] [TABLESPACE {tablespace|DEFAULT}] [PCTFREE int] [PCTUSED int] [INITRANS int] [MAXTRANS int] [STORAGE storage_clause] [STORE IN {tablespace_name|DEFAULT] [SUBPARTITION [subpartition [TABLESPACE tablespace]]]]) GLOBAL PARTITION BY RANGE (col_list) ( PARTITION partition VALUES LESS THAN (value_list) [LOGGING|NOLOGGING] [TABLESPACE {tablespace|DEFAULT}] [PCTFREE int] [PCTUSED int] [INITRANS int] [MAXTRANS int] [STORAGE storage_clause] ) INDEXTYPE IS indextype [PARALLEL int|NOPARALLEL] [PARAMETERS ('ODCI_Params')] {Esto es solo para table index, no para bitmap join Index}
Y adems index_attribs puede ser cualquier combinacin de los siguientes:

NOSORT|SORT REVERSE COMPRESS int NOCOMPRESS COMPUTE STATISTICS [NO]LOGGING ONLINE TABLESPACE {tablespace|DEFAULT} PCTFREE int PCTUSED int INITRANS int MAXTRANS int STORAGE storage_clause PARALLEL parallel_clause Si usamos la opcion PARALLEL esta debe estar al final. create index es una de las pocas sentencias que pueden usar nologging option.

create index requiere un segmento temporal si no hay espacio en memoria suficiente. Crear indices basados en funciones require que query_rewrite_enabled este a true y query_rewrite_integrity este a trusted.
Un ejemplo de indices basados en funciones para busquedas en mayusculas:

CREATE INDEX idx_case_ins ON my_table(UPPER(empname)); SELECT * FROM my_table WHERE UPPER(empname) = 'KARL';

Create Rollback Segment


Crea un Rollback Segment (RBS) CREATE [PUBLIC] ROLLBACK SEGMENT rbs_name options Opciones: TABLESPACE tablespace_name STORAGE storage_clause Un RBS publico esta disponible para mas de una instancia.

Create Sequence
Crea un objeto capaz de darnos numeros consecutivos unicos. CREATE SEQUENCE secuencia INCREMENT BY n START WITH n {MAX VALUE n | NOMAXVALUE} {MIN VALUE N | NOMINVALUE} {CYCLE | NOCYCLE} {CACHE N | NOCACHE} {ORDER | NOORDER}; En realida es un generador de indentificadores unicos que no bloquea transacciones. Es muy util para generar primary keys.
Si no nos gusta perder nmeros usamos NOCACHE.

CREATE SEQUENCE S_PROVEEDORES MINVALUE 1 START WITH 1 INCREMENT BY 1 NOCACHE;


Si nos interesa la velocidad:

CREATE SEQUENCE S_PROVEEDORES MINVALUE 1 START WITH 1

INCREMENT BY 1 CACHE 20;


Asi obtenemos el siguiente valor:

SELECT S_PROVEEDORES.NEXTVAL FROM DUAL;


Tambien podemos obtener el valor actual:

SELECT S_PROVEEDORES.CURRVAL FROM DUAL;

Create Synonym
Crea un sinonimo para algun objeto de la base de datos. CREATE [OR REPLACE] [PUBLIC] SYNONYM [esquema.]sinonimo FOR [esquema.]objeto [@dblink] Con la opcin 'PUBLIC' se crea un sinonimo pblico accesible a todos los usuarios, siempre que tengan los privilegios adecuados para el mismo. (ver GRANT) Sirve para no tener que usar la notacin 'esquema.objeto' para referirse a un objeto que no es propiedad de usuario. CREATE PUBLIC SYNONYM T_PEDIDOS FOR PROGRAMADOR.T_PEDIDOS; No es necesario recompilarlos cuando se redefinen las tablas, de hecho puedes existir sin que exista el objeto al que refererencian. El acceso es un poco mas eficiente cuando se accede por sinonimos pblicos. Cuando en una sentencia no citamos el nombre del esquema, Oracle resuelve los nombres en el siguiente orden:
usuario actual private synonym public synonym

Tambien podemos usarlo para cambiar el objeto que usamos sin tener que cambiar la programacion.
Asi cambiamos la tabla:

CREATE PUBLIC SYNONYM T_PEDIDOS FOR PROGRAMADOR.T_PEDIDOS_PRUEBA;

Create Table
La estructura de la sentencia de creacin de tablas es:

CREATE [GLOBAL TEMPORARY] TABLE [esquema.]tabla

columna datatype [DEFAULT expr] [column_constraint(s)] [,columna datatype [,...]] table_constraint table_ref_constraint [ON COMMIT {DELETE|PRESERVE} ROWS] storage_options [COMPRESS int|NOCOMPRESS] [LOB_storage_clause][varray_clause][nested_storage_clause] [XML_type_clause] Partitioning_clause [[NO]CACHE] [[NO]ROWDEPENDENCIES] [[NO]MONITORING] [PARALLEL parallel_clause] [ENABLE enable_clause | DISABLE disable_clause] {ENABLE|DISABLE} ROW MOVEMENT [AS subquery]
Queda mas claro con unos ejemplos:

create table T_PRODUCTOS ( numproduct number, desproduct varchar2(10) )


Es posible definir restricciones (constraint) con la sentencia CREATE.

create table T_PEDIDOS( numpedido fecpedido numclient )


Una clave primaria (primary key) necesita tener asociado un indice unico (unique index). Es posible especificar el tablespace donde queremos crear el indice.

number primary key date, references T_CLIENTES

create table T_PEDIDOS( numpedido fecpedido numclient number primary key date, references T_CLIENTES

constraint pk_pedidos (numpedido) using index tablespace ts_idx )

Index organized tables (IOT)


create table iot_ (

a number, b varchar2(10), constraint pk_iot_ primary key (a, b) ) organization index;


Organization external The following create table statement creates an external table.

create table (....) organization external ( type oracle_loader

default directory some_dir access parameters ( records delimited fields by newline

terminated by ','

missing field are values null ) location ('some_file.csv') ) reject limit unlimited;

Nested tables
create or replace type item as object ( item_id Number descr quant ); / ( 6 ), ),

varchar2(30 Number

( 4,2)

create or replace type items as table of item; /

create table bag_with_items (

bag_id bag_name the_items_in_the_bag )

number(7) varchar2(30) items

primary key, not null,

nested table the_items_in_the_bag store as bag_items_nt;

Adding a unique constraint for item_id:

alter table bag_items_nt add constraint uq_item_id unique(item_id);

Create Tablespace
Sirve para crear un tablespace. Un tablespace es una unidad lgica 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.
Sintaxis:

CREATE [UNDO] TABLESPACE tablespace_name DATAFILE Datafile_Options Storage_Options ;


Datafile_Options:

'filespec' [AUTOEXTEND OFF] 'filespec' [AUTOEXTEND ON [NEXT int K | M] [MAXSIZE int K | M]] La opcin Autoextend Maxsize es por defecto UNLIMITED si no se especifica valor.
Storage_Options:

DEFAULT [COMPRESS|NOCOMPRESS] STORAGE storage_clause MINIMUM EXTENT int {K|M} BLOCKSIZE int K LOGGING | NOLOGGING FORCE LOGGING ONLINE | OFFLINE PERMANENT | TEMPORARY

EXTENT MANAGEMENT {DICTIONARY | LOCAL {AUTOALLOCATE | UNIFORM [SIZE int K | M]} } SEGMENT SPACE MANAGEMENT {MANUAL | AUTO}

Create View
Esta sentencia sirve para crear una vista de una tabla o tablas. Una vista es una tabla lgica basada en los datos de otra tabla.
Ejemplo:

CREATE VIEW V_PEDIDOS (NUMPEDIDO, FECPEDIDO, NUNCLIENTE, NOMCLIENTE) FROM SELECT A.NUMPEDIDO,A.FECPEDIDO,A.NUMCLIENTE, B.NOMCLIENTE FROM T_PEDIDOS A, T_CLIENTE B WHERE A.NUMCLIENTE=B.NUMCLIENTE;
Esta vista sacar lo datos de los pedidos con el nombre de cliente.

Al ser lgica no necesita espacio de almacenamiento para los datos. Ademas es instantanea, una vez modificados los datos de las tablas origen, los tenemos disponibles en la vista.

Tipos de datos (datatypes)


Para obtener la definicin de datos de una tabla podemos ejecutar:

SELECT COLUMN_NAME, DATA_TYPE, DATA_LENGTH, DATA_PRECISION, DATA_SCALE FROM COLS WHERE TABLE_NAME = 'T_PEDIDOS'; En la definicin de las columnas de las tablas podemos usar los siguientes tipos de datos:

CHAR(n)
Cadena de caracteres de longitud fija, tiene un tamao n bytes. Si no se especifica n la ORACLE le da un tamao de 255 bytes. El tamao mximo en BD es 2000 bytes y el mnimo 1 byte. El tamao mximo en PL/SQL es 32767 bytes y el minimo 1 byte. CHARACTER es sinonimo de CHAR. Ver NCHAR.

VARCHAR2(n)

Cadena de caracteres de longitud variable, tiene un tamao mximo de n bytes. Es obligatorio especificar el tamao. El tamao mximo en BD es 4000 bytes y el mnimo 1 byte. El tamao mximo en PL/SQL es 32767 bytes y el minimo 1 byte. STRING y VARCHAR son sinonimos de VARCHAR2. Ver NVARCHAR2. Usando VARCHAR2 en lugar de CHAR ahorramos espacio de almamcenamiento. Un char(10) almacenar 'PEPE '

Un varchar2(10) almacenar 'PEPE' En contra tiene que si se escriben muchas veces hay que hacer un mayor esfuerzo de matenimiento del sistema para mantener la eficiencia (compactar).

NUMBER(p,s)
Nmero de p digitos de los cuales s son decimales. No es obligatorio especificar el tamao. El tamao de p va de 1 a 38 y el s desde -84 a 127. El tamao en PL/SQL 1E-130 .. 10E125.
Sinonimos:

numeros de coma fija: DEC,DECIMAL,NUMERIC enteros:INTEGER (sinonimo de NUMBER(38)),INT,SMALLINT coma flotante:DOUBLE PRECISION FLOAT REAL. Ver tambien: PLS_INTEGER, BINARY_INTEGER

El valor 7,456,123.89 se almacenar como:

NUMBER(9) NUMBER(9,1) NUMBER(*,1) NUMBER(9,2) NUMBER(6) NUMBER(7,-2) NUMBER FLOAT FLOAT(12)

7456124 7456123.9 7456123.9 7456123.89 [error] 7456100 7456123.89 7456123.89 7456000.0

DATE
Fecha vlida. Desde el 1 de enero del 4712 AC hasta el 31 de diciembre del 9999 DC. (en Oracle7 = 4712 DC)

LONG
Cadena de caracteres de longitud variable. Es una versin ms grande de VARCHAR2. El tamao mximo en BD es 2 Gigabytes.

CLOB
Cadena de caracteres de longitud variable. Es una versin ms grande de VARCHAR2. El tamao mximo en BD es 4 Gigabytes. Ver NCLOB. Es recomendable usar CLOB o BLOB en lugar de LONG.

BLOB
Objeto binario de longitud variable. Es una versin ms grande de RAW. El tamao mximo en BD es 4 Gigabytes.

BFILE
Puntero a un fichero en disco. El tamao mximo en BD es 4 Gigabytes.

TIMESTAMP (f)
El timestamp es un fecha que contiene un granularidad superior al tipo DATE, eso significa que contiene fracciones de segundo. Con f definimos el numero de digitos que queremos en la fraccin de segundo. Asi, f puedes valer desde 0 hasta 9, el valor por defecto es 6. SELECT SYSTIMESTAMP FROM DUAL; Podemos usar WITH {LOCAL} TIMEZONE para grabar con el desplazamiento de hora local.

INTERVAL YEAR (y) TO MONTH


Periodo de tiempo definido en aos y meses donde y es el nmero de digitos del ao. Puede valer de 0 a 9. (por defecto = 2)

INTERVAL DAY (d) TO SECOND (f)


Es un periodo de tiempo definido en dias, horas, minutos y segundos. d es el mximo numero de digitos en el dia f es el mximo numero de digitos en el campo de segundos. d va de 0 a 9. (por defecto = 2) fva de 0 a 9. (por defecto = 6)

ROWID
Cadena hexadecimal que representa de forma nica una fila en una tabla (pero no unica en cualquier tabla). Ver funcin ROWID.

UROWID
Cadena hexadecimal que representa de forma nica una fila ORDENADA en una tabla (pero no unica en cualquier tabla). Ver funcin ROWID.

RAW(n)
Objeto binario de longitud variable. Es obligatorio especificar el tamao. El tamao mximo en BD es 2000 bytes y el mnimo 1 byte. El tamao mximo en PL/SQL es 32767 bytes y el minimo 1 byte.

LONG RAW
Objeto binario de longitud variable. El tamao mximo en BD es 2 Gigabytes. El tamao mximo en PL/SQL es 32767 bytes y el minimo 1 byte.

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

RENAME old TO new


Para columnas de tablas:

CREATE TABLE tmp AS SELECT MyColOld MyColNew, col2, col3 FROM MY_TABLE; DROP TABLE MY_TABLE; RENAME tmp TO MY_TABLE;

Tambien se puede:

ALTER TABLE MODIFY COLUMN... ALTER TABLE DROP COLUMN... ALTER TABLE SET UNUSED COLUMN...

Storage clause
Configuracin del almacenamiento de tablas (CREATE TABLE), indices (CREATE INDEX), etc... en oracle.

STORAGE opciones

opciones:

INITIAL int K | M NEXT int K | M MINEXTENTS int MAXEXTENTS int MAXEXTENTS UNLIMITED PCTINCREASE int FREELISTS int FREELIST GROUPS int OPTIMAL OPTIMAL int K | M OPTIMAL NULL BUFFER POOL {KEEP|RECYCLE|DEFAULT} storage ( initial next minextents maxextents pctincrease freelists freelist groups optimal buffer_pool default ) Esta clausula aparece al final de la definicin de los objetos de almacenamiento de la base de datos (tablas, indices, etc...). 65536 1048576 1 2147483645 0 1 1 7k

Cuando creamos un tablespace (CREATE TABLESPACE) podemos definir un storage por defecto para los objetos que se creen dentro de el.
However, a default storage clause can not be specified for locally managed tablespaces. Dictionary managed tablespaces allow to have a storage clause, but without freelists, freelist groups and buffer_pool.

initial
Especifica el tamao (en bytes) de la primera extensin.

next
Especifica el tamao (en bytes) de la segunda extensin.

pctincrease
Especifica el % de incremento en el tamao de las siguientes extensiones. Especifica el incremento en el tamao de las siguientes extensiones. El tamao de una nueva extension es el tamao de la anterior multiplico por pctincrease. Debe ser 0 para reducir la fragmentacin en los tablespaces.

minextents
Especifica el numero inicial de extensiones cuando se crea el objeto.

maxextents
Especifica el numero mximo de extensiones que el objeto puede tener.

freelists
Especifica el numero de freelists. Este parmetro solo se puede usar con CREATE TABLE or CREATE INDEX.

freelist groups
Especifica el numero de freelist groups. Este parmetro solo se puede usar con CREATE TABLE or CREATE INDEX.

buffer_pool
El valor de buffer_pool debe ser uno de: keep, recycle, default. Este parmetro solo se puede usar con CREATE TABLE, CREATE INDEX, CREATE CLUSTER, ALTER TABLE, ALTER INDEX Y ALTER CLUSTER.

optimal
Solo se puede especificar para los rollback segments.

Data Manipulation Language


Aqui estan definidas las sentencias del lenguaje de manipulacin de datos (Data Manipulation Language o DML) de oracle, como SELECT, UPDATE, INSERT, DELETE, etc...

COMMIT
Guarda los cambios de la transaccin en curso. Libera los recursos bloqueados por cualquier actualizacin hecha con la transaccin actual (LOCK TABLE). COMMIT [WORK] [COMMENT 'comment_text'] COMMIT [WORK] [FORCE 'force_text' [,int] ]
Si ejecutamos:

DELETE FROM T_PEDIDOS WHERE COD_PEDIDO=15; COMMIT; Borrar un registro y guarda los cambios.
FORCE ....

Sentencia DELETE
Borra una o ms filas de una tabla, dependiendo de la condicin WHERE. Para guardar cambios hay que ejecutar COMMIT; Para cancelar el borrado podemos hacer ROLLBACK;
La sintaxis es la siguiente:

DELETE FROM nombre-tabla [WHERE condicin] CUIDADO! Si no se pone condicin de seleccin, borra todas las filas de la tabla.
Si ejecutamos:

DELETE FROM T_PEDIDOS; Borrar toda la tabla.


Si ejecutamos: Borrar un registro.

DELETE FROM T_PEDIDOS WHERE COD_PEDIDO=15;

Sentencia INSERT
Aade filas a una tabla. Para guardar los datos insertados hay que ejecutar COMMIT; Para cancelar la inserccin podemos hacer ROLLBACK;
Un formato posible es:

INSERT INTO nombre-tabla VALUES (serie de valores) El orden en el que se asignen los valores en la clusula VALUES tiene que coincidir con el orden en que se definieron las columnas en la creacin del objeto tabla, dado que los valores se asignan por posicionamiento relativo.
Por ejemplo:

INSERT INTO T_PEDIDOS VALUES (125,2,'PEPE');


Otra forma de usar la sentecia INSERT es:

INSERT INTO nombre-tabla (columna1, columna2.....) VALUES (valor1, valor2....) En este caso los valores se asignarn a cada una de las columnas mencionadas por posicionamiento relativo. Es necesario que por lo menos se asignen valores a todas aquellas columnas que no admiten valores nulos en la tabla (NOT NULL).
Por ejemplo:

INSERT INTO T_PEDIDOS (CODPEDIDO,ESTADO) VALUES (125,2);

Sentencia INSERT de mltiples filas


Para insertar un subconjunto de filas de una tabla en otra se escribe una sentencia INSERT con una SUBSELECT interna. Los formatos posibles son: INSERT INTO nombre-tabla (columna1, columna2.....) SELECT ([sentencia Select])

Asigna a las columnas los valores recuperados en la sentencia Select. Inserta en la tabla todas las filas que se recuperen en la Select.
Por ejemplo:

INSERT INTO T_PEDIDOS (CODPEDIDO,ESTADO,NOMBRE) SELECT CODPEDIDO+100,ESTADO,NOMBRE FROM T_PEDIDOS WHERE CODPEDIDO IN (1,2,3); Otra forma es: INSERT INTO nombre-tabla SELECT * FROM nombre-tabla-fuente En este caso las estructuras de las tablas tienen que ser iguales.
Este ejemplo copia hasta el pedido 100 en otra tabla:

INSERT INTO T_PEDIDOS_BAK SELECT * FROM T_PEDIDOS WHERE CODPEDIDO<100; Ambas tablas son iguales.

LOCK TABLE
Bloquea una tabla o vista. LOCK TABLE [esquema.] table [opciones] IN lockmode MODE [NOWAIT] LOCK TABLE [esquema.] view [opciones] IN lockmode MODE [NOWAIT] donde opciones: PARTITION, SUBPARTITION, @dblink donde lockmodes: EXCLUSIVE, SHARE, ROW EXCLUSIVE, SHARE ROW EXCLUSIVE ROW SHARE* | SHARE UPDATE* Si no ponemos NOWAIT Oracle esperar hasta que la tabla este disponible. Se pueden bloquear varias tablas en un solo comando si las escribimos separadas por comas. LOCK TABLE tabla1,tabla2,tabla3 IN ROW EXCLUSIVE MODE;

Bloqueos por defecto


Las sentencias del DML pueden producir bloqueos sobre las filas de la tabla: Una sentencia SELECT normal no bloquea filas.

Las sentencias INSERT, UPDATE o DELETE realiza un bloqueo ROW EXCLUSIVE de las filas afectadas por el WHERE. La sentencia SELECT ... FOR UPDATE NOWAIT realiza un bloqueo ROW EXCLUSIVE de las filas afectadas por el WHERE. Las sentencias COMMIT y ROLLBACK desbloquean las filas bloqueadas anteriormente dentro de la transaccin actual. Aunque una fila este bloqueada (por otra transaccin), siempre podemos hacer una SELECT sobre esa fila. Los valores retornados son los anteriores al bloqueo.
Las sentencias UPDATE Y DELETE pueden provocar o sufrir esperas si hay conflictos con otra transaccin.

Esta relacionado con el error ORA-00054.

Bloqueos Multiples en las mismas filas con LOCK TABLE


Ademas se pueden ejecutar distintos tipos de bloqueo:

ROW SHARE = Permite hacer bloqueos de tipo ROW EXCLUSIVE o ROW SHARE o SHARE sobre las filas bloqueadas. ROW EXCLUSIVE = Permite hacer bloqueos de tipo ROW EXCLUSIVE o ROW SHARE sobre las filas bloqueadas. SHARE ROW EXCLUSIVE = Permite hacer bloqueos de tipo ROW SHARE sobre las filas bloqueadas. SHARE = Permite hacer bloqueos de tipo ROW SHARE or SHARE sobre las filas bloqueadas. EXCLUSIVE = Solo permite hacer SELECT sobre las filas bloqueadas.

ROLLBACK
Deshace los cambios de la transaccin en curso.
Libera los recursos bloqueados por cualquier actualizacin hecha con la transaccin actual (LOCK TABLE).

ROLLBACK [WORK] [TO [SAVEPOINT]'savepoint_text_identifier']; ROLLBACK [WORK] [FORCE 'force_text'];


Si ejecutamos:

DELETE FROM T_PEDIDOS WHERE COD_PEDIDO=15; COMMIT;

Borrar un registro pero cancela los cambios. Queda como si no hubiesemos hecho nada.

SAVEPOINT
Sirve para marca un punto de referencia en la transaccin para hacer un ROLLBACK parcial. SAVEPOINT identificador;
Un ejemplo de uso es:

UPDATE T_PEDIDOS SET NOMBRE='jorge' WHERE CODPEDIDO=125; SAVEPOINT solouno; UPDATE T_PEDIDOS SET NOMBRE = 'jorge'; SAVEPOINT todos; SELECT * FROM T_PEDIDOS; ROLLBACK TO SAVEPOINT todos; COMMIT; Solo guardamos la primera modificacin.

Sentencia SELECT
La seleccin sobre una tabla consiste en elegir un subconjunto de filas que cumplan (o no) algunas condiciones determinadas. La sintaxis de una sentencia de este tipo es la siguiente:

SELECT */ columna1, columna2,.... FROM nombre-tabla [WHERE condicin] [GROUP BY columna1, columna2.... ] [HAVING condicin-seleccin-grupos ] [ORDER BY columna1 [DESC], columna2 [DESC]... ]
Si ejecutamos:

SELECT * FROM T_PEDIDOS;


Nos da la salida:

COD_PEDIDO

NOMBRE

ESTADO

------------------------------------------------1 JUAN 0

2 3 ...

ANTONIO PEPE

1 0

* / columna1, columna2,.... Si se escribe *, selecciona todas las columnas. Si se desea seleccionar slo algunas columnas de la tabla, se debe poner los nombres de cada una de ellas, separadas por una coma.

nombre-tabla Nombre de la(s) tabla(s) de la(s) cual(es) se van a seleccionar los valores.

GROUP BY columna1, columna2....


Se utiliza para agrupar resultados por una determinada columna, especficamente cuando se utilizan funciones de columna y los resultados se desean obtener por grupos (SQL lanza un sort para generar los grupos).

HAVING condicin-seleccin-grupos
Se utiliza con la clusula GROUP BY, cuando se quiere poner condiciones al resultado de un grupo.

ORDER BY colum1 [DESC], colum2 [DESC...]


Sirve para ordenar el resultado. Todas las columnas por las que se desee realizar el orden tienen que encontrarse en la sentencia Select de la consulta. El orden de las columnas puede ser ascendente, (por omisin, ASC), o descendente, (DESC).

SENTENCIA SELECT (JOIN)


Consiste en la unin de campos de dos o ms tablas. Dichas tablas tendrn por lo menos una columna comn que sirva de nexo del join.

SELECT columna1, columna2,... FROM nombre-tabla1, nombre-tabla2


columna1, columna2,... Para diferenciar las columnas con el mismo nombre se antepondr el nombre de la tabla a la que pertenecen, utilizando el punto como separador. Por ejemplo:

SELECT Tabla1.Columna2, Tabla2.Columna2, Columna3..... FROM Tabla1, Tabla2 WHERE Tabla1.Columna1 = Tabla2.Columna1 La Columna1 de cada una de las tablas respectivas son las columnas de nexo o columnas de join.

SENTENCIA SELECT DISTINCT


Recupera las filas de una tabla eliminando los valores de la columna duplicados.

SELECT DISTINCT columna1, columna2,.... FROM nombre-tabla1, nombre-tabla2 [GROUP BY columna1, columna2....] [HAVING condicin-seleccin-grupos] [ORDER BY columna1 [DESC], columna2 [DESC]...

SENTENCIA SELECT TOP N FILAS DE UNA TABLA


En Oracle8i podemos usar la sintaxis siguiente, con una clusula ORDER BY, para elegir filas con los valores mximos o mnimos de un campo:

SELECT * FROM (SELECT * FROM my_table ORDER BY col_name_1 DESC) WHERE ROWNUM < 10;

FUNCIONES SOBRE COLUMNAS


COUNT. Indica el nmero de filas que cumplen una determinada condicin, o el nmero de valores diferentes que posee una columna.

COUNT(*) o COUNT(DISTINCT columna)


SUM. Suma los valores de una columna.

SUM(columna)
AVG. Entrega la media de los valores de una columna.

AVG(columna)
MIN. Entrega el valor mnimo de una columna.

MIN(columna)
MAX. Entrega el valor mximo de una columna.

MAX(columna)

SUBSELECTS
Permite realizar comparaciones con valores obtenidos en otra sentencia select anidada, a la que se denomina Subselect o Subselect interna.

SELECT columna1>, columna2,.... FROM nombre-tabla1, nombre-tabla2 WHERE columna1 = (SELECT columna1 FROM nombre-tabla1, nombre-tabla2

WHERE condicin) (Cuando en la condicin se pone el operador =, la subselect deber recuperar un slo registro).

Sentencia TRUNCATE
Borrar todas las filas de una tabla o cluster. TRUNCATE TABLE [esquema.]tabla [{PRESERVE|PURGE} MATERIALIZED VIEW LOG] [{DROP | REUSE} STORAGE] TRUNCATE CLUSTER [esquema.]cluster [{DROP | REUSE} STORAGE]

CLUSULA UNION
Mezcla los resultados de dos o ms consultas individuales en una nica tabla resultado, eliminando las filas duplicadas, si existieran. SELECT columna1, columna2,.... FROM nombre-tabla1,... WHERE condicin1 UNION [ALL] SELECT columna1, columna2,... FROM nombre-tabla2,... WHERE condicin2 Oracle realiza primero cada una de las SELECTs escritas, generando una tabla resultado por cada una de las consultas. Luego, une las dos tablas en una. Las columnas de la tabla resultado poseen los nombres de las columnas de la primera sentencia SELECT que se ejecute.

ALL
Si se especifica ALL, el resultado de la consulta no elimina las filas duplicadas, si existieran. Con ALL las uniones funcionan ms eficientemente (TUNNING).

Sentencia UPDATE
Actualiza valores de una o ms columnas para un subconjunto de filas de una tabla. Para guardar cambios hay que ejecutar COMMIT; Para cancelar la modificacin podemos hacer ROLLBACK;

UPDATE nombre-tabla SET columna1 = valor1 [, columna2 = valor2 ...] [WHERE condicin] Actualiza los campos correspondientes junto con los valores que se le asignen, en el subconjunto de filas que cumplan la condicin de seleccin. Si no se pone condicin de seleccin, la actualizacin se da en todas las filas de la tabla. Si se desea actualizar a nulos, se asignar el valor NULL.
En este ejemplo cambiamos el nombre y estado de un pedido:

UPDATE T_PEDIDOS SET NOMBRE='JUAN',ESTADO=1 WHERE CODPEDIDO=125;


En este ejemplo cambiamos el estado de todos los pedidos:

UPDATE T_PEDIDOS SET ESTADO=1;


En este ejemplo ponemos a nulo el nombre de un pedido:

UPDATE T_PEDIDOS SET NOMBRE=NULL WHERE CODPEDIDO=125;

WHERE condicin
Clusula opcional que se utiliza cuando se desea establecer una o varias condiciones para la sentencias SELECT, UPDATE y DELETE.
Las condiciones podrn tener:

- operadores aritmticos: =,<>,>,>=,<,<= - operadores booleanos: AND, OR, NOT - operadores especiales como: BETWEEN, IN, LIKE, IS NULL, EXISTS, ...

BETWEEN
Permite obtener todas las filas que se encuentran en un intervalo de valores. nombre-columna BETWEEN limite-inferior AND limite-superior

IN
Permite obtener todas las filas que sean iguales a alguno de los valores descritos por extensin. nombre-columna IN (valor1, valor2, .....)
Es una forma corta de escribir ['x' = y OR 'x' = z...]

LIKE
Permite imponer condiciones sobre series de caracteres o parte de ellos. - El smbolo % se utiliza como carcter de sustitucin para indicar un nmero indeterminado de caracteres. Depende de la base de datos en la que se est trabajando. - El smbolo _ se utiliza como carcter de sustitucin para indicar un carcter en una determinada posicin. Depende de la base de datos en la que se est trabajando. (Los caracteres % y _ pueden combinarse) WHERE nombre-columna LIKE 'marti%' [encontrar 'martin' y 'martinez'] WHERE nombre-columna LIKE 'marti_' [encontrar 'martin' pero no 'martinez']

IS NULL
Obtiene todas las filas que contengan un valor nulo en una determinada columna.
Formato:

nombre-columna IS NULL.
Tambin se puede negar con la partcula NOT, IS NOT NULL.

EXISTS
Devuelve TRUE si una subconsulta devuelve al menos una fila.

NOT
Todas las condiciones que se pueden utilizar, pueden negarse anteponiendo la partcula NOT delante de los operadores especiales: IN, LIKE, BETWEEN. Una sentencia SELECT, UPDATE y DELETE puede tener una o ms condiciones unidas por un operador booleano AND o OR.

Lenguaje de programacin de Oracle PL-SQL


En esta seccin se hace un repaso de las estructuras de programacin de PL-SQL. Estan descritas como estructuras como EXCEPTION, CASE, CURSOR...

CALL
Ejecuta un procedimiento o funcion desde el SQL.

CALL [schema.] item_to_call

CALL [schema.] [package.] item_to_call [INTO :host_variable [[INDICATOR] :indicator_var] ]

CALL [schema.] [type.] item_to_call [INTO :host_variable [[INDICATOR] :indicator_var] ]

Key

item_to_call:

function

[@dblink] (expr,...)

procedure [@dblink] (expr,...) method [@dblink] (expr,...)

indicator_var:

El valor o condicin de la variable del host.

CALL place_order(453);

CASE
Sentencia condicional multiple

case WHEN condition THEN

WHEN condition THEN

ELSE

END CASE;
Podemos poner tantas condiciones como queramos

declare x number; r varchar(100); begin case WHEN x=1 THEN r:='aa';

WHEN x=2 THEN r:='bb';

ELSE r:='cc';

END CASE; end;

CURSOR
Sentencia de recuperacin de datos con un cursor.

DECLARE CURSOR c1 IS SELECT fields FROM table WHERE; c1rec c1%ROWTYPE; BEGIN OPEN c1; LOOP FETCH c1 INTO c1rec; EXIT WHEN c1%NOTFOUND; END LOOP; CLOSE c1; END;
Un ejemplo:

DECLARE

CURSOR c1 IS SELECT value FROM table WHERE code=1; c1rec c1%ROWTYPE; BEGIN OPEN c1; LOOP FETCH c1 INTO c1rec; EXIT WHEN c1%NOTFOUND; END LOOP; CLOSE c1; END;

DESC[RIBE]
Sirve para obtener una descripcin de una tabla, sinonimo, paquete o funcin. Debido a que es un comando de sqlplus no necesita terminar con ;

DESC table

DESC view

DESC synonym

DESC function

DESC package

En Oracle 7 se pueden describir funciones indivuales de un paquete.

desc DBMS_UTILITY.GET_PARAMETER_VALUE

A partir de oracle 8 solo podemos describir paquetes completos. Es posible describir objetos en otro esquema via dblink.

DESCRIBE user.table@db_link

El comando describe puede funcionar de forma recursiva hasta el nivel de profundidad definido con:

SET SET SET SET

LINESIZE DESCRIBE DESCRIBE DESCRIBE

80 DEPTH 2 INDENT ON LINE OFF

Para mostrar esta configuracin, ejecutar: SHOW DESCRIBE Una alternativa a al comando DESC es usae el diccionario de datos. DESC MY_TABLE es equivalente a:

SELECT column_name "Name", nullable "Null?", concat(concat(concat(data_type,'('),data_length),')') "Type" FROM user_tab_columns WHERE table_name='TABLE_NAME_TO_DESCRIBE';

Column Comments
Para ver los comentarios de las columnas:

SELECT comments FROM user_col_comments WHERE table_name='MY_TABLE';


o tambien

SELECT 'comment on column '||table_name||'.'||column_name||' is '''||comments||''';' FROM user_col_comments WHERE comments is not null;
Podemos escribir nuestro propio comando describe, creamos el fichero col.sql:

-- Lista todas la columnas de una tabla

select chr(9)||lower(column_name)||',' from USER_tab_columns where table_Name = UPPER('&1');


Si queremos una lista de las columnas de EMP, escribimos:

@col emp
Produce una lista de columnas:

empno, ename, job, mgr, hiredate, sal,

comm, deptno,

EXCEPTION
Seccin de excepciones en le cdigo PL-SQL

EXCEPTION WHEN NO_DATA_FOUND THEN code WHEN OTHERS THEN code


Podemos capturar las excepciones que nos interese

DECLARE dummy NUMBER; BEGIN SELECT count(*) INTO dummy FROM dual; EXCEPTION WHEN NO_DATA_FOUND THEN NULL; WHEN OTHERS THEN NULL; END;
Algunas excepciones:

DUP_VAL_ON_INDEX TIMEOUT_ON_RESOURCE TRANSACTION_BACKED_OUT INVALID_CURSOR NOT_LOGGED_ON LOGIN_DENIED NO_DATA_FOUND TOO_MANY_ROWS ZERO_DIVIDE INVALID_NUMBER STORAGE_ERROR PROGRAM_ERROR VALUE_ERROR CURSOR_ALREADY_OPEN

ORA-00001 ORA-00051 ORA-00061 ORA-01001 ORA-01012 ORA-01017 ORA-01403 ORA-01422 ORA-01476 ORA-01722 ORA-06500 ORA-06501 ORA-06502 ORA-06511

EXEC[UTE]

Ejecuta una funcion o un procedimiento PL/SQL.

EXEC statement

EXEC [:bind_variable :=] package.procedure;

EXEC [:bind_variable :=] package.function(parameters);


La longitud del comando EXEC no puede exceder el definido en SET LINESIZE. Si el comando EXEC es muy largo podemos utilizar el caracter de continuacin de SQL*Plus (un menos) -

EXEC :answer := EMP_PAY.BONUS('SMITH')

EXECUTE IMMEDIATE
Ejecuta una setencia SQL dinamica, es decir definida dentro de una cadena. Tambien funciona con un bloque PL/SQL.

EXECUTE IMMEDIATE cadena_sql [INTO {variable1,... | INTO registro}] [USING [IN|OUT|IN OUT] bind_arg,...] [RETURN[ING] INTO bind_arg,...]; cadena_sql: Es la variable con la cadena SQL o con el bloque PL/SQL. Si "cadena_sql" termina en ';', se tratar como un bloque PL/SQL, en otro caso se trataran como sentencias DML (SELECT,INSERT,...) o DDL (CREATE TABLE,..). variable1, variable2: Una variable por cada columna de respuesta de la cadena_sql. registro: Variable de tipo registro que recibe la fila completa (TYPE o %ROWTYPE) USING: Sirve para pasar parmetros a las sentencias. bind_arg: son variables o expresiones que contienen los parmetros de la sentencia. Cuando se ejecuta la sentencia, se reemplaza cada variable en la sentencia sql (un identificador con dos puntos delante, como :inicio) por su correspondiente valor segn su posicin. Se pueden pasar numeros, fechas y cadenas. No se pueden pasar booleanos o literales de NULL pero si se puede pasar una variable a nulo con el tipo de dato adecuado.

No se puede usar EXECUTE IMMEDIATE para consultas de multiples filas. Solo podemos recoger una.

FUNCTION
Creacin de funcin.

CREATE OR REPLACE FUNCTION f_name (params) RETURN returntype IS res returntype; BEGIN code... RETURN res; END;
Un ejemplo de funcin:

CREATE OR REPLACE FUNCTION f_desc(p_code in number) RETURN char IS v_res varchar2(100):=''; BEGIN SELECT desc INTO v_des FROM t_datos WHERE code=:p_code; return v_res; EXCEPTION WHEN NO_DATA_FOUND THEN return 'error'; WHEN OTHERS THEN RAISE_APPLICATION_ERROR(-20665,'sqlerrm); END;

IF
Sentencia condicional

IF cond1 THEN code END IF; IF cond1 THEN code ELSE code END IF;

IF cond1 THEN code ELSIF cond2 THEN code ELSE code END IF;
Podemos poner tantas condiciones como queramos

declare x number; r varchar(100); begin

IF x=1 THEN r:='aa'; ELSIF x=2 THEN r:='bb'; ELSE r:='cc'; END IF;

end;

LOOP
Sentencia de bucle.

LOOP ; END LOOP; LOOP

EXIT WHEN ; END LOOP; LOOP THEN EXIT; END IF; END LOOP; FOR IN 1 .. 10 LOOP IF

END LOOP; FOR i IN 1 .. 10 LOOP

FOR j IN 1 .. 10 LOOP

EXIT outer WHEN ; END LOOP; END LOOP outer;


Podemos poner tantas condiciones como queramos

declare x number; r varchar(100); begin case WHEN x=1 THEN r:='aa';

WHEN x=2 THEN r:='bb';

ELSE r:='cc';

END CASE; end;

PROCEDURE
Creacin de procedimiento.

CREATE OR REPLACE PROCEDURE p_name (params) IS -- Available in Oracle8i and above PRAGMA AUTONOMOUS_TRANSACTION; BEGIN code... -- Upon successful completion, save all changes. COMMIT; EXCEPTION -- For each error handler, don't forget the rollback! WHEN OTHERS THEN ROLLBACK; END;
Por ejemplo:

CREATE OR REPLACE PROCEDURE p_desc(p_code in number, p_dest in number) AS v_res varchar2(100):=''; BEGIN SELECT desc INTO v_des FROM t_datos WHERE code=:p_code; UPDATE t_dest SET res=:v_res WHERE code=:p_code; INSERT INTO t_dest (code,res) VALUES (p_code,v_res); END;

SET
Configuracin SQLPLUS.

SET TERM

OFF

-- TERM = ON will display on terminal screen (OFF = show in LOG only)

SET ECHO

ON

-- ECHO = ON will Display the command on screen (+ spool) -- ECHO = OFF will Display the command on screen but not in spool files. -- Interactive commands are always echoed to screen/spool.

SET TRIMOUT ON -- TRIMOUT = ON will remove trailing spaces from output SET TRIMSPOOL ON -- TRIMSPOOL = ON will remove trailing spaces from spooled output SET HEADING OFF -- HEADING = OFF will hide column headings SET FEEDBACK OFF -- FEEDBACK = ON will count rows returned SET PAUSE OFF -- PAUSE = ON .. press return at end of each page SET PAGESIZE 0 -- PAGESIZE = height 54 is 11 inches (0 will supress all headings and page brks) SET LINESIZE 80 -- LINESIZE = width of page (80 is typical) SET VERIFY OFF -- VERIFY = ON will show before and after substitution variables -- Start spooling to a log file SPOOL C:\TEMP\MY_LOG_FILE.LOG --- The rest of the SQL commands go here -SELECT * FROM GLOBAL_NAME; SPOOL OFF

SQLCODE
Funcin que nos devuelve el codigo de error asociado a la ltima excepcin lanzada por la base de datos. Solo debe usarse en la seccin de manejo de excepciones.

EXCEPTION WHEN NO_DATA_FOUND THEN code WHEN OTHERS THEN code


Por ejemplo:

DECLARE dummy NUMBER; BEGIN

SELECT count(*) INTO dummy FROM dual; EXCEPTION WHEN OTHERS THEN raise_application_error(-20001,'Se ha producido el error - '||SQLCODE||' -ERROR- '||SQLERRM); END;

SQLERRM
Funcin que nos devuelve el mensaje de error asociado a la ltima excepcin lanzada por la base de datos. Solo debe usarse en la seccin de manejo de excepciones.

EXCEPTION WHEN NO_DATA_FOUND THEN code WHEN OTHERS THEN code


Por ejemplo:

DECLARE dummy NUMBER; BEGIN SELECT count(*) INTO dummy FROM dual; EXCEPTION WHEN OTHERS THEN raise_application_error(-20001,'Se ha producido el error - '||SQLCODE||' -ERROR- '||SQLERRM); END;

Interfaz SQL PL/SQL (SQLPLUS)


Se trata de un interfaz de SQL y PL/SQL y de una herramienta de informes que viene tanto en la instalacin de oracle como en la instalacin de sql*net.

Como usar SQLPLUS


Se usa desde la linea de comandos. Las opciones disponibles son: c:\> sqlplus
Ejecutar un script:

/nolog

c:\> sqlplus user/password@database @script.sql


Un ejemplo de sesion:

c:\>sqlplus SQL> connect usuario/password SQL> select * from ejemplo; SQL> disconnect SQL> exit

Desde SQLPLUS podemos ejecutar:


Comandos SQLPLUS.

SQL> show user


Intrucciones SQL.

SQL> select * from dual;


Bloques de cdigo PL/SQL.

SQL> begin SQL> dbms_output.put_line('prueba'); SQL> end; SQL> /

Funciones de Cadena de Oracle


En esta seccin se hace un repaso de las funciones de cadena (string functions) ms utilizadas y algunos ejemplos. Estan descritas funciones como CHR, ASCII, CONCAT...
Una lista completa de las funciones disponibles la podemos obtener con:

SELECT distinct object_name FROM all_arguments WHERE package_name = 'STANDARD';

Funcion ASCII
Convierte el primer caracter en su codigo ascci en decimal. Es la funcion contraria a CHR.

Si ejecutamos:

SELECT ASCII('V') FROM DUAL;


Devuelve

86

Funcion CHR
Esta funcin devuelve el caracter ASCII correspondiente al cdigo que le pasamos de parmetro. Es la funcion contraria a ASCII.
Si ejecutamos:

SELECT CHR(86) FROM DUAL;


Devuelve

Funcion CONCAT
Esta funcin devuelve una cadena unin de las que le pasamos como parmetro. Es equivalente a char1||char2.
Si ejecutamos:

SELECT CONCAT('PEPE ','PEREZ') FROM DUAL;


Devuelve

PEPE PEREZ

Operador ||
Este operador devuelve una cadena unin de las que le colocamos a cada lado del operador. Es equivalente a CONCAT(char1,char2).
Si ejecutamos:

SELECT 'PEPE '||'PEREZ' FROM DUAL;


Devuelve

PEPE PEREZ

Funcion LENGTH

Convierte conjuntos de caracteres. CONVERT(char_to_convert, new_char_set, old_char_set)


Si ejecutamos:

SELECT CONVERT('ESPAA', 'US7ASCII', 'WE8ISO8859P1') FROM DUAL;


Devuelve

ESPA?A

Funcion INITCAP
Devuelve la cadena con cada palabra empezando con mayuscula y el resto en minusculas. Se considera que las palabras estan separadas por espacios o caracteres no alfanumricos.
Si ejecutamos:

SELECT INITCAP('pepe perez') FROM DUAL;


Devuelve

Pepe Perez

Funcion INSTR
Devuelve la posicion de la emesima aparicion de char2 en Char1 buscando a partir de la posicion n. Si n es negativo, cuenta la posicion de arranque desde el final. Por defecto n y m valen 1. INSTR(char1, char2 [,n [,m]])
Si ejecutamos:

SELECT INSTR('PEPE PEREZ','PER') FROM DUAL;


Devuelve

6
Si ejecutamos:

SELECT INSTR('PEPE PEREZ','PE',1,2) FROM DUAL;


Devuelve

Funcion LENGTH
Numero de caracteres de una cadena. Si Char es de tipo CHAR, la longitud incluye los blancos del final. LENGTH(char)
Si ejecutamos:

SELECT LENGTH('PEPE PEREZ') FROM DUAL;


Devuelve

10
Si ejecutamos:

SELECT LENGTH('PEPE PEREZ


Devuelve

') FROM DUAL;

15

Funcion LOWER
Devuelve la cadena en minsculas.
Si ejecutamos:

SELECT LOWER('PEPE PEREZ') FROM DUAL;


Devuelve

pepe perez

Funcion LPAD
Rellena la cadena por la izquierda hasta la longitud n con el caracter definido, por defecto es blanco. LPAD(char1, n [,char2])
Si ejecutamos:

SELECT LPAD('PEPE PEREZ',20) FROM DUAL;


Devuelve

PEPE PEREZ
Si ejecutamos:

SELECT LPAD('PEPE PEREZ',20,'-') FROM DUAL;

Devuelve

----------PEPE PEREZ

Funcion LTRIM
Por defecto, quita los blancos por la izquierda, aunque podemos definir que quite otros caracteres. LTRIM(char [,set])
Si ejecutamos:

SELECT LTRIM('
Devuelve

PEPE PEREZ') FROM DUAL;

PEPE PEREZ

Funcion REPLACE
Devuelve la cadena char cambiando cada aparicin de 'buscar' por 'cambiar'. Por defecto la cadena de reemplazo es nula. REPLACE(char, buscar [,cambiar])
Si ejecutamos:

SELECT REPLACE('PEPE PEREZ','PE','PA') FROM DUAL;


Devuelve

PAPA PAREZ

Funcion RPAD
Rellena la cadena por la derecha hasta la longitud n con el caracter definido, por defecto es blanco. RPAD(char1, n [,char2])
Si ejecutamos:

SELECT RPAD('PEPE PEREZ',20) FROM DUAL;


Devuelve

PEPE PEREZ
Si ejecutamos:

SELECT RPAD('PEPE PEREZ',20,'-') FROM DUAL;


Devuelve

PEPE PEREZ----------

Funcion RTRIM
Por defecto, quita los blancos por la derecha, aunque podemos definir que quite otros caracteres. RTRIM(char [,set])
Si ejecutamos:

SELECT RTRIM('PEPE
Devuelve

')||' '||RTRIM('PEREZ

') FROM DUAL;

PEPE PEREZ

Funcion SOUNDEX
Devuelve una cadena con una representacion fonetica (inglesa) de char. Permite comparar palabras que suenan igual (en ingles). SOUNDEX(char)
Si ejecutamos:

SELECT SOUNDEX('PEPE PEREZ') FROM DUAL;


Devuelve

P567

Funcion SUBSTR
Devuelve una subcadena de char de n caracteres a partir de la posicion m. Si m es positivo, empieza a contar desde el principio. Si m es negativo, empieza a contar desde el final. Si no ponemos n, devuelve hasta el final de la cadena. SUBSTR(char, m [, n])
Si ejecutamos:

SELECT SUBSTR('PEPE PEREZ',6) FROM DUAL;


Devuelve

PEREZ

Si ejecutamos:

SELECT SUBSTR('PEPE PEREZ',6,3) FROM DUAL;


Devuelve

PER

Funcion TRANSLATE
Devuelve char cambiando cada caracter que hay en from por el correspondiente caracter en to. Los caracteres que no estan en from no son reemplazados. TRANSLATE(char, from, to)
Si ejecutamos:

select translate ('el perro de san roque...','rp','gt') from dual;


Devuelve

TRANSLATE('ELPERRODESANR -----------------------el teggo de san goque...

Funcion TRIM
Esta funcin permite quitar los blancos por delante o por detras (o ambos a la vez) de una cadena. Con LEADING, quitamos por delante. Con TRAILING quitamos por detras. Con BOTH o no poniendo nada, quitamos de ambos lados. Si no especificamos trim_character, se quitan los espacios en blanco. Finalmente si solo ponemos trim_source quita blancos por delante y por detras. TRIM(LEADING|TRAILING|BOTH trim_char FROM trim_source)
Si ejecutamos:

SELECT TRIM('
Devuelve

PEPE PEREZ

') FROM DUAL;

PEPE PEREZ

Funcion UPPER
Devuelve la cadena en mayusculas. UPPER(cadena)
Si ejecutamos:

SELECT UPPER('Pepe Perez') FROM DUAL;


Devuelve

PEPE PEREZ

Funcion VSIZE
Numero de bytes de la representacin interna de una cadena. LENGTH(char)
Si ejecutamos:

SELECT LENGTH('PEPE PEREZ') FROM DUAL;


Devuelve

10
Si ejecutamos:

SELECT LENGTH('PEPE PEREZ


Devuelve

') FROM DUAL;

15

Funciones de agrupacin (grupo)


En esta seccin se hace un repaso de las funciones de agrupacin (group functions) mas utilizadas y algunos ejemplos. Estan descritas funciones como SUM, COUNT, MAX, ...
Pueden usarse combinadas:

SELECT PROVINCIA, COUNT(1), SUM(IMPORTE), MAX(IMPORTE), MIN(IMPORTE) FROM T_PEDIDOS GROUP BY PROVINCIA;

Funcion AVG

Determina la media del valor de una columna. AVG([DISTINCT | ALL] n)


Si ejecutamos:

SELECT AVG(Columna) FROM T_PEDIDOS;


Devuelve MEDIA de un campo en una tabla.

134.5678

Funcion COUNT
Cuenta el numero de valores en un columna o el numero de filas en una tabla. COUNT([DISTINCT | ALL] n)
Si ejecutamos:

SELECT COUNT(*) FROM T_PEDIDOS;


Devuelve el numero de filas en una tabla.

123
Si ejecutamos:

SELECT COUNT(DISTINCT Columna) FROM T_CLIENTES;


Devuelve el numero de valores distintos que tiene una columna.

13
Si ejecutamos:

SELECT COUNT(Columna) FROM T_FACTURAS;


Devuelve el numero de filas que tienen un valor no nulo.

12

Funcion MAX
Determina el mayor valor de una columna. MAX([DISTINCT | ALL] n)
Si ejecutamos:

SELECT MAX(Columna) FROM T_PEDIDOS;


Devuelve el maximo valor de un campo en una tabla.

123

Funcion MIN
Determina el mayor valor de una columna. MIN([DISTINCT | ALL] n)
Si ejecutamos:

SELECT MIN(Columna) FROM T_PEDIDOS;


Devuelve el menor valor de un campo en una tabla.

Funcion STDDEV
Determina la desviacin estandar del valor de una columna. STDDEV([DISTINCT | ALL] n)
Si ejecutamos:

SELECT STDDEV(Columna) FROM T_PEDIDOS;


Devuelve desviacin estandar de un campo en una tabla.

14.6432

Funcion SUM
Determina el mayor valor de una columna. SUM([DISTINCT | ALL] n)
Si ejecutamos:

SELECT SUM(Columna) FROM T_PEDIDOS;


Devuelve LA SUMA de un campo en una tabla.

14567

Funciones de fecha
En esta seccin se hace un repaso de las funciones de fecha (date functions) mas utilizadas y algunos ejemplos. Estan descritas funciones como ADD_MONTHS, MONTHS_BETWEEN...

Funcin ADD_MONTHS

Devuelve la fecha D mas N meses. N puede ser cualquier entero. Si d es el ultimo dia del mes origen y el mes resultante tiene menos dias, el resultado es el ultimo dia del mes resultante. En otro caso el dia es el mismo. ADD_MONTHS(d,n)
Si ejecutamos:

SELECT ADD_MONTHS(TO_DATE('31/10/2007','DD/MM/YYYY'),4) FROM DUAL;


Devuelve:

29/02/2008

Funcin CURRENT_DATE
Devuelve la fecha actual de la sesin actual. CURRENT_DATE
Si ejecutamos:

SELECT CURRENT_DATE FROM DUAL;


Devuelve:

31/10/2007 12:29:47

Funcin CURRENT_TIMESTAMP
Devuelve la fecha y hora actual de la sesin actual. CURRENT_TIMESTAMP
Si ejecutamos:

SELECT CURRENT_TIMESTAMP FROM DUAL;


Devuelve:

31/10/2007 12:41:53,787000 +02:00

Funcin LAST_DAY
Devuelve la fecha del ltimo da del mes de la fecha D. LAST_DAY(d)
Si ejecutamos:

SELECT LAST_DAY(TO_DATE('31/10/2007','DD/MM/YYYY')) FROM DUAL;


Devuelve:

31/10/2007

Funcion MONTHS_BETWEEN
Devuelve el numero de meses entre dos fechas d1 y d2. si d1 es posterior a d2, el resultado es positivo; si es anterior el resultado es negativo. MONTHS_BETWEEN(d1, d2)
Si ejecutamos:

SELECT MONTHS_BETWEEN(TO_DATE('31/10/2007','DD/MM/YYYY'),TO_DATE('01/06/200 7','DD/MM/YYYY')) FROM DUAL;


Devuelve:

4,96774193548387

Funcin NEXT_DAY
Devuelve la fecha ms cercana posterior a D cuyo dia de la semana es WD. WD puede ser LUNES, MARTES, MIRCOLES, JUEVES, VIERNES, SBADO, DOMINGO. NEXT_DAY(d,wd)
Si ejecutamos:

SELECT NEXT_DAY(TO_DATE('31/10/2007','DD/MM/YYYY'),'sbado') FROM DUAL;


Devuelve:

03/11/2007

Funcion ROUND
Devuelve la fecha d redondeada a la unidad especificada por el formato. Si se omite el formato se redondea al dia mas cercano. Si el formato es 'YYYY' se redondea arriba o abajo dependiendo del dia del ao. Si es formato es 'MM' se redondea arriba o abajo dependiendo del dia del mes. ROUND(d [,fmt])
Si ejecutamos:

SELECT ROUND(TO_DATE('31/10/2007','DD/MM/YYYY'),'YYYY') FROM DUAL;


Devuelve:

01/01/2008

Si ejecutamos:

SELECT ROUND(TO_DATE('20/04/2007','DD/MM/YYYY'),'YYYY') FROM DUAL;


Devuelve:

01/01/2007

Funcion TRUNC
Devuelve la fecha d truncada a la unidad especificada por el formato. Si se omite el formato se trunca al dia mas cercano. Si el formato es 'YYYY' se trunca abajo dependiendo del dia del ao. Si es formato es 'MM' se trunca abajo dependiendo del dia del mes. TRUNC(d [,fmt])
Si ejecutamos:

SELECT TRUNC(TO_DATE('31/10/2007','DD/MM/YYYY'),'YYYY') FROM DUAL;


Devuelve:

01/01/2007
Si ejecutamos:

SELECT TRUNC(TO_DATE('20/04/2007','DD/MM/YYYY'),'MM') FROM DUAL;


Devuelve:

01/04/2007

Funciones numricas
En esta seccin se hace un repaso de las funciones numricas ms utilizadas y algunos ejemplos. Estan descritas funciones como GREATEST, FLOOR, CEIL...

Funcin ABS
Valor absoluto de un numero. ABS(n)
Si ejecutamos:

SELECT ABS(-89) FROM DUAL;


Devuelve:

89

Funcin CEIL
Redondea n hasta el valor superior. CEIL(n)
Si ejecutamos:

SELECT CEIL(45.1242) FROM DUAL;


Devuelve:

46
Si ejecutamos:

SELECT CEIL(45.8242) FROM DUAL;


Devuelve:

46
Si ejecutamos:

SELECT CEIL(-45.8242) FROM DUAL;


Devuelve:

-45

Funcin EXTRACT
Extrae valores de una fecha o intervalo. EXTRACT ( { YEAR | MONTH | DAY | HOUR | MINUTE | SECOND } | { TIMEZONE_HOUR | TIMEZONE_MINUTE } | { TIMEZONE_REGION | TIMEZONE_ABBR } FROM { fecha | intervalo } )
Si ejecutamos:

SELECT EXTRACT(YEAR FROM TO_DATE('05/06/2007','DD/MM/YYYY')) FROM DUAL;


Devuelve:

2007

Funcin FLOOR
Redondea n al valor inferior. FLOOR(n)

Si ejecutamos:

SELECT FLOOR(45.1242) FROM DUAL;


Devuelve:

45
Si ejecutamos:

SELECT FLOOR(45.8242) FROM DUAL;


Devuelve:

45
Si ejecutamos:

SELECT FLOOR(-45.8242) FROM DUAL;


Devuelve:

-46

Funcin GREATEST
Devuelve el mayor de una lista de expresiones. GREATEST(exp1, exp2, ...)
Si ejecutamos:

SELECT GREATEST(1,3,6,89,56,3) FROM DUAL;


Devuelve:

89

Funcin LEAST
Devuelve el menor de una lista de expresiones. LEAST(exp1, exp2,...)
Si ejecutamos:

SELECT LEAST(1,3,6,89,56,3) FROM DUAL;


Devuelve:

Funcin MOD
Devuelve el resto de dividir M entre N. Devuelve M si N es 0.

MOD(m,n)
Si ejecutamos:

SELECT MOD(13,5) FROM DUAL;


Devuelve:

Funcin REMAINDER
Devuelve el resto de dividir m por n. Se calcula de la siguiente forma: m - (n * X) donde X es el entero ms cercano a m / n . REMAINDER(m,n)
Si ejecutamos:

SELECT REMAINDER(16,3) FROM DUAL;


Devuelve:

1
Si ejecutamos:

SELECT REMAINDER(20,3) FROM DUAL;


Devuelve:

-1
Si ejecutamos:

SELECT REMAINDER(15,6) FROM DUAL;


Devuelve:

Funcin ROUND
Redondea N hasta la posicin M a la derecha del punto decimal. Por defecto M es 0. Si M es negativo redondea hacia la izquierda del punto decimal. Por supuesto, M debe ser entero. ROUND(n [,m])
Si ejecutamos:

SELECT ROUND(45.1242,2) FROM DUAL;


Devuelve:

45.12
Si ejecutamos:

SELECT ROUND(45.8242) FROM DUAL;


Devuelve:

46
Si ejecutamos:

SELECT ROUND(-45.8242) FROM DUAL;


Devuelve:

-46

Funcin SIGN
Si N < 0 devuelve -1, si N = 0 devuelve 0; si N > 0 devuelve 1. SIGN(n)
Si ejecutamos:

SELECT SIGN(-89) FROM DUAL;


Devuelve:

-1

Funcin TRUNC
Trunca N hasta la posicin M a la derecha del punto decimal. Por defecto M es 0. Si M es negativo trunca hacia la izquierda del punto decimal (pone ceros). Por supuesto, M debe ser entero. TRUNC(n [,m])
Si ejecutamos:

SELECT TRUNC(45.1242,2) FROM DUAL;


Devuelve:

45.12
Si ejecutamos:

SELECT TRUNC(45.8242) FROM DUAL;


Devuelve:

45

Si ejecutamos:

SELECT TRUNC(-45.8242) FROM DUAL;


Devuelve:

-45
Si ejecutamos:

SELECT TRUNC(45.1242,-1) FROM DUAL;


Devuelve:

40

Funciones de conversin
En esta seccin se hace un repaso de las funciones de conversin (conversion functions) mas utilizadas y algunos ejemplos. Estan descritas funciones como TO_CHAR, TO_NUMBER...

Funciones diversas muy tiles


Estan tambien descritas funciones como DECODE, NVL...

Funcin CASE
Evalua diferentes expresiones para dar un valor de salida. CASE WHEN expr1 THEN val1 WHEN expr2 THEN val2 ... ELSE valn END
Si ejecutamos:

SELECT CASE WHEN ESTADO<=0 THEN 'bien' WHEN ESTADO>=1 AND ESTADO<=5 THEN 'regular' ELSE 'mal' END FROM T_PEDIDOS;
Devuelve:

bien bien regular mal ...

Funcin DECODE

Traduce una expresin a un valor de retorno. Si expr es igual a value1, la funcin devuelve Return1. Si expr es igual a value2, la funcin devuelve Return2. Y asi sucesivamente. Si expr no es igual a ningun valor la funcion devuelve el valor por defecto. DECODE(expr, value1 [, return1, value2, return2....,] default )
Si ejecutamos:

SELECT DECODE(ESTADO,0,'bien',1,'regular','mal') FROM T_PEDIDOS;


Devuelve:

bien bien regular mal ...

Funcin NULLIF
Esta funcin compara expr1 con expr2. Si son iguales devuelve NULL. Los argumentos pueden ser de cualquier tipo. NULLIF(expr1, expr2))
Si ejecutamos:

SELECT NULLIF('peras','manzanas') FROM DUAL;


Devuelve:

peras
Pero si ejecutamos:

SELECT NULLIF('peras','peras') FROM DUAL;


Devuelve:

NULL

Funcin NVL
Si expr1 es nulo, devuelve expr2. Si expr1 no es nulo, devuelve expr1. Los argumentos pueden ser de cualquier tipo. NVL(expr1, expr2))
Si ejecutamos:

SELECT NVL(ESTADO,0) FROM T_PEDIDOS;


Devuelve:

1 2 0 1 ...

Funcin NVL2
Si expr1 no es nulo, devuelve expr2. Si expr1 es nulo, devuelve expr3. Los argumentos pueden ser de cualquier tipo. NVL2(expr1, expr2, expr3))
Si ejecutamos:

SELECT NVL2(ESTADO,'hay valor','no hay valor') FROM T_PEDIDOS;


Devuelve:

hay valor no hay valor no hay valor hay valor no hay valor hay valor ...

Funcion TO_CHAR
Convierte una fecha a una cadena o un nmero con el formato especificado. TO_CHAR(date1 [,fmt]);

TO_CHAR(number1 [,fmt])
Si ejecutamos:

SELECT TO_CHAR(sysdate) FROM DUAL;


Devuelve:

15-JUN-01

Si ejecutamos:

SELECT TO_CHAR(sysdate, 'dd/mm/yyyy') FROM DUAL;


Devuelve:

15/06/2001
Si ejecutamos:

SELECT TO_CHAR(sysdate,'Mon') FROM DUAL;


Devuelve el nombre corto del mes:

Jun
Si ejecutamos:

SELECT TO_CHAR(sysdate, 'Month') FROM DUAL;


Devuelve el nombre largo del mes:

Junio
Si ejecutamos:

SELECT TO_CHAR(sysdate, 'DDD') FROM DUAL;


Devuelve los 3 digitos del dia del ao:

058
Si ejecutamos:

SELECT TO_CHAR(123.456, '09999') FROM DUAL;


Devuelve:

00123
Si ejecutamos:

SELECT TO_CHAR(123.456, '09999.9') FROM DUAL;


Devuelve:

00123.5
Si ejecutamos:

SELECT TO_CHAR(123456, 'FM999,999,999') FROM DUAL;


Devuelve:

123,456

Funcion TO_DATE
Convierte una cadena en un valor de tipo DATE. Ver en TO_CHAR ejemplos de formato. TO_DATE(char [,fmt])
Si ejecutamos:

SELECT TO_DATE('31/10/2007','DD/MM/YYYY') FROM DUAL;


Devuelve:

31/10/2007

Funcion TO_NUMBER
Convierte una cadena en un valor de tipo NUMBER. Ver en TO_CHAR ejemplos de formato. TO_NUMBER(char [,fmt])
Si ejecutamos:

SELECT TO_NUMBER('123') FROM DUAL;


Devuelve:

123

Funciones de sistema y pseudocolumnas


En esta seccin se hace un repaso de las pseudocolumnas y funciones del sistema ms utilizadas y algunos ejemplos. Estan descritas funciones como ROWNUM, ROWID...

Tabla DUAL
Es una tabla, creada durante la instalacin, con una sola columna llamada DUMMY y una sola fila de contenido 'X'. El propietario es SYS y puede ser accedida por cualquier usuario.
Si ejecutamos:

SELECT * FROM DUAL;


Devuelve:

DUMMY --------

X
Se usa para generalmente para ejecutar funciones (ADD_MONTHS,...) y pseudocolumnas (como SYSDATE,...). Es posible agregar y quitar registros y columnas pero NO ES NADA RECOMENDABLE!.

Tabla de parmetros de session


La tabla NLS_SESSION_PARAMETERS nos da los parametros de idioma de la sesin actual.
Si ejecutamos:

SELECT PARAMETER,VALUE FROM NLS_SESSION_PARAMETERS;


Devuelve:

PARAMETER NLS_LANGUAGE NLS_TERRITORY NLS_CURRENCY NLS_ISO_CURRENCY

VALUE AMERICAN AMERICA $ AMERICA

NLS_NUMERIC_CHARACTERS ,. NLS_CALENDAR NLS_DATE_FORMAT NLS_DATE_LANGUAGE NLS_SORT NLS_TIME_FORMAT NLS_TIMESTAMP_FORMAT NLS_TIME_TZ_FORMAT GREGORIAN DD-MON-YY AMERICAN BINARY HH.MI.SSXFF AM DD-MON-RR HH.MI.SSXFF AM HH.MI.SSXFF AM TZR DD-MON-RR HH.MI.SSXFF AM TZR

NLS_TIMESTAMP_TZ_FORMAT NLS_DUAL_CURRENCY NLS_COMP NLS_LENGTH_SEMANTICS NLS_NCHAR_CONV_EXCP $ BINARY CHAR FALSE

Funcin Rowid
Rowid es una pseudocolumna que identifica de manera nica una fila en una tabla, pero NO en cualquier tabla.
Si ejecutamos:

SELECT ROWID FROM DUAL;


Devuelve:

AB45FAOO....

Funcion ROWNUM
Rownum es una pseudocolumna. Numera los registros de un conjunto de resultados. Al primer registro que cumple el criterio de la clausula where en una sentencia select se le da rownum=1, y cada uno de los siguientes registros se le incrementa en 1.

select rownum, numproduct, descproduct from T_PRODUCTOS where numproduct>100


Es importante darse cuenta de que la primera fila siempre tiene rownum=1. Esto implica que la siguiente consulta no devolvera filas:

select numproduct, descproduct from T_PRODUCTOS where numproduct>100 and rownum > 5
Esto es porque la primera fila no puede cumplir estos dos criterios mutuamente excluyentes: * rownum es 1 * rownum es 6 (rownum > 5) Lo mejor seria hacer una subconsulta del tipo:

select numproduct, descproduct from ( select rownum r_, numproduct, descproduct from T_PRODUCTOS where numproduct>100

) where r_ > 5

Funcion SYSDATE
Devuelve la fecha y hora del servidor. SYSDATE
Si ejecutamos:

SELECT SYSDATE FROM DUAL;


Devuelve:

18/01/2007 19:33:37

Funcion SYS_CONTEXT
Devuelve informacin de la sesin actual del usuario.

SYS_CONTEXT(namespace,param,[length])
Valores de parmetro:

ACTION

Devuelve la posicin en el mdulo

AUDITED_CURSORID Devuelve el ID del cursor que ha lanzado la auditora AUTHENTICATED_IDENTITY Devuelve la identidad usada en la autentificacin AUTHENTICATION_DATA Datos de autentificacin AUTHENTICATION_METHOD Devuelve el mtodo de autentificacin AUTHENTICATION_TYPE Devuelve como se ha autentificado el ususario. Puede tener uno de estos valores: Database, OS, Network, or Proxy BG_JOB_ID Si la sesin se ha establecido desde un proceso background de oracle, este parmetro devuelve el Job ID. En otro caso devuelve NULL. CLIENT_IDENTIFIER Devuelve el identificador de cliente (global context) CLIENT_INFO Devuelve la informacin cargada mediante el paquete DBMS_APPLICATION_INFO CURRENT_BIND Bind variables para auditora CURRENT_SCHEMA Devuelve el esquema por defecto usado en el actual esquema CURRENT_SCHEMAID Devuelve el identificador esquema por defecto usado en el actual esquema CURRENT_SQL Devuelve la SQL que ha lanzado el evento de auditora CURRENT_SQL_LENGTH Devuelve la longitud de la SQL que ha lanzado el evento de auditora CURRENT_USER Nombre del usuario actual CURRENT_USERID Identificador del usuario actual DB_DOMAIN Dominio de la base de datos del parmetro de inicializacin DB_DOMAIN

DB_NAME Nombre de la base de datos del parmetro de inicializacin DB_NAME DB_UNIQUE_NAME Nombre de la base de datos del parmetro de inicializacin DB_UNIQUE_NAME ENTRYID Identificador del la entrada de auditora disponible ENTERPRISE_IDENTITY Identidad de la empresa EXTERNAL_NAME Nombre externo del usuario de la base de datos FG_JOB_ID Si la sesin se ha establecido desde un proceso foreground de oracle, este parmetro devuelve el Job ID. En otro caso devuelve NULL. GLOBAL_CONTEXT_MEMORY El nmero usado en el System Global Area para acceer al contexto GLOBAL_UID Identificador global de usuario del Oracle Internet Directory. Devuelve NULL para todas las dems entradas. HOST Nombre de la mquina desde la que se ha contectado el cliente. IDENTIFICATION_TYPE Devuelve el modo en que ha creado el esquema de usuario. INSTANCE Identificador de la instancia actual INSTANCE_NAME Nombre de la instancia actual IP_ADDRESS Direccin IP de la mquina desde la que esta contectado el cliente actual. ISDBA Devuelve TRUE si el usuario tiene privilegios de DBA si no devuelve FALSE. LANG La abreviatura ISO del lenguaje LANGUAGE El leguaje, territorio y conjunto de caracteres de la sesin. El formato es el siguiente: language_territory.characterset MODULE Devuelve el nombre de aplicacin establecido mediante el paquete DBMS_APPLICATION_INFO o OCI. NETWORK_PROTOCOL Protcolo de red usado NLS_CALENDAR El calendario usado enThe calendar of the current session NLS_CURRENCY Moneda de la sesin actual. NLS_DATE_FORMAT Formato de fecha de la sesin actual. NLS_DATE_LANGUAGE Lenguaje usado para la fechas. NLS_SORT Lenguaje de ordenacin. NLS_TERRITORY Territorio de la sesin actual. OS_USER Usuario del sistema operativo. POLICY_INVOKER Invocador de la poltica de seguridad a nivel de fila. PROXY_ENTERPRISE_IDENTITY DN del Oracle Internet Directory. PROXY_GLOBAL_UID Identificador de usuario global de Oracle Internet Directory for enterprise. PROXY_USER Nombre de usuario detras de SESSION_USER PROXY_USERID Identificador de usuario detras de SESSION_USER SERVER_HOST Nombre del servidor donde se est ejecutando la instancia de la base de datos. SERVICE_NAME Nombre del servicio donde esta conectada la sesin. SESSION_USER Nombre del usuario de la base de datos con el que esta contectada la sesin. SESSION_USERID Identificador del usuario de la base de datos con el que esta contectada la sesin. SESSIONID Identificador de la sesin SID Nmero de sesin

STATEMENTID sentencia TERMINAL


Por ejemplo:

El identificador de auditora de Nombre del terminal

select sys_context('USERENV', 'DB_NAME') from dual;


devuelve: mydatabase

Funcion USER
Devuelve el identificador de usuario de la sesin actual.

select USER from dual;

Funcion USERENV
Devuelve informacin de la sesin actual del usuario.

USERENV(param)
Valores de parmetro:

CLIENT_INFO Devuelve la informacin cargada mediante el paquete DBMS_APPLICATION_INFO ENTRYID INSTANCE Identificador de entrada Identificador de la instancia actual

ISDBA Devuelve TRUE si el usuario tiene privilegios de DBA si no devuelve FALSE. LANG La abreviatura ISO del lenguaje

LANGUAGE El leguaje, territorio y conjunto de caracteres de la sesin. El formato es el siguiente: language_territory.characterset SESSIONID TERMINAL
Por ejemplo:

Identificador de la sesin Nombre del terminal

select USERENV('LANGUAGE') from dual;


devuelve: SPANISH_SPAIN.WE8ISO8859P1