tareas del dba para un famoso gestor de bases de datos relacional

94
Tareas del DBA (Administrador de la base de datos) Las tareas que normalmente debe realizar el DBA son, entre otras: 1. Instalación del software de Oracle, normalmente en colaboración y coordinado con el administrador del sistema operativo. Esto incluye motor de la BD, actualizaciones, herramientas administrativas, cambios de hardware, etc... 2. Instalación de las aplicaciones, propias o ajenas, sobre oracle (CREATE DATABASE). Esto incluye pruebas antes de pasar a producción. 3. Controlar la seguridad de la BD. Esto incluye la altas y bajas de usuarios (CREATE USER), creación de roles (CREATE ROLE) y auditorias de seguridad. 4. Monitorización y optimización 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 recuperación de datos. 6. Prevención 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 diseño del modelo de datos, la optimización (TUNNING), construcción de procedimientos almacenados y triggers, definición de estándares de diseño y nomenclatura. 8. Documentar todo lo relativo a la BD. Create Database Sirve para crea una base de datos. Desde el punto de vista físico, una base de datos es, para oracle, un conjunto de ficheros, a saber: datafiles, ficheros de datos, definidos en la creación de la base de datos. log files, ficheros de log, definidos tambien en la creación de la base de datos. init.ora, fichero de texto que contiene los parámetros de configuración 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

Upload: carmelo-escribano-sen

Post on 02-Aug-2015

279 views

Category:

Documents


10 download

TRANSCRIPT

Page 1: Tareas Del DBA para un famoso gestor  de bases de datos relacional

Tareas del DBA (Administrador de la base de

datos)

Las tareas que normalmente debe realizar el DBA son, entre otras:

1. Instalación del software de Oracle, normalmente en colaboración y coordinado con el administrador del sistema operativo. Esto incluye motor de la BD, actualizaciones, herramientas administrativas, cambios de hardware, etc...

2. Instalación de las aplicaciones, propias o ajenas, sobre oracle (CREATE

DATABASE). Esto incluye pruebas antes de pasar a producción. 3. Controlar la seguridad de la BD. Esto incluye la altas y bajas de usuarios (CREATE

USER), creación de roles (CREATE ROLE) y auditorias de seguridad.

4. Monitorización y optimización 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 recuperación de datos.

6. Prevención 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 diseño del modelo de datos, la optimización (TUNNING), construcción de procedimientos almacenados y triggers, definición de estándares de diseño y nomenclatura.

8. Documentar todo lo relativo a la BD.

Create Database

Sirve para crea una base de datos.

Desde el punto de vista físico, una base de datos es, para oracle, un conjunto de ficheros, a saber:

datafiles, ficheros de datos, definidos en la creación de la base de datos.

log files, ficheros de log, definidos tambien en la creación de la base de datos.

init.ora, fichero de texto que contiene los parámetros de configuración 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

Page 2: Tareas Del DBA para un famoso gestor  de bases de datos relacional

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 instrucción:

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;

Page 3: Tareas Del DBA para un famoso gestor  de bases de datos relacional

6) Ejecutar sql de creación: 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:

Page 4: Tareas Del DBA para un famoso gestor  de bases de datos relacional

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 creación de un rol:

CREATE ROLE MI_PROPIO_ROLE

Crea un rol sin password:

CREATE ROLE role NOT IDENTIFIED

Page 5: Tareas Del DBA para un famoso gestor  de bases de datos relacional

Crea un rol con password:

CREATE ROLE role IDENTIFIED BY password

Crea un rol de aplicación:

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 ejecución.

Para matar un sesión:

SELECT SID,SERIAL# FROM V$SESSION WHERE USERNAME='NOMBRE-USUARIO';

ALTER SYSTEM KILL SESSION 'session-id,session-serial';

Actualizar estadísticas

Consiste en recopilar y actualizar el CATALOGO de oracle con datos estadísticos.

En las ultimas versiones, estos datos estadísticos son muy importantes para que

oracle pueda elegir el plan de ejecución más adecuado a cada sentencia (EXPLAIN PLAN).

Estos datos no pueden actualizarse en tiempo real porque penalizarías mucho el rendimiento general de la base de datos.

Page 6: Tareas Del DBA para un famoso gestor  de bases de datos relacional

Se actualizan datos como el número de registros de una tabla, el tamaño de los

objetos, etc.

Actualmente hay dos formas de actualiza las estadísticas 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 estadísticos.

La cláusula COMPUTE hace un cálculo exacto de la estadísticas (tarda más en realizarse en ANALYZE)

La cláusula ESTIMATE hace una estimación partiendo del anterior valor calculado y

de un posible factor de variación.

La cláusula DELETE borra las anteriores estadísticas.

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 estimación mirando el 20% de las filas:

ANALYZE TABLE T_PEDIDOS ESTIMATE STATISTICS SAMPLE 20 PERCENT;

Para borrar las estadísticas:

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:

Page 7: Tareas Del DBA para un famoso gestor  de bases de datos relacional

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 estimación 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 recálculo de las estadísticas 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 más

comodo, más 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 específico de la base de datos.

Para una sentencia SQL:

AUDIT ALL|ALL PRIVILEGES|sentencia_sql|privilegio_sistema

[opciones]

Opciones:

BY user

Page 8: Tareas Del DBA para un famoso gestor  de bases de datos relacional

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 parámetro del init.ora AUDIT_TRAIL = YES

Catálogo

El catálogo de oracle es un conjunto de tablas y vistas que contienen la definición de la estructura lógica y física de la base de datos.

Esto incluye los objetos existentes, la situación de los datafiles, la configuración de los usuarios, etc.

Los nombres de las tablas de catálogo sigue la siguiente nomenclatura de prefijos:

DBA_ Objetos con información de administrador. Sólo accesibles por

usuarios DBA.

USER_ Objetos con información del usuario con el que estamos

conectado.

Proporcionan menos información que los objetos DBA_

ALL_ Objetos con información de todos los objetos en base de datos.

V_$ ó V$ Tablas virtuales

Existe una tabla de catálogo para cada tipo de objeto posible (en plural).

TABLES, VIEWS, SEQUENCES, TABLESPACES...

Sabiendo esto podemos ver algunos ejemplos:

DBA_TABLES Información para administradores de las tablas en base de

datos.

USER_VIEWS Información de las vistas creadas por el usuario desde el

que accedemos.

ALL_SEQUENCES Información de todas las secuencias existentes en base

de datos.

DBA_TABLESPACES Información de administración sobre los tablespaces.

Page 9: Tareas Del DBA para un famoso gestor  de bases de datos relacional

USER_TAB_COLUMNS Todas las columnas de tabla en el usuario activo.

Los objetos de catálogo pueden estar relacionados entre ellos. Por ejemplo, el

objeto ALL_TABLES guarda una relación 1-N con el objeto ALL_TAB_COLUMNS: Una

tabla tiene N columnas.

Si se quiere que todos los usuarios tengan algún tipo de acceso a un objeto, podemos dar

ese privilegio al rol PUBLIC.

El catálogo público son aquellas tablas (USER_ y ALL_) que son accesibles por

todos los usuarios. Normalmente dan información sobre los objetos creados en la base de datos.

El catálogo de sistema (DBA_ y V_$) es accesible sólo desde usuarios DBA y

contiene tanto información de objetos en base de datos, como información específica de la base de datos en sí (versión, parámetros, procesos ejecutándose...)

Ciertos datos del catálogo de Oracle debe actualizarse para el buen funcionamiento de la base de datos (ANALYZE).

Disponemos de un par de tablas en el catálogo público que sirven al analista y al programador para crear comentarios sobre tablas y columnas.

ALL_TAB_COMMENTS Contiene los comentarios para tablas y vistas.

ALL_COL_COMMENTS Contiene los comentarios para las columnas de

tablas y vistas.

Estas tablas se mantienten por medio de la sentencia COMMENT.

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

Dependencias (Recompilación)

Las actualizaciones, parches y cambios de librerias pueden invalidar objetos del esquema.

Una vez realizados los cambios los objetos dependientes serán 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 además permite descubrir si los cambios han afecteado al resto del codigo.

Identificación 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 información podemos decidir que metodo seguir para recompilar.

Page 10: Tareas Del DBA para un famoso gestor  de bases de datos relacional

Recompilación manual

Para un numero pequeño de objetos es probable que la recompilación manual sea suficiente.

ALTER PACKAGE my_package COMPILE;

ALTER PACKAGE my_package COMPILE BODY;

ALTER PROCEDURE my_procedure COMPILE;

ALTER FUNCTION my_function COMPILE;

ALTER TRIGGER my_trigger COMPILE;

ALTER 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);

Page 11: Tareas Del DBA para un famoso gestor  de bases de datos relacional

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

recompilación.

Los procedimientos que nos da oracle y que están explicados a continuación 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 operación 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.

Page 12: Tareas Del DBA para un famoso gestor  de bases de datos relacional

EXPLAIN PLAN (plan de ejecución)

Esta sentencia guarda el plan de ejecución 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 ejecución de la sentencia.

Un plan de ejecución 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 búsquedas del tipo FULL TABLE SCAN.

Export

Es una utilidad que genera un archivo binario con toda la información de estructura y contenido de una base de datos.

Estos archivos sólo pueden ser leídos por la utilidad de importación 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 utilización del comando, las opciones se pueden escribir en un archivo de texto y referenciar desde la línea de comandos de la siguiente manera:

Page 13: Tareas Del DBA para un famoso gestor  de bases de datos relacional

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 opción para volver a compactarlos.

Reorganizar los datafiles: Siguiendo la misma lógica anterior, también se puede

redistribuir la información en los archivos físicos que se desee.

Y las opciones son siempre del tipo PARÁMETRO=valor. Ya sea que se utilice un archivo paramétrico o no, la mayoría de los parámetros que se pueden utilizar en la sintaxis de este comando son:

BUFFER=bytes

Especifica el tamaño del buffer de copia (en bytes).

Si el valor es cero, entonces se recuperan las filas de a una.

COMPRESS=[Y o N]

Este parámetro indica cómo deberá tratarse la extensión inicial.

Con "Y", entonces toda la información se consolidará dentro de una

única extensión.

Con "N", se utilizarán los parámetros vigentes para la cláusula

STORAGE. Por defecto es "Y".

CONSISTENT=[Y o N]

Con "Y", espera a que la información que se está actualizando sea

confirmada.

Es una opción 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

exportación.

FULL=[Y o N]

Indica si se hace una exportación 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".

Page 14: Tareas Del DBA para un famoso gestor  de bases de datos relacional

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

exportación. Se separan por coma.

TABLES=(tabla1, tabla2...)

Lista de tablas que se van a exportar.

Es válido cuando sólo 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 exportación.

Es posible obtener una lista de las opciones disponibles escribiendo:

IMP80 HELP=Y;

A continuación sólo 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 importación 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 ejecución de una consulta se

denomina "Plan de ejecución" (ver EXPLAIN PLAN).

Page 15: Tareas Del DBA para un famoso gestor  de bases de datos relacional

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 excepción 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 número de usuarios conectados, ni la carga de datos de los objetos, etc. Es un sistema de optimización estático, no varía de un momento a otro.

Optimizador por costes (CHOOSE)

se basa en las reglas básicas, pero teniendo en cuenta el estado actual de la base

de datos. Es decir, tiene en cuenta el número de registros de las tablas, el número

de usuarios accediendo a ellas, etc. Por ejemplo, si se hace una consulta utilizando

un campo indexado, mirará primero el número 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

catálogo público, por lo que es recomendable que esté lo más actualizado posible (a

través de la sentencia ANALYZE), ya que de no ser así, se pueden tomar decisiones

a partir de datos desfasados (la tabla tenía 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 cómo 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 sesión activa para que todas las consultas sean optimizadas de una manera:

ALTER SESSION SET OPTIMIZER_GOAL = [RULE|CHOOSE];

Con esto todas las consultas se ejecutarán utilizando el optimizador indicado. La otra manera es forzando a Oracle a que utilice un optimizador en una consulta concreta. Esto se hace a través 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 ejecución. Los hint deben

ir junto detrás de la palabra SELECT: A continuación 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 número

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.

Page 16: Tareas Del DBA para un famoso gestor  de bases de datos relacional

/*+ INDEX( tabla índice ) */ Fuerza la utilización 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 ejecución)

Las trazas de ejecución de oracle sirven para mostrar las sentencias SQL y su plan de ejecución de programas que acceden a bases de datos Oracle.

No es necesario disponer del código fuente ni de la sentencia SQL para saber qué y cómo se ejecutado.

Page 17: Tareas Del DBA para un famoso gestor  de bases de datos relacional

Básicamente, activar la traza de ejecución 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 parámetros:

SELECT SID, SERIAL#, MACHINE, TERMINAL, PROGRAM

FROM SYS.V_$SESSION

WHERE USERNAME = 'usuario';

SID y SERIAL# definen la sesión a la cual queremos hacer con la traza. El tercer

parámetro indica si queremos activar/desactivar la traza de ejecución.

Una vez activada la traza con SET_SQL_TRACE_IN_SESSION, toda sentencia

ejecutada sobre la sesión indicada quedará registrada en un archivo .TRC,

normalmente bajo el directorio ORACLE_HOME/trace80

Este fichero contiene información detallada (pero ilegible) de los planes de

ejecución. Para conseguir una salida legible de esta traza se debe ejecutar la utilidad TKPROF.

Trazas con SQL*Plus

Otra forma de hacer trazas de ejecución es en SQL*Plus, con la instrucción:

SET AUTO TRACE ON/OFF

Una vez activada la auto-traza, toda sentencia ejecutada en SQL*Plus vendrá

acompañada de su plan y estadísticas de ejecución.

Si, además, queremos cronometrar el tiempo de ejecución de cada consulta, podemos activar el cronómetro con:

SET TIMING ON

SET

Configuración 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)

Page 18: Tareas Del DBA para un famoso gestor  de bases de datos relacional

-- 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 (optimización)

El objetivo de tunning es la puesta a punto (optimización) de las sentencias SQL, desde el punto de vista del tiempo de ejecución y consumo de recursos.

Podemos examinar el comportamiento de una sentencia SQL analizando su plan de ejecución:

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 estadísticas periodicamente (ANALYZE).

4. Usar clausulas STORAGE adecuada en la creación de tablas (CREATE TABLE).

5. Usar EXPORT IMPORT.

6. Cuidar la programación.

Page 19: Tareas Del DBA para un famoso gestor  de bases de datos relacional

En particular debemos prestar atención la sentencias SELECT que son más dadas a

la complejidad.

Indices

Respecto a los indices debemos tener en cuenta:

1. Crear índices sobre columnas lo más selectivas posibles (aquellas que reducen al máximo el espacio de búsqueda).

2. En el caso de los índices compuestos, el orden en el que se declaran estas columnas deberá ser de la más selectiva a la menos selectiva (siempre que sea posible).

3. En algunos casos es conveniente sustituir índices compuestos por varios índices

simples.

Programación

Respecto a la programación:

1. Limitar los accesos a tablas remotas.

2. Utilizar la cláusula 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, cláusula exists subconsulta , outer-join etc...).

9. Revisar las consultas periodicamente, pueden no se ya optimas debido al constante cambio en el tamaño de las tablas, la distribución de los valores, el esquema etc....

Además

1. Gestión 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 después 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

tamaño de las tablas involucradas puede resultar conveniente hacerlo de un modo u

otro. Debemos tener en cuenta que, si una vista contiene una operación 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 parámetros por valor (where salario>1000) o una vez compilada la sentencia haciendo uso de Bind Variables (where salario>:b1). La ventaja de la segunda

opción es que Oracle compila un única vez la sentencia y reutiliza el código compilado para cada uno de los valores para los parámetros. 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 operación), 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 cláusulas start with y connect by en el caso de consultas sobre datos

relacionados por alguna relación de herencia.

Page 20: Tareas Del DBA para un famoso gestor  de bases de datos relacional

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 asignación 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 reconexión.

Excepciones:

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.

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 creación de un usuario CREATE USER o modificandolo

ALTER USER.

Un ejemplo de script sería:

CREATE PROFILE app_user LIMIT

SESSIONS_PER_USER 2 --

CPU_PER_SESSION 10000 -- decimas de segundo

CPU_PER_CALL 1 -- decimas de segundo

CONNECT_TIME UNLIMITED -- minutos

Page 21: Tareas Del DBA para un famoso gestor  de bases de datos relacional

IDLE_TIME 30 -- minutos

LOGICAL_READS_PER_SESSION DEFAULT -- DB BLOCKS

LOGICAL_READS_PER_CALL DEFAULT -- DB BLOCKS

-- COMPOSITE_LIMIT DEFAULT --

PRIVATE_SGA 20M --

FAILED_LOGIN_ATTEMPTS 3 --

PASSWORD_LIFE_TIME 30 -- dias

PASSWORD_REUSE_TIME 12 --

PASSWORD_REUSE_MAX UNLIMITED --

PASSWORD_LOCK_TIME DEFAULT -- dias

PASSWORD_GRACE_TIME 2 -- dias

PASSWORD_VERIFY_FUNCTION NULL;

Los recursos que limitamos son recursos del kernel: uso de la CPU, duración de

sesion,...

Y tambien limites de uso de las claves de acceso (passwords): duración, 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 sesión 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 creación 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 aplicación:

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:

Page 22: Tareas Del DBA para un famoso gestor  de bases de datos relacional

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;

Page 23: Tareas Del DBA para un famoso gestor  de bases de datos relacional

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 modificación 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}

Page 24: Tareas Del DBA para un famoso gestor  de bases de datos relacional

[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 opción WITH GRANT OPTION damos permiso para que el que los recibe los pueda a su vez asignar a otros usuarios y roles.

La opción "GRANT ALL PRIVILEGES..." se puede escribir tambien como "GRANT ALL..."

Page 25: Tareas Del DBA para un famoso gestor  de bases de datos relacional

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:

Page 26: Tareas Del DBA para un famoso gestor  de bases de datos relacional

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}

Page 27: Tareas Del DBA para un famoso gestor  de bases de datos relacional

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 opción 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 definición de una tabla. Podemos cambiar tanto columnas

como restricciones (ver CONSTRAINTS).

La sintaxis es:

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

Añadir una columna a una tabla:

Page 28: Tareas Del DBA para un famoso gestor  de bases de datos relacional

ALTER TABLE T_PEDIDOS ADD TEXTOPEDIDO Varchar2(35);

Cambiar el tamaño 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...';

Añade 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 ''.

Page 29: Tareas Del DBA para un famoso gestor  de bases de datos relacional

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 restricción UNIQUE:

ALTER TABLE T_PEDIDOS ADD CONSTRAINT UK_ESTADO

UNIQUE (correosid);

Normalmente una restricción de este tipo se implementa mediante un indice unico

(ver CREATE INDEX).

Borrar una restricción:

ALTER TABLE T_PEDIDOS DROP CONSTRAINT CON1_PEDIDOS;

Deshabilita una restricción:

ALTER TABLE T_PEDIDOS DISABLE CONSTRAINT CON1_PEDIDOS;

habilita una restricción:

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]

Page 30: Tareas Del DBA para un famoso gestor  de bases de datos relacional

DROP UNIQUE (column,...) [{KEEP|DROP} INDEX]

DROP CONSTRAINT constraint [CASCADE]

MODIFY CONSTRAINT constraint constrnt_state

MODIFY PRIMARY KEY constrnt_state

MODIFY UNIQUE (column,...) constrnt_state

RENAME 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 restricción:

ALTER TABLE T_PEDIDOS DROP CONSTRAINT CON1_PEDIDOS;

Create Database

Sirve para crea una base de datos.

Desde el punto de vista físico, una base de datos es, para oracle, un conjunto de ficheros, a saber:

datafiles, ficheros de datos, definidos en la creación de la base de datos.

log files, ficheros de log, definidos tambien en la creación de la base de datos.

init.ora, fichero de texto que contiene los parámetros de configuración 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)

Page 31: Tareas Del DBA para un famoso gestor  de bases de datos relacional

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 instrucción:

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 creación: catalog.sql y catproc.sql

Sintaxis completa:

Page 32: Tareas Del DBA para un famoso gestor  de bases de datos relacional

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.

Page 33: Tareas Del DBA para un famoso gestor  de bases de datos relacional

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 más, 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]

Page 34: Tareas Del DBA para un famoso gestor  de bases de datos relacional

[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 además index_attribs puede ser cualquier combinación 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.

Page 35: Tareas Del DBA para un famoso gestor  de bases de datos relacional

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 números 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

Page 36: Tareas Del DBA para un famoso gestor  de bases de datos relacional

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 opción 'PUBLIC' se crea un sinonimo público accesible a todos los usuarios,

siempre que tengan los privilegios adecuados para el mismo. (ver GRANT)

Sirve para no tener que usar la notación '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 públicos.

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 creación de tablas es:

CREATE [GLOBAL TEMPORARY] TABLE [esquema.]tabla

Page 37: Tareas Del DBA para un famoso gestor  de bases de datos relacional

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 number primary key

fecpedido date,

numclient references T_CLIENTES

)

Una clave primaria (primary key) necesita tener asociado un indice unico (unique index). Es

posible especificar el tablespace donde queremos crear el indice.

create table T_PEDIDOS(

numpedido number primary key

fecpedido date,

numclient references T_CLIENTES

constraint pk_pedidos (numpedido) using index tablespace ts_idx

)

Index organized tables (IOT)

create table iot_ (

Page 38: Tareas Del DBA para un famoso gestor  de bases de datos relacional

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 by newline

fields 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 ( 6 ),

descr varchar2(30 ),

quant Number ( 4,2)

);

/

create or replace type items as table of item;

/

create table bag_with_items (

Page 39: Tareas Del DBA para un famoso gestor  de bases de datos relacional

bag_id number(7) primary key,

bag_name varchar2(30) not null,

the_items_in_the_bag items

)

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 lógica de almacenamiento dentro de una base de datos oracle.

Es un puente entre el sistema de ficheros del sistema operativo y la base de datos.

Cada tablespace se compone de, al menos, un datafile y un datafile solo puede pertenecer a un tablespace.

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

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 opción 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

Page 40: Tareas Del DBA para un famoso gestor  de bases de datos relacional

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 lógica 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 lógica 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 definición 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 definición de las columnas de las tablas podemos usar los siguientes tipos de

datos:

CHAR(n)

Cadena de caracteres de longitud fija, tiene un tamaño n bytes.

Si no se especifica n la ORACLE le da un tamaño de 255 bytes.

El tamaño máximo en BD es 2000 bytes y el mínimo 1 byte.

El tamaño máximo en PL/SQL es 32767 bytes y el minimo 1 byte.

CHARACTER es sinonimo de CHAR. Ver NCHAR.

VARCHAR2(n)

Page 41: Tareas Del DBA para un famoso gestor  de bases de datos relacional

Cadena de caracteres de longitud variable, tiene un tamaño máximo de n bytes.

Es obligatorio especificar el tamaño.

El tamaño máximo en BD es 4000 bytes y el mínimo 1 byte.

El tamaño máximo 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)

Número de p digitos de los cuales s son decimales.

No es obligatorio especificar el tamaño.

El tamaño de p va de 1 a 38 y el s desde -84 a 127.

El tamaño 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) 7456124

NUMBER(9,1) 7456123.9

NUMBER(*,1) 7456123.9

NUMBER(9,2) 7456123.89

NUMBER(6) [error]

NUMBER(7,-2) 7456100

NUMBER 7456123.89

FLOAT 7456123.89

FLOAT(12) 7456000.0

Page 42: Tareas Del DBA para un famoso gestor  de bases de datos relacional

DATE

Fecha válida.

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 versión más grande de VARCHAR2.

El tamaño máximo en BD es 2 Gigabytes.

CLOB

Cadena de caracteres de longitud variable. Es una versión más grande de VARCHAR2.

El tamaño máximo 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 versión más grande de RAW.

El tamaño máximo en BD es 4 Gigabytes.

BFILE

Puntero a un fichero en disco.

El tamaño máximo 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 fracción 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.

Page 43: Tareas Del DBA para un famoso gestor  de bases de datos relacional

INTERVAL YEAR (y) TO MONTH

Periodo de tiempo definido en años y meses donde y es el número de digitos del año. 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

máximo numero de digitos en el dia f es el máximo 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 función ROWID.

UROWID

Cadena hexadecimal que representa de forma única una fila ORDENADA en una tabla (pero no unica en cualquier tabla). Ver función ROWID.

RAW(n)

Objeto binario de longitud variable.

Es obligatorio especificar el tamaño.

El tamaño máximo en BD es 2000 bytes y el mínimo 1 byte.

El tamaño máximo en PL/SQL es 32767 bytes y el minimo 1 byte.

LONG RAW

Objeto binario de longitud variable.

El tamaño máximo en BD es 2 Gigabytes.

El tamaño máximo 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;

Page 44: Tareas Del DBA para un famoso gestor  de bases de datos relacional

Tambien se puede:

ALTER TABLE MODIFY COLUMN...

ALTER TABLE DROP COLUMN...

ALTER TABLE SET UNUSED COLUMN...

Storage clause

Configuración 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 65536

next 1048576

minextents 1

maxextents 2147483645

pctincrease 0

freelists 1

freelist groups 1

optimal 7k

buffer_pool default

)

Esta clausula aparece al final de la definición de los objetos de almacenamiento de la base de datos (tablas, indices, etc...).

Page 45: Tareas Del DBA para un famoso gestor  de bases de datos relacional

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 tamaño (en bytes) de la primera extensión.

next

Especifica el tamaño (en bytes) de la segunda extensión.

pctincrease

Especifica el % de incremento en el tamaño de las siguientes extensiones.

Especifica el incremento en el tamaño de las siguientes extensiones. El tamaño de

una nueva extension es el tamaño de la anterior multiplico por pctincrease. Debe ser 0 para reducir la fragmentación en los tablespaces.

minextents

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

maxextents

Especifica el numero máximo de extensiones que el objeto puede tener.

freelists

Especifica el numero de freelists. Este parámetro solo se puede usar con CREATE

TABLE or CREATE INDEX.

freelist groups

Especifica el numero de freelist groups. Este parámetro 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 parámetro 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.

Page 46: Tareas Del DBA para un famoso gestor  de bases de datos relacional

Data Manipulation Language

Aqui estan definidas las sentencias del lenguaje de manipulación de datos (Data

Manipulation Language o DML) de oracle, como SELECT, UPDATE, INSERT, DELETE, etc...

COMMIT

Guarda los cambios de la transacción en curso.

Libera los recursos bloqueados por cualquier actualización hecha con la transacción 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 más filas de una tabla, dependiendo de la condición 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 condición]

CUIDADO! Si no se pone condición de selección, 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;

Page 47: Tareas Del DBA para un famoso gestor  de bases de datos relacional

Sentencia INSERT

Añade filas a una tabla.

Para guardar los datos insertados hay que ejecutar COMMIT;

Para cancelar la insercción 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 cláusula VALUES tiene que coincidir

con el orden en que se definieron las columnas en la creación 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 asignarán 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 múltiples 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])

Page 48: Tareas Del DBA para un famoso gestor  de bases de datos relacional

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.

Page 49: Tareas Del DBA para un famoso gestor  de bases de datos relacional

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 transacción actual.

Aunque una fila este bloqueada (por otra transacción), 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

transacción.

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 transacción en curso.

Libera los recursos bloqueados por cualquier actualización hecha con la transacción 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;

Page 50: Tareas Del DBA para un famoso gestor  de bases de datos relacional

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

nada.

SAVEPOINT

Sirve para marca un punto de referencia en la transacción 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 modificación.

Sentencia SELECT

La selección 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 condición]

[GROUP BY columna1, columna2.... ]

[HAVING condición-selección-grupos ]

[ORDER BY columna1 [DESC], columna2 [DESC]... ]

Si ejecutamos:

SELECT * FROM T_PEDIDOS;

Nos da la salida:

COD_PEDIDO NOMBRE ESTADO

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

1 JUAN 0

Page 51: Tareas Del DBA para un famoso gestor  de bases de datos relacional

2 ANTONIO 1

3 PEPE 0

...

* / columna1, columna2,.... Si se escribe *, selecciona todas las columnas. Si se desea

seleccionar sólo 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, específicamente cuando se

utilizan funciones de columna y los resultados se desean obtener por grupos (SQL lanza un

sort para generar los grupos).

HAVING condición-selección-grupos

Se utiliza con la cláusula “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 omisión, ASC), o descendente, (DESC).

SENTENCIA SELECT (JOIN)

Consiste en la unión de campos de dos o más tablas. Dichas tablas tendrán por lo menos una

columna común 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.

Page 52: Tareas Del DBA para un famoso gestor  de bases de datos relacional

SELECT DISTINCT columna1, columna2,....

FROM nombre-tabla1, nombre-tabla2

[GROUP BY columna1, columna2....]

[HAVING condición-selección-grupos]

[ORDER BY columna1 [DESC], columna2 [DESC]...

SENTENCIA SELECT TOP N FILAS DE UNA TABLA

En Oracle8i podemos usar la sintaxis siguiente, con una cláusula ORDER BY, para elegir filas

con los valores máximos o mínimos de un campo:

SELECT *

FROM (SELECT * FROM my_table ORDER BY col_name_1 DESC)

WHERE ROWNUM < 10;

FUNCIONES SOBRE COLUMNAS

COUNT. Indica el número de filas que cumplen una determinada condición, o el número 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 mínimo de una columna.

MIN(columna)

MAX. Entrega el valor máximo 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

Page 53: Tareas Del DBA para un famoso gestor  de bases de datos relacional

WHERE condición)

(Cuando en la condición se pone el operador =, la subselect deberá recuperar un

sólo 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]

CLÁUSULA UNION

Mezcla los resultados de dos o más consultas individuales en una única tabla resultado, eliminando las filas duplicadas, si existieran.

SELECT columna1, columna2,....

FROM nombre-tabla1,...

WHERE condición1

UNION [ALL]

SELECT columna1, columna2,...

FROM nombre-tabla2,...

WHERE condición2

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 más eficientemente (TUNNING).

Sentencia UPDATE

Actualiza valores de una o más columnas para un subconjunto de filas de una tabla.

Para guardar cambios hay que ejecutar COMMIT;

Para cancelar la modificación podemos hacer ROLLBACK;

Page 54: Tareas Del DBA para un famoso gestor  de bases de datos relacional

UPDATE nombre-tabla

SET columna1 = valor1 [, columna2 = valor2 ...]

[WHERE condición]

Actualiza los campos correspondientes junto con los valores que se le asignen, en el

subconjunto de filas que cumplan la condición de selección.

Si no se pone condición de selección, la actualización 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 condición

Cláusula opcional que se utiliza cuando se desea establecer una o varias condiciones para la sentencias SELECT, UPDATE y DELETE.

Las condiciones podrán tener:

- operadores aritméticos: =,<>,>,>=,<,<=

- 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

Page 55: Tareas Del DBA para un famoso gestor  de bases de datos relacional

IN

Permite obtener todas las filas que sean iguales a alguno de los valores descritos

por extensión.

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 símbolo “%” se utiliza como carácter de sustitución para indicar un número

indeterminado de caracteres. Depende de la base de datos en la que se esté

trabajando.

- El símbolo “_” se utiliza como carácter de sustitución para indicar un carácter en

una determinada posición. 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.

También se puede negar con la partícula 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

partícula NOT delante de los operadores especiales: IN, LIKE, BETWEEN.

Una sentencia SELECT, UPDATE y DELETE puede tener una o más condiciones

unidas por un operador booleano AND o OR.

Page 56: Tareas Del DBA para un famoso gestor  de bases de datos relacional

Lenguaje de programación de Oracle PL-SQL

En esta sección se hace un repaso de las estructuras de programación 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 condición de la variable del host.

CALL place_order(453);

CASE

Sentencia condicional multiple

case

WHEN condition THEN

WHEN condition THEN

ELSE

Page 57: Tareas Del DBA para un famoso gestor  de bases de datos relacional

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 recuperación 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

Page 58: Tareas Del DBA para un famoso gestor  de bases de datos relacional

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 descripción de una tabla, sinonimo, paquete o función. 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

Page 59: Tareas Del DBA para un famoso gestor  de bases de datos relacional

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

definido con:

SET LINESIZE 80

SET DESCRIBE DEPTH 2

SET DESCRIBE INDENT ON

SET DESCRIBE LINE OFF

Para mostrar esta configuración, 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,

Page 60: Tareas Del DBA para un famoso gestor  de bases de datos relacional

comm,

deptno,

EXCEPTION

Sección de excepciones en le código 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 ORA-00001

TIMEOUT_ON_RESOURCE ORA-00051

TRANSACTION_BACKED_OUT ORA-00061

INVALID_CURSOR ORA-01001

NOT_LOGGED_ON ORA-01012

LOGIN_DENIED ORA-01017

NO_DATA_FOUND ORA-01403

TOO_MANY_ROWS ORA-01422

ZERO_DIVIDE ORA-01476

INVALID_NUMBER ORA-01722

STORAGE_ERROR ORA-06500

PROGRAM_ERROR ORA-06501

VALUE_ERROR ORA-06502

CURSOR_ALREADY_OPEN ORA-06511

EXEC[UTE]

Page 61: Tareas Del DBA para un famoso gestor  de bases de datos relacional

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 continuación 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 parámetros a las sentencias. bind_arg: son variables o expresiones que contienen los parámetros 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

según su posición.

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.

Page 62: Tareas Del DBA para un famoso gestor  de bases de datos relacional

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

podemos recoger una.

FUNCTION

Creación de función.

CREATE OR REPLACE FUNCTION f_name (params) RETURN returntype

IS

res returntype;

BEGIN

code...

RETURN res;

END;

Un ejemplo de función:

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;

Page 63: Tareas Del DBA para un famoso gestor  de bases de datos relacional

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

Page 64: Tareas Del DBA para un famoso gestor  de bases de datos relacional

EXIT WHEN ;

END LOOP;

LOOP

IF THEN

EXIT;

END IF;

END LOOP;

FOR IN 1 .. 10 LOOP

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;

Page 65: Tareas Del DBA para un famoso gestor  de bases de datos relacional

PROCEDURE

Creación 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

Configuración 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.

Page 66: Tareas Del DBA para un famoso gestor  de bases de datos relacional

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

Función que nos devuelve el codigo de error asociado a la última excepción lanzada por la

base de datos. Solo debe usarse en la sección de manejo de excepciones.

EXCEPTION

WHEN NO_DATA_FOUND THEN

code

WHEN OTHERS THEN

code

Por ejemplo:

DECLARE

dummy NUMBER;

BEGIN

Page 67: Tareas Del DBA para un famoso gestor  de bases de datos relacional

SELECT count(*) INTO dummy FROM dual;

EXCEPTION

WHEN OTHERS THEN

raise_application_error(-20001,'Se ha producido el error

- '||SQLCODE||' -ERROR- '||SQLERRM);

END;

SQLERRM

Función que nos devuelve el mensaje de error asociado a la última excepción lanzada por la

base de datos. Solo debe usarse en la sección 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 instalación de oracle como en la instalación de sql*net.

Como usar SQLPLUS

Se usa desde la linea de comandos. Las opciones disponibles son:

c:\> sqlplus /nolog

Ejecutar un script:

Page 68: Tareas Del DBA para un famoso gestor  de bases de datos relacional

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 código PL/SQL.

SQL> begin

SQL> dbms_output.put_line('prueba');

SQL> end;

SQL> /

Funciones de Cadena de Oracle

En esta sección se hace un repaso de las funciones de cadena (string functions)

más 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.

Page 69: Tareas Del DBA para un famoso gestor  de bases de datos relacional

Si ejecutamos:

SELECT ASCII('V') FROM DUAL;

Devuelve

86

Funcion CHR

Esta función devuelve el caracter ASCII correspondiente al código que le pasamos de parámetro.

Es la funcion contraria a ASCII.

Si ejecutamos:

SELECT CHR(86) FROM DUAL;

Devuelve

V

Funcion CONCAT

Esta función devuelve una cadena unión de las que le pasamos como parámetro.

Es equivalente a char1||char2.

Si ejecutamos:

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

Devuelve

PEPE PEREZ

Operador ||

Este operador devuelve una cadena unión 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

Page 70: Tareas Del DBA para un famoso gestor  de bases de datos relacional

Convierte conjuntos de caracteres.

CONVERT(char_to_convert, new_char_set, old_char_set)

Si ejecutamos:

SELECT CONVERT('ESPAÑA', '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 alfanuméricos.

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

3

Page 71: Tareas Del DBA para un famoso gestor  de bases de datos relacional

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 ') FROM DUAL;

Devuelve

15

Funcion LOWER

Devuelve la cadena en minúsculas.

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;

Page 72: Tareas Del DBA para un famoso gestor  de bases de datos relacional

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(' PEPE PEREZ') FROM DUAL;

Devuelve

PEPE PEREZ

Funcion REPLACE

Devuelve la cadena char cambiando cada aparición 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

Page 73: Tareas Del DBA para un famoso gestor  de bases de datos relacional

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 ')||' '||RTRIM('PEREZ ') FROM DUAL;

Devuelve

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

Page 74: Tareas Del DBA para un famoso gestor  de bases de datos relacional

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 función 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(' PEPE PEREZ ') FROM DUAL;

Devuelve

PEPE PEREZ

Page 75: Tareas Del DBA para un famoso gestor  de bases de datos relacional

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 representación interna de una cadena.

LENGTH(char)

Si ejecutamos:

SELECT LENGTH('PEPE PEREZ') FROM DUAL;

Devuelve

10

Si ejecutamos:

SELECT LENGTH('PEPE PEREZ ') FROM DUAL;

Devuelve

15

Funciones de agrupación (grupo)

En esta sección se hace un repaso de las funciones de agrupación (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

Page 76: Tareas Del DBA para un famoso gestor  de bases de datos relacional

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

Page 77: Tareas Del DBA para un famoso gestor  de bases de datos relacional

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.

1

Funcion STDDEV

Determina la desviación estandar del valor de una columna.

STDDEV([DISTINCT | ALL] n)

Si ejecutamos:

SELECT STDDEV(Columna) FROM T_PEDIDOS;

Devuelve desviación 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 sección se hace un repaso de las funciones de fecha (date functions) mas utilizadas y algunos ejemplos.

Estan descritas funciones como ADD_MONTHS, MONTHS_BETWEEN...

Función ADD_MONTHS

Page 78: Tareas Del DBA para un famoso gestor  de bases de datos relacional

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

Función CURRENT_DATE

Devuelve la fecha actual de la sesión actual.

CURRENT_DATE

Si ejecutamos:

SELECT CURRENT_DATE FROM DUAL;

Devuelve:

31/10/2007 12:29:47

Función CURRENT_TIMESTAMP

Devuelve la fecha y hora actual de la sesión actual.

CURRENT_TIMESTAMP

Si ejecutamos:

SELECT CURRENT_TIMESTAMP FROM DUAL;

Devuelve:

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

Función LAST_DAY

Devuelve la fecha del último día 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:

Page 79: Tareas Del DBA para un famoso gestor  de bases de datos relacional

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

Función NEXT_DAY

Devuelve la fecha más cercana posterior a D cuyo dia de la semana es WD. WD puede ser LUNES, MARTES, MIÉRCOLES, JUEVES, VIERNES, SÁBADO, DOMINGO.

NEXT_DAY(d,wd)

Si ejecutamos:

SELECT NEXT_DAY(TO_DATE('31/10/2007','DD/MM/YYYY'),'sábado') 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 año. 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

Page 80: Tareas Del DBA para un famoso gestor  de bases de datos relacional

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 año. 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 numéricas

En esta sección se hace un repaso de las funciones numéricas más utilizadas y

algunos ejemplos.

Estan descritas funciones como GREATEST, FLOOR, CEIL...

Función ABS

Valor absoluto de un numero.

ABS(n)

Si ejecutamos:

SELECT ABS(-89) FROM DUAL;

Devuelve:

89

Page 81: Tareas Del DBA para un famoso gestor  de bases de datos relacional

Función 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

Función 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

Función FLOOR

Redondea n al valor inferior.

FLOOR(n)

Page 82: Tareas Del DBA para un famoso gestor  de bases de datos relacional

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

Función 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

Función 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:

1

Función MOD

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

Page 83: Tareas Del DBA para un famoso gestor  de bases de datos relacional

MOD(m,n)

Si ejecutamos:

SELECT MOD(13,5) FROM DUAL;

Devuelve:

3

Función REMAINDER

Devuelve el resto de dividir m por n. Se calcula de la siguiente forma: m - (n * X) donde X es el entero más 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:

3

Función ROUND

Redondea N hasta la posición 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:

Page 84: Tareas Del DBA para un famoso gestor  de bases de datos relacional

45.12

Si ejecutamos:

SELECT ROUND(45.8242) FROM DUAL;

Devuelve:

46

Si ejecutamos:

SELECT ROUND(-45.8242) FROM DUAL;

Devuelve:

-46

Función 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

Función TRUNC

Trunca N hasta la posición 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

Page 85: Tareas Del DBA para un famoso gestor  de bases de datos relacional

Si ejecutamos:

SELECT TRUNC(-45.8242) FROM DUAL;

Devuelve:

-45

Si ejecutamos:

SELECT TRUNC(45.1242,-1) FROM DUAL;

Devuelve:

40

Funciones de conversión

En esta sección se hace un repaso de las funciones de conversión (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...

Función 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

...

Función DECODE

Page 86: Tareas Del DBA para un famoso gestor  de bases de datos relacional

Traduce una expresión a un valor de retorno. Si expr es igual a value1, la función

devuelve Return1. Si expr es igual a value2, la función 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

...

Función NULLIF

Esta función 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

Función 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:

Page 87: Tareas Del DBA para un famoso gestor  de bases de datos relacional

SELECT NVL(ESTADO,0) FROM T_PEDIDOS;

Devuelve:

1

2

0

1

...

Función 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 número con el formato especificado.

TO_CHAR(date1 [,fmt]);

TO_CHAR(number1 [,fmt])

Si ejecutamos:

SELECT TO_CHAR(sysdate) FROM DUAL;

Devuelve:

15-JUN-01

Page 88: Tareas Del DBA para un famoso gestor  de bases de datos relacional

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 año:

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

Page 89: Tareas Del DBA para un famoso gestor  de bases de datos relacional

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 sección se hace un repaso de las pseudocolumnas y funciones del sistema más utilizadas y algunos ejemplos.

Estan descritas funciones como ROWNUM, ROWID...

Tabla DUAL

Es una tabla, creada durante la instalación, 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

--------

Page 90: Tareas Del DBA para un famoso gestor  de bases de datos relacional

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 parámetros de session

La tabla NLS_SESSION_PARAMETERS nos da los parametros de idioma de la sesión actual.

Si ejecutamos:

SELECT PARAMETER,VALUE FROM NLS_SESSION_PARAMETERS;

Devuelve:

PARAMETER VALUE

NLS_LANGUAGE AMERICAN

NLS_TERRITORY AMERICA

NLS_CURRENCY $

NLS_ISO_CURRENCY AMERICA

NLS_NUMERIC_CHARACTERS ,.

NLS_CALENDAR GREGORIAN

NLS_DATE_FORMAT DD-MON-YY

NLS_DATE_LANGUAGE AMERICAN

NLS_SORT BINARY

NLS_TIME_FORMAT HH.MI.SSXFF AM

NLS_TIMESTAMP_FORMAT DD-MON-RR HH.MI.SSXFF AM

NLS_TIME_TZ_FORMAT HH.MI.SSXFF AM TZR

NLS_TIMESTAMP_TZ_FORMAT DD-MON-RR HH.MI.SSXFF AM TZR

NLS_DUAL_CURRENCY $

NLS_COMP BINARY

NLS_LENGTH_SEMANTICS CHAR

NLS_NCHAR_CONV_EXCP FALSE

Función Rowid

Rowid es una pseudocolumna que identifica de manera única una fila en una tabla, pero NO en cualquier tabla.

Si ejecutamos:

Page 91: Tareas Del DBA para un famoso gestor  de bases de datos relacional

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

Page 92: Tareas Del DBA para un famoso gestor  de bases de datos relacional

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 información de la sesión actual del usuario.

SYS_CONTEXT(namespace,param,[length])

Valores de parámetro:

ACTION Devuelve la posición en el módulo

AUDITED_CURSORID Devuelve el ID del cursor que ha lanzado

la auditoría

AUTHENTICATED_IDENTITY Devuelve la identidad usada en

la autentificación

AUTHENTICATION_DATA Datos de autentificación

AUTHENTICATION_METHOD Devuelve el método de autentificación

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 sesión se ha establecido desde un

proceso background de oracle, este parámetro devuelve el Job ID. En

otro caso devuelve NULL.

CLIENT_IDENTIFIER Devuelve el identificador de cliente

(global context)

CLIENT_INFO Devuelve la información cargada mediante

el paquete DBMS_APPLICATION_INFO

CURRENT_BIND Bind variables para auditoría

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 auditoría

CURRENT_SQL_LENGTH Devuelve la longitud de la SQL que ha

lanzado el evento de auditoría

CURRENT_USER Nombre del usuario actual

CURRENT_USERID Identificador del usuario actual

DB_DOMAIN Dominio de la base de datos del

parámetro de inicialización DB_DOMAIN

Page 93: Tareas Del DBA para un famoso gestor  de bases de datos relacional

DB_NAME Nombre de la base de datos del parámetro

de inicialización DB_NAME

DB_UNIQUE_NAME Nombre de la base de datos del parámetro

de inicialización DB_UNIQUE_NAME

ENTRYID Identificador del la entrada de

auditoría disponible

ENTERPRISE_IDENTITY Identidad de la empresa

EXTERNAL_NAME Nombre externo del usuario de la base de

datos

FG_JOB_ID Si la sesión se ha establecido desde un

proceso foreground de oracle, este parámetro devuelve el Job ID. En

otro caso devuelve NULL.

GLOBAL_CONTEXT_MEMORY El número 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 demás

entradas.

HOST Nombre de la máquina 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 Dirección IP de la máquina 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 sesión. El formato es el siguiente:

language_territory.characterset

MODULE Devuelve el nombre de aplicación

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 sesión actual.

NLS_DATE_FORMAT Formato de fecha de la sesión actual.

NLS_DATE_LANGUAGE Lenguaje usado para la fechas.

NLS_SORT Lenguaje de ordenación.

NLS_TERRITORY Territorio de la sesión actual.

OS_USER Usuario del sistema operativo.

POLICY_INVOKER Invocador de la política 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 sesión.

SESSION_USER Nombre del usuario de la base de datos

con el que esta contectada la sesión.

SESSION_USERID Identificador del usuario de la base de

datos con el que esta contectada la sesión.

SESSIONID Identificador de la sesión

SID Número de sesión

Page 94: Tareas Del DBA para un famoso gestor  de bases de datos relacional

STATEMENTID El identificador de auditoría de

sentencia

TERMINAL Nombre del terminal

Por ejemplo:

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

devuelve: mydatabase

Funcion USER

Devuelve el identificador de usuario de la sesión actual.

select USER from dual;

Funcion USERENV

Devuelve información de la sesión actual del usuario.

USERENV(param)

Valores de parámetro:

CLIENT_INFO Devuelve la información cargada mediante el paquete

DBMS_APPLICATION_INFO

ENTRYID Identificador de entrada

INSTANCE 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

sesión. El formato es el siguiente: language_territory.characterset

SESSIONID Identificador de la sesión

TERMINAL Nombre del terminal

Por ejemplo:

select USERENV('LANGUAGE') from dual;

devuelve: SPANISH_SPAIN.WE8ISO8859P1