Introducción A SQL Oracle
Introducción A SQL Oracle
Introducción A SQL Oracle
El Lenguaje de consulta estructurado (En ingls] Structured QueryLanguage) es un lenguaje declarativo de acceso a bases de datos relacionales que permite especificar diversos tipos de operaciones sobre las mismas. Una de sus caractersticas es el manejo del lgebra y el clculo relacional permitiendo lanzar consultas con el fin de recuperar -de una forma sencilla- informacin de inters de una base de datos, as como tambin hacer cambios sobre la misma. El SQL es un lenguaje de acceso a bases de datos que explota la flexibilidad y potencia de los sistemas relacionales permitiendo gran variedad de operaciones sobre los mismos.
SqlPlus
Para poder escribir sentencias SQL al servidor Oracle, ste incorpora la herramienta SQL*Plus. Toda instruccin SQL que el usuario escribe, es verificada por este programa. Si la instruccin es vlida es enviada a Oracle, el cual enviar de regreso la respuesta a la instruccin; respuesta que puede ser transformada por el programa SQL*Plus paramodificar su salida. Para que el programa SQL*Plus funcione en el cliente, el ordenador cliente debe haber sido configurado para poder acceder al servidor Oracle. En cualquier caso al acceder a Oracle con este programa siempre preguntar por el nombre de usuario y contrasea. Estos son datos que tienen que nos tiene que proporcionar el administrador (DBA) de la base de datos Oracle. Para conectar mediante SQL*Plus podemos ir a la lnea de comandos y escribir el texto sqlplus. A continuacin aparecer la pantalla:
En esa pantalla se nos pregunta el nombre de usuario y contrasea para acceder a la base de datos (informacin que deber indicarnos el administrador o DBA). Tras indicar esa informacin conectaremos con Oracle mediante SQL*Plus, y veremos aparecer el smbolo: SQL> Tras el cual podremos comenzar a escribir nuestros comandos SQL. Ese smbolo puede cambiar por un smbolo con nmeros 1, 2, 3, etc.; en ese caso se nos indica que la instruccin no ha terminado y la lnea en la que estamos. Otra posibilidad de conexin consiste en llamar al programa SQL*Plus indicando contrasea y base de datos a conectar. El formato es: slplus usuario/contrasea@nombreServicioBaseDeDatos Ejemplo: slplus usr1/[email protected] En este caso conectamos con SQL*Plus indicando que somos el usuario usr1 con contrasea miContra y que conectamos a la base de datos inicial de la red forempa.net. El nombre de la base de datos no tiene porque tener ese formato, habr que conocer como es el nombre que representa a la base de datos como servicio de red en la red en la que estamos.
Como en el caso anterior, se nos solicita el nombre de usuario y contrasea. La cadena de Host es el nombre completo de red que recibe la instancia de la base de datos a la que queremos acceder en la red en la que nos encontramos. Tambin podremos llamar a este entorno desde la lnea de comandos utilizando la sintaxis comentada anteriormente. En este caso: slplusw usuario/contrasea@nombreServicioBaseDeDatos Esta forma de llamar al programa permite entrar directamente sin que se nos pregunte por el nombre de usuario y contrasea.
iSQL*Plus
Es un producto ideado desde la versin 9i de Oracle. Permite acceder a las bases de datos Oracle desde un navegador. Para ello necesitamos tener configurado un servidor web Oracle que permita la conexin con la base de datos. Utilizar iSQL*Plus es indicar una direccin web en un navegador, esa direccin es la de la pgina iSQL*Plus de acceso a la base de datos. Desde la pgina de acceso se nos pedir nombre de usuario, contrasea y nombre de la base de datos con la que conectamos (el nombre de la base de datos es el nombre con el que se la conoce en la red). Si la conexin es vlida aparece esta pantalla:
TIPO
CARACTERSTICAS
OBSERVACIONES Entre 1 y 2000 bytes como mximo. Aunque se introduzca un valor ms corto que el indicado en el tamao, se rellenar al tamao indicado. Es de longitud fija, siempre ocupar lo mismo, independientemente del valor que contenga
CHAR
VARCHAR2
Entre 1 y 4000 bytes como mximo. El tamao Cadena de caracteres de del campo depender del valor que contenga, es longitud variable de longitud variable. Cadena de caracteres de En desuso, se utiliza VARCHAR2 en su lugar longitud variable Entre 1 y 2000 bytes como mximo. El juego de Cadena de caracteres de caracteres del tipo de datos (datatype) NCHAR longitud fija que slo slo puede ser AL16UTF16 UTF8. El juego almacena caracteres de caracteres se especifica cuando se crea la Unicode base de datos Oracle
VARCHAR
NCHAR
Entre 1 y 4000 bytes como mximo. El juego de Cadena de caracteres de caracteres del tipo de datos (datatype) NCHAR longitud variable que slo puede ser AL16UTF16 UTF8. El juego NVARCHAR2 slo almacena de caracteres se especifica cuando se crea la caracteres Unicode base de datos Oracle Como mximo admite hasta 2 GB (2000 MB). Los datos LONG debern ser convertidos apropiadamente al moverse entre diversos sistemas. Este tipo de datos est obsoleto (en desuso), en su lugar se utilizan los datos de tipo LOB (CLOB,NCLOB). Oracle recomienda que se Cadena de caracteres de convierta el tipo de datos LONG a alguno LOB si an se est utilizando. longitud variable No se puede utilizar en clasulas WHERE, GROUP BY, ORDER BY, CONNECT BY ni DISTINCT Una tabla slo puede contener una columna de tipo LONG. Slo soporta acceso secuencial.
LONG
LONG RAW
Almacenan cadenas binarias de ancho variable Almacenan cadenas binarias de ancho variable Permiten almacenar y manipular bloques grandes de datos no estructurados (tales como texto, imgenes, videos, sonidos, etc) en formato binario o del carcter Permite almacenar datos binarios no estructurados Almacena datos de tipo carcter Almacena datos de tipo carcter Almacena datos binarios no estructurados en archivos del sistema operativo, fuera de la base de datos. Una columna BFILE almacena un localizador del archivo a uno externo que contiene los datos
Hasta 2 GB. En desuso, se sustituye por los tipos LOB. Hasta 32767 bytes. En desuso, se sustituye por los tipos LOB. Admiten hasta 8 terabytes (8000 GB). Una tabla puede contener varias columnas de tipo LOB. Soportan acceso aleatorio. Las tablas con columnas de tipo LOB no pueden ser replicadas.
RAW
BLOB
CLOB
NCLOB
Admiten hasta 8 terabytes. El administrador de la base de datos debe asegurarse de que exista el archivo en disco y de que los procesos de Oracle tengan permisos de lectura para el archivo .
BFILE
ROWID
ROWID fsico almacena la direccin de fila en Almacenar la direccin las tablas, las tablas en clster, los ndices, nica de cada fila de la excepto en las ndices-organizados (IOT). tabla de la base de datos ROWID lgico almacena la direccin de fila en
6
tablas de ndice-organizado (IOT). Un ejemplo del valor de un campo ROWID podra ser: AAAIugAAJAAC4AhAAI. El formato es el siguiente: Para OOOOOOFFFBBBBBBRRR, donde: OOOOOO: segmento de la base de datos (AAAIug en el ejemplo). Todos los objetos que estn en el mismo esquema y en el mismo segmento tendrn el mismo valor. FFF: el nmero de fichero del tablespace relativo que contiene la fila (fichero AAJ en el ejemplo). BBBBBB: el bloque de datos que contiene a la fila (bloque AAC4Ah en el ejemplo). El nmero de bloque es relativo a su fichero de datos, no al tablespace. Por lo tanto, dos filas con nmeros de bloque iguales podran residir en diferentes datafiles del mismo tablespace. RRR: el nmero de fila en el bloque (fila AAI en el ejemplo). Este tipo de campo no aparece en los SELECT ni se puede modificar en los UPDATE, ni en los INSERT. Tampoco se puede utilizar en los CREATE. Es un tipo de datos utilizado exclusivamente por Oracle. Slo se puede ver su valor utilizando la palabra reservada ROWID, por ejemplo: select rowid, nombre, apellidos from clientes Ejemplo 2: SELECT ROWID, SUBSTR(ROWID,15,4) Fichero, SUBSTR(ROWID,1,8) Bloque, SUBSTR(ROWID,10,4) Fila FROM proveedores Ejemplo 3: una forma de saber en cuntos ficheros de datos est alojada una tabla: SELECT
7
COUNT(DISTINCT(SUBSTR(ROWID,7,3))) Numero ficheros FROM facturacion Admite ROWID a tablas que no sean de Oracle, tablas externas. Admite tanto ROWID lgicos como fsicos. Se admiten hasta 38 dgitos de precisin y son portables a cualquier entre los diversos sistemas en que funcione Oracle. Para declarar un tipo de datos NUMBER en un CREATE UPDATE es suficiente con: nombre_columna NUMBER opcionalmente se le puede indicar la precisin (nmero total de dgitos) y la escala (nmero de dgitos a la derecha de la coma, decimales, los coger de la precisin indicada): NUMBER Almacena nmeros fijos y en punto flotante nombre_columna NUMBER (precision, escala) Si no se indica la precisin se tomar en funcin del nmero a guardar, si no se indica la escala se tomar escala cero. Para no indicar la precisin y s la escala podemos utilizar: nombre_columna NUMBER (*, escala) Para introducir nmeros que no estn el el formato estndar de Oracle se puede utilizar la funcin TO_NUMBER. Almacena tipos de datos Es un tipo NUMBER que slo almacena numricos en punto nmeros en punto flotante flotante El tipo de datos DATE almacena el ao (incluyendo el siglo), el mes, el da, las horas, Almacena un punto en los minutos y los segundos (despus de el tiempo (fecha y hora) medianoche). Oracle utiliza su propio formato interno para almacenar fechas.
8
UROWID
ROWID universal
FLOAT
DATE
Los tipos de datos DATE se almacenan en campos de longitud fija de siete octetos cada uno, correspondiendo al siglo, ao, mes, da, hora, minuto, y al segundo. Para entrada/salida de fechas, Oracle utiliza por defecto el formato DD-MMM-AA. Para cambiar este formato de fecha por defecto se utiliza el parmetro NLS_DATE_FORMAT. Para insertar fechas que no estn en el mismo formato de fecha estndar de Oracle, se puede utilizar la funcin TO_DATE con una mscara del formato: TO_DATE (el 13 de noviembre de 1992, DD del MES, YYYY) Almacena datos de tipo TIMESTAMP hora, fraccionando los segundos Almacena datos de tipo TIMESTAMP hora incluyendo la zona WITH TIME horaria (explcita), fraccionando los ZONE segundos Almacena datos de tipo TIMESTAMP hora incluyendo la zona Cuando se usa un SELECT para mostrar los WITH LOCAL horaria local (relativa), datos de este tipo, el valor de la hora ser ajustado a la zona horaria de la sesin actual TIME ZONE franccionando los segundos Tipo de datos abstracto. Se asocia a un esquema XML para la definicin En realidad se trata de de su estructura. un CLOB. Almacena valores lgicos bolanos , verdadero o falso Vlido en PLSQL, este tipo de datos no existe en Oracle 8i/9i.
XMLType
BOOLEAN
De los tipos anteriores, los comunmente utilizados son: VARCHAR2(cadenas de texto no muy grandes), DATE (fechas, horas), NUMBER(nmeros), BLOB (ficheros de tipo word, excel, access, video, sonido, imgenes, etc) y CLOB (cadenas de texto muy grandes). Create
10
) ; 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 using index tablespace users , fecpedido date, numclient references T_CLIENTES )
Nested tables
11
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 ( 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;
Create Index Los indices se usan para mejorar el rendimiento de las operaciones sobre una tabla. En general mejoran el rendimiento las SELECT y empeoran (minimamente) el rendimiento de los INSERT y los DELETE. Una vez creados no es necesario nada ms, oracle los usa cuando es posible (ver EXPLAIN PLAN). En oracle existen tres tipos de indices:
1.
Table Index:
CREATE [UNIQUE|BITMAP] INDEX [esquema.]index_name ON [esquema.]table_name [tbl_alias] (col [ASC | DESC]) index_clause index_attribs
2.
12
Cluster Index:
CREATE [UNIQUE|BITMAP] INDEX [esquema.]index_name ON CLUSTER [esquema.]cluster_name index_attribs
13
GLOBAL PARTITION BY RANGE (col_list) ( PARTITION partition VALUES LESS THAN (value_list) [LOGGING|NOLOGGING] [TABLESPACE {tablespace|DEFAULT}] [PCTFREE int] [PCTUSED int] [INITRANS int] [MAXTRANS int] [STORAGE storage_clause] ) INDEXTYPE IS indextype [PARALLEL int|NOPARALLEL] [PARAMETERS ('ODCI_Params')] {Esto es solo para table index, no para bitmap join Index} Y adems index_attribs puede ser cualquier combinacin de los siguientes: NOSORT|SORT REVERSE COMPRESS int NOCOMPRESS COMPUTE STATISTICS [NO]LOGGING ONLINE TABLESPACE {tablespace|DEFAULT} PCTFREE int PCTUSED int INITRANS int MAXTRANS int STORAGE storage_clause PARALLEL parallel_clause Si usamos la opcion PARALLEL esta debe estar al final.
14
create index es una de las pocas sentencias que pueden usar nologging option. create index requiere un segmento temporal si no hay espacio en memoria suficiente. Crear indices basados en funciones require que query_rewrite_enabled este a true y query_rewrite_integrity este a trusted.
Storage clause Configuracin del almacenamiento de tablas (CREATE TABLE), indices (CREATE INDEX), etc en oracle. STORAGE opciones Opciones:
INITIAL int K | M NEXT int K | M MINEXTENTS int MAXEXTENTS int MAXEXTENTS UNLIMITED PCTINCREASE int FREELISTS int FREELIST GROUPS int OPTIMAL OPTIMAL int K | M OPTIMAL NULL BUFFER POOL {KEEP|RECYCLE|DEFAULT} storage ( initial 65536 next 1048576
15
minextents 1 maxextents 2147483645 pctincrease 0 freelists 1 freelist groups 1 optimal 7k buffer_pool default )
Esta clausula aparece al final de la definicin de los objetos de almacenamiento de la base de datos (tablas, indices, etc). Cuando creamos un tablespace (CREATE TABLESPACE) podemos definir un storage por defecto para los objetos que se creen dentro de el. However, a default storage clause can not be specified for locally managed tablespaces. Dictionary managed tablespaces allow to have a storage clause, but without freelists, freelist groups and buffer_pool. Initial: Especifica el tamao (en bytes) de la primera extensin. Next: Especifica el tamao (en bytes) de la segunda extensin. Pctincrease: Especifica el % de incremento en el tamao de las siguientes extensiones. Especifica el incremento en el tamao de las siguientes extensiones. El tamao de una nueva extension es el tamao de la anterior multiplico por pctincrease. Debe ser 0 para reducir la fragmentacin en los tablespaces. Minextents: Especifica el numero inicial de extensiones cuando se crea el objeto. Maxextents: Especifica el nmero mximo de extensiones que el objeto puede tener. Freelists: Especifica el nmero de freelists. Este parmetro solo se puede usar con CREATE TABLE or CREATE INDEX. Freelist groups: Especifica el numero de freelist groups. Este parmetro solo se puede usar con CREATE TABLE or CREATE INDEX. Buffer_pool: El valor de buffer_pool debe ser uno de: keep, recycle, default. Este parmetro solo se puede usar con CREATE TABLE, CREATE INDEX, CREATE CLUSTER, ALTER TABLE, ALTER INDEX Y ALTER CLUSTER.
16
Optimal: Solo se puede especificar para los rollback segments. Create Sequence Crea un objeto capaz de darnos numeros consecutivos unicos.
CREATE SEQUENCE secuencia INCREMENT BY n START WITH n {MAX VALUE n | NOMAXVALUE} {MIN VALUE N | NOMINVALUE} {CYCLE | NOCYCLE} {CACHE N | NOCACHE} {ORDER | NOORDER};
En realida es un generador de indentificadores unicos que no bloquea transacciones. Es muy util para generar primary keys. Si no nos gusta perder nmeros usamos NOCACHE.
CREATE SEQUENCE S_PROVEEDORES MINVALUE 1 START WITH 1 INCREMENT BY 1 NOCACHE;
Create View Esta sentencia sirve para crear una vista de una tabla o tablas. Una vista es una tabla lgica basada en los datos de otra tabla. Ejemplo:
17
CREATE VIEW V_PEDIDOS (NUMPEDIDO, FECPEDIDO, NUNCLIENTE, NOMCLIENTE) FROM SELECT A.NUMPEDIDO,A.FECPEDIDO,A.NUMCLIENTE, B.NOMCLIENTE FROM T_PEDIDOS A, T_CLIENTE B WHERE A.NUMCLIENTE=B.NUMCLIENTE;
Esta vista sacar lo datos de los pedidos con el nombre de cliente. Al ser lgica no necesita espacio de almacenamiento para los datos. Ademas es instantanea, una vez modificados los datos de las tablas origen, los tenemos disponibles en la vista. Create 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};
Por ejemplo;
CREATE GLOBAL TEMPORARY TABLE tabla_temp ( columna number ) ON COMMIT DELETE ROWS ; CREATE GLOBAL TEMPORARY TABLE tabla_temp2 ( columna number ) ON COMMIT PRESERVE ROWS ;
Con la opcion ON COMMIT DELETE ROWS se borran los datos cada vez que se hace COMMIT en la sesion. Con la opcion ON PRESERVE DELETE ROWS los datos no se borran hasta el final de la sesion. Create materialized view
18
El SQL de las bases de datos Oracle permite crear vistas materializadas o materialized views. Estas vistas materializadas, a parte de almacenar la definicin de la vista propiamente dicha, tambin almacenan los registros que resultan de la ejecucin de la sentencia SELECT que define la vista. Como las vistas normales, la sentencia SELECT es la base de la vista, pero la sentencia SQL se ejecuta cuando se crea la vista y los resultados se almacenan fsicamente constituyendo una tabla real que ocupa sitio en el disco duro. Esta tabla puede definirse utilizando los mismos parmetros de almacenamiento que se pueden utilizar para una tabla normal (tablespace, etctera). Las vistas materializadas tambin admiten ndices, esta funcionalidad resulta muy til a la hora de mejorar el rendimiento de las sentencias PLSQL o SQL que utilicen vistas materializadas.
Cuando una sentencia SQL o PL/SQL accede a una vista materializada el servidor de la base de datos Oracle, transforma la sentencia dirigindose directamente a los datos de la vista que estn ya almacenados, en lugar de utilizar los datos de las diferentes tablas utilizadas en la definicin de dicha vista. Evidentemente, si una vista (view) utiliza muchas tablas base enlazadas de forma compleja, y dicha vista va a ser utilizada frecuentemente, ser muy conveniente definirla como una vista materializada o materialized view. Esto contribuir enormemente a mejorar el rendimiento de la base de datos, ya que la sentencia SQL base de la vista slo se ejecutar una vez. Por otro lado, est el inconveniente de que si la vista materializada o materialized view va a tener que reutilizarse en el futuro, entonces necesitaremos un mecanismo para actualizar o refrescar dicha vista materializada, ya que las tablas base de la vista pueden haber sufrido modificaciones desde la creacin de la misma. Por todo esto, a la hora de determinar si una vista debe definirse como vista o es mejor definirla como vista materializada, debemos valorar los costes de tener que ejecutar la sentencia SQL base de una vista normal siempre que se acceda a dicha vista, frente a los costes de almacenamiento y actualizacin de una vista materializada. Sintaxis del comando SQL utilizado para crear vistas materializadas
CREATE MATERIALIZED VIEW nombre_vistam [TABLESPACE nombre_ts] [PARALELL (DEGREE n)] [BUILD {INMEDIATE|DEFERRED}] [REFRESH {FAST|COMPLETE|FORCE|NEVER|ON COMMIT}] [{ENABLE|DISABLE} QUERY REWRITE] AS SELECT FROM WHERE
19
Como anticipo dir que un refresco completo o COMPLETE, significa que la tabla asociada con la vista materializada se borra completamente, volvindose a insertar todos los registros devueltos por la ejecucin de la sentencia SQL base de la vista, y que un refresco rpido o FAST, significa que la vista materializada se actualiza slo segn hayan sido los cambios realizados sobre las tablas base de la vista desde el ltimo refresco. Para poder utilizar el refresco rpido o FAST, hay que crear previamente los logs de la vista materializada utilizando el comando CREATE MATERIALIZED VIEW LOG. La opcin ENABLE/DISABLE QUERY REWRITE determina si el optimizador Oracle puede o no reescribir las sentencias SQL de manera que, de ser posible, en la fase de ejecucin se utilice la vista materializada en lugar de las tablas base de la vista incluidas en la sentencia SQL original. Este es un tema ciertamente complejo y que ser objeto de un artculo completo en este blog. Como anticipo indicar que la reescritura de sentencias SQL slo est disponible cuando se utiliza el optimizador Oracle basado en costes.
Con la opcin PUBLIC se crea un sinonimo pblico accesible a todos los usuarios, siempre que tengan los privilegios adecuados para el mismo. (ver GRANT) Sirve para no tener que usar la notacin esquema.objeto para referirse a un objeto que no es propiedad de usuario.
CREATE PUBLIC SYNONYM T_PEDIDOS FOR PROGRAMADOR.T_PEDIDOS;
No es necesario recompilarlos cuando se redefinen las tablas, de hecho puedes existir sin que exista el objeto al que refererencian. El acceso es un poco mas eficiente cuando se accede por sinonimos pblicos. Cuando en una sentencia no citamos el nombre del esquema, Oracle resuelve los nombres en el siguiente orden: usuario actual private synonym public synonym Tambien podemos usarlo para cambiar el objeto que usamos sin tener que cambiar la programacion. Asi cambiamos la tabla:
CREATE PUBLIC SYNONYM T_PEDIDOS FOR PROGRAMADOR.T_PEDIDOS_PRUEBA;
Create User
20
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}
Alterar un usuario
ALTER USER NOMBRE_USUARIO IDENTIFIED BY CLAVE _ACCESO [DEFAULT TABLESPACE ESPACIO_TABLA] [TEMPORARY TABLESPACE ESPACIO_TABLA] [QUOTA {ENTERO {K | M } | UNLIMITED } ON ESPACIO_TABLA [PROFILE PERFIL];
Crea un usuario con todos los derechos para guardar datos o crear objetos:
DROP USER miusuario CASCADE;
21
CREATE USER miusuario IDENTIFIED BY miclavesecreta DEFAULT TABLESPACE data TEMPORARY TABLESPACE temp QUOTA UNLIMITED ON data; CREATE ROLE programador; GRANT CREATE session, CREATE table, CREATE view, CREATE procedure,CREATE synonym, ALTER table, ALTER view, ALTER procedure,ALTER synonym, DROP table, DROP view, DROP procedure,DROP synonym, TO conn; GRANT programador TO miusuario;
Es neceario crear el usuario antes de asignar permisos con GRANT o un ROLE por defecto. Create Role Esta sentencia sirve para crear un rol de usuario. Un rol es una forma de agrupar permisos (o privilegios) para asignarlos luego a los usuarios. Cada usuario puede tener varios roles. Ejemplo de creacin de un rol:
CREATE ROLE MI_PROPIO_ROLE
22
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 profile Esta sentencia sirve para crear un perfil de usuario. Un perfil de usuario es una forma de limitar los recursos que puede utilizar un usuario. Cada usuario puede tener un nico perfil. Antes de asignar un perfil a un usuario es necesario que este perfil exista en la base de datos. Un perfil se asigna en la creacin de un usuario CREATE USER o modificandolo ALTER USER. Un ejemplo de script sera:
CREATE PROFILE app_user LIMIT SESSIONS_PER_USER 2 CPU_PER_SESSION 10000 decimas de segundo
23
CPU_PER_CALL 1 decimas de segundo CONNECT_TIME UNLIMITED minutos 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, duracin de sesion, Y tambien limites de uso de las claves de acceso (passwords): duracin, intentos de acceso, reuso, Por ejemplo:
ALTER PROFILE default LIMIT IDLE_TIME 20;
Limita el perfil por defecto a 20 minutos. IDLE_TIME: Es el tiempo que puede estar una sesin sin hacer nada antes de ser cerrada. Drop Utilice Dop para mover objetos a la papelera de reciclaje de Oracle: Ejemplos:
Borrar una tabla:
[PURGE];
Borrar un ndice:
DROP INDEX [schema.]index [FORCE]
FORCE se puede utilizar para borrar ndices que estas siendo utilizados Borrar una vista materializada:
DROP MATERIALIZED VIEW [schema.]materialized_view
Borrar un paquete:
DROP PACKAGE [BODY] [schema.]package_name;
Borrar un procedimiento:
DROP PROCEDURE [schema.]procedure_name
Borrar un perfil:
DROP PROFILE profile_name [CASCADE]
Si un usuario esta asociado a un profile, est no puede ser borrado, utilice CASCADE para desasignar antes los profiles de los usuarios. Borrar un rol:
DROP ROLE role
Borrar un segmento:
DROP ROLLBACK SEGMENT rbs_name
Borrar un sinonimo:
DROP [PUBLIC] SYNONYM [schema.]synonym [FORCE]
25
[CASCADE CONSTRAINTS]];
Borrar un disparador:
DROP TRIGGER [schema.]trigger
Borrar un usuario:
DROP USER username [CASCADE]
Alter table Sirve para cambiar la definicin de una tabla. Podemos cambiar tanto columnas como restricciones (ver CONSTRAINTS). La sintaxis es:
ALTER TABLE [esquema.]tabla {ADD|MODIFY|DROP}
Tipos de Constraints
26
Clave primaria La clave primaria se utiliza para identificar en forma nica cada lnea en la tabla. Puede ser parte de un registro real, o puede ser un campo artificial (uno que no tiene nada que ver con el registro real). Una clave primaria puede consistir en uno o ms campos en una tabla. Cuando se utilizan mltiples campos como clave primaria, se los denomina claves compuestas. Las claves primarias pueden especificarse cuando se crea la tabla (utilizando CREATE TABLE) o cambiando la estructura existente de la tabla (utilizando ALTER TABLE). Ejemplo para la especificacin de una clave primaria cuando se crea una tabla:
CREATE TABLE CLIENTES (SID integer PRIMARY KEY, Last_Name varchar(30), First_Name varchar(30));
A continuacin se presentan ejemplos para la especificacin de una clave primaria al modificar una tabla:
LTER TABLE CLIENTES ADD PRIMARY KEY (SID);
Clave externa Una clave externa es un campo (o campos) que seala la clave primaria de otra tabla. El propsito de la clave externa es asegurar la integridad referencial de los datos. En otras palabras, slo se permiten los valores que se esperan que aparezcan en la base de datos. Por ejemplo, digamos que tenemos dos tablas, una tabla CLIENTES que incluyen todos los datos del CLIENTES, y la tabla RDENES que incluye los pedidos de CLIENTES. La restriccin aqu es que todos los pedidos deben asociarse con un CLIENTES que ya se encuentra en la tabla CUSTOMER. En este caso, colocaremos una clave externa en la tabla RDENES y la relacionaremos con la clave primaria de la tabla CLIENTES. De esta forma, nos aseguramos que todos los pedidos en la tabla RDENES estn relacionadas con un CLIENTES en la tabla CLIENTES. En otras palabras, la tabla RDENES no puede contener informacin de un CLIENTES que no se encuentre en la tabla CLIENTES. La estructura de estas dos tablas ser la siguiente: Tabla CLIENTES nombre de columna caracterstica
27
SID Last_Name First_Name Tabla RDENES nombre de columna Order_ID Order_Date Customer_SID Amount
Clave Primaria
Clave Externa
En el ejemplo anterior, la columna Customer_SID en la tabla ORDENES es una clave externa sealando la columna SID en la tabla CLIENTES. Ejemplo de cmo especificar la clave externa a la hora de crear la tabla RDENES:
CREATE TABLE ORDENES (Order_ID integer primary key, Order_Date date, Customer_SID integer references CLIENTES (SID), Amount double);
Ejemplo para la especificacin de una clave externa al modificar una tabla: Esto asume que se ha creado la tabla ORDERS, y que la clave externa todava no se ha ingresado:
ALTER TABLE ORDENES ADD (CONSTRAINT fk_orders1) FOREIGN KEY (customer_sid) REFERENCES CLIENTES (SID);
NOT NULL En forma predeterminada, una columna puede ser NULL. Si no desea permitir un valor NULL en una columna, querr colocar una restriccin en esta columna especificando que NULL no es ahora un valor permitido. Por ejemplo, en la siguiente instruccin,
CREATE TABLE clientes (SID integer NOT NULL,
28
Las columnas SID y Last_Name no incluyen NULL, mientras que First_Name puede incluir NULL. UNIQUE La restriccin UNIQUE asegura que todos los valores en una columna sean distintos. Por ejemplo, en la siguiente instruccin,
CREATE TABLE clientes (SID integer Unique, Last_Name varchar (30), First_Name varchar(30));
La columna SID no puede incluir valores duplicados, mientras dicha restriccin no se aplica para columnas Last_Name y First_Name. Por favor note que una columna que se especifica como clave primaria tambin puede ser nica. Al mismo tiempo, una columna que es nica puede o no ser clave primaria. CHECK La restriccin CHECK asegura que todos los valores en una columna cumplan ciertas condiciones. Por ejemplo, en la siguiente instruccin,
CREATE TABLE clientes (SID integer CHECK (SID > 0), Last_Name varchar (30), First_Name varchar(30));
La columna SID slo debe incluir enteros mayores a 0. Por favor note que la restriccin CHECKno sea ejecutada por MySQL en este momento. Modificar 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
29
Normalmente una restriccin de este tipo se implementa mediante un indice unico (ver CREATE INDEX). Borrar una restriccin:
ALTER TABLE T_PEDIDOS DROP CONSTRAINT CON1_PEDIDOS;
30
DROP PRIMARY KEY [CASCADE] [{KEEP|DROP} INDEX] 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
Truncate Quita todas las filas de una tabla sin registrar las eliminaciones individuales de filas. TRUNCATE TABLE es similar a la instruccin DELETE sin una clusula WHERE; no obstante, TRUNCATE TABLE es ms rpida y utiliza menos recursos de registros de transacciones y de sistema.
TRUNCATE TABLE [esquema.]tabla [{PRESERVE|PURGE} MATERIALIZED VIEW LOG] [{DROP | REUSE} STORAGE] TRUNCATE CLUSTER [esquema.]cluster [{DROP | REUSE} STORAGE]
La instruccin Truncate no necesita Commit La instruccin trncate libera el espacio utilizado por los datos de la tabla. Rename Cambia el nombre a una tabla, vista, secuencia o sinonimo privado.
31
Si ejecutamos:
SELECT * FROM T_PEDIDOS;
Nos da la salida:
COD_PEDIDO NOMBRE ESTADO 1 JUAN 0 2 ANTONIO 1 3 PEPE 0
* / columna1, columna2,. Si se escribe *, selecciona todas las columnas. Si se desea seleccionar slo algunas columnas de la tabla, se debe poner los nombres de cada una de ellas, separadas por una coma.
32
nombre-tabla Nombre de la(s) tabla(s) de la(s) cual(es) se van a seleccionar los valores. GROUP BY columna1, columna2. Se utiliza para agrupar resultados por una determinada columna, especficamente cuando se utilizan funciones de columna y los resultados se desean obtener por grupos (SQL lanza un sort para generar los grupos). HAVING condicin-seleccin-grupos Se utiliza con la clusula GROUP BY, cuando se quiere poner condiciones al resultado de un grupo. ORDER BY colum1 [DESC], colum2 [DESC...] Sirve para ordenar el resultado. Todas las columnas por las que se desee realizar el orden tienen que encontrarse en la sentencia Select de la consulta. El orden de las columnas puede ser ascendente, (por omisin, ASC), o descendente, (DESC). SENTENCIA SELECT (JOIN) Consiste en la unin de campos de dos o ms tablas. Dichas tablas tendrn por lo menos una columna comn que sirva de nexo del join.
SELECT columna1, columna2, FROM nombre-tabla1, nombre-tabla2
columna1, columna2, Para diferenciar las columnas con el mismo nombre se antepondr el nombre de la tabla a la que pertenecen, utilizando el punto como separador. Por ejemplo:
SELECT Tabla1.Columna2, Tabla2.Columna2, Columna3.. FROM Tabla1, Tabla2 WHERE Tabla1.Columna1 = Tabla2.Columna1 La Columna1 de cada una de las tablas respectivas son las columnas de nexo o columnas de join.
SENTENCIA SELECT DISTINCT Recupera las filas de una tabla eliminando los valores de la columna duplicados.
SELECT DISTINCT columna1, columna2,. FROM nombre-tabla1, nombre-tabla2 [GROUP BY columna1, columna2....]
33
SENTENCIA SELECT TOP N FILAS DE UNA TABLA En Oracle8i podemos usar la sintaxis siguiente, con una clusula ORDER BY, para elegir filas con los valores mximos o mnimos de un campo:
SELECT * FROM (SELECT * FROM my_table ORDER BY col_name_1 DESC) WHERE ROWNUM < 10;
FUNCIONES SOBRE COLUMNAS COUNT. Indica el nmero de filas que cumplen una determinada condicin, o el nmero de valores diferentes que posee una columna.
COUNT(*) o COUNT(DISTINCT columna)
SUBSELECTS Permite realizar comparaciones con valores obtenidos en otra sentencia select anidada, a la que se denomina Subselect o Subselect interna.
SELECT columna1>, columna2,. FROM nombre-tabla1, nombre-tabla2 WHERE columna1 = (SELECT columna1 FROM nombre-tabla1, nombre-tabla2 WHERE condicin)
34
(Cuando en la condicin se pone el operador =, la subselect deber recuperar un slo registro). Insert Una sentencia INSERT de SQL agrega uno o ms registros a una (y slo una) tabla en una base de datos relacional. Forma bsica
INSERT INTO tabla (columna1, [''columna2,... '']) VALUES (valor1, [''valor2,...'']) Las cantidades de columnas y valores deben ser las mismas. Si una columna no se especifica, le ser asignado el valor por omisin. Los valores especificados (o implcitos) por la sentenciaINSERT debern satisfacer todas las restricciones aplicables. Si ocurre un error de sintaxis o si alguna de las restricciones es violada, no se agrega la fila y se devuelve un error.
Ejemplo
INSERT INTO agenda_telefonica (nombre, numero) VALUES (Roberto Jeldrez, 4886850); Cuando se especifican todos los valores de una tabla, se puede utilizar la sentencia acortada:
INSERT INTO tabla VALUES (valor1, [''valor2,...'']) Ejemplo (asumiendo que nombre y nmero son las nicas columnas de la tabla agenda_telefonica):
35
VALUES (valor1a, [''valor1b,...'']), (value2a,[''value2b,...'']), Ejemplo (asumiendo ese nombre y nmero son las nicas columnas en la tabla agenda_telefonica): INSERT INTO agenda_telefonica VALUES (Roberto Fernndez, 4886850), (Alejandro Sosa,4556550); Que poda haber sido realizado por las sentencias INSERT INTO agenda_telefonica VALUES (Roberto Fernndez, 4886850); INSERT INTO agenda_telefonica VALUES (Alejandro Sosa, 4556550); Notar que las sentencias separadas pueden tener semntica diferente (especialmente con respecto a los triggers), y puede tener diferente rendimiento que la sentencia de insercin mltiple. Para insertar varias filas en MS SQL puede utilizar esa construccin: INSERT INTO phone_book SELECT John Doe, 555-1212
UNION ALL
SELECT Peter Doe, 555-2323; Tenga en cuenta que no se trata de una sentencia SQL vlida de acuerdo con el estndar SQL ( SQL: 2003), debido a la clusula subselect incompleta. Para hacer lo mismo en Oracle se usa DUAL TABLE, siempre que se trate de solo una simple fila: INSERT INTO phone_book SELECT John Doe, 555-1212 FROM DUAL
UNION ALL
SELECT Peter Doe,555-2323 FROM DUAL
36
Un estndar-conforme implementacin de esta lgica se muestra el siguiente ejemplo, o como se muestra arriba: INSERT INTO phone_book SELECT John Doe, 555-1212 FROM LATERAL ( VALUES (1) ) AS t(c)
UNION ALL
SELECT Peter Doe,555-2323 FROM LATERAL ( VALUES (1) ) AS t(c)
Formas Avanzadas: Insertando filas con valores nulos Mtodo Implcito: Se omiten las columnas que aceptan valores nulos.
SQL> insert into 2 departments(department_id, department_name) 3 values(301, Departamento 301); 1 row created. SQL> commit; Commit complete.
Mtodo Explicito: Especificamos la palabra clave NULL en las columnas donde queremos insertar un valor nulo.
SQL> insert into departments 2 values(302, Departamento 302, NULL, NULL); 1 row created. SQL> commit; Commit complete.
37
38
Enter value for department_id: 3003 Enter value for department_name: Departamento 303 Enter value for location_id: 2800 old 3: values (&department_id, &department_name, &location_id) new 3: values (3003, Departamento 303, 2800) 1 row created. SQL> commit; Commit complete.
Formas Avanzadas: Insertando en multiples tablas Primero creamos las siguientes tablas: test50 y test80.
SQL> create table test50 2 (
39
3 id number(6) primary key, 4 name varchar2(20), 5 salary number(8,2) 6 ); Table created. SQL> create table test80 2 ( 3 id number(6) primary key, 4 name varchar2(20), 5 salary number(8,2) 6 ); Table created.
40
11 select department_id, employee_id, first_name, salary 12 from employees; 109 rows created. SQL> commit; Commit complete.
Update Una sentencia UPDATE de SQL es utilizada para modificar los valores de un conjunto de registros existentes en una tabla. Forma bsica
UPDATE tabla SET columna1 = valor1 [,''columna2'' = ''valor2'',...]
Ejemplo
UPDATE My_table SET field1 = updated value WHERE field2 = N;
Actualizando una Columna de una Tabla Incrementar el salario de todos los empleados en 10%.
SQL> update employees 2 set salary = salary * 1.10; 109 rows updated. SQL> Commit; Commit complete.
Seleccionando las Filas a Actualizar Ricardo Marcelo (Employee_id=251) ha sido trasladado de departamento de Compras (Department_id = 30) al departamento de Ventas (Department_id = 80).
SQL> select employee_id, first_name, department_id, salary
41
2 from employees 3 where employee_id = 251; EMPLOYEE_ID FIRST_NAME DEPARTMENT_ID SALARY - 251 Ricardo 30 12100 SQL> update employees 2 set department_id = 80 3 where employee_id = 251; 1 row updated. SQL> select employee_id, first_name, department_id, salary 2 from employees 3 where employee_id = 251; EMPLOYEE_ID FIRST_NAME DEPARTMENT_ID SALARY - 251 Ricardo 80 12100 SQL> commit; Commit complete.
Actualizando Columnas con Subconsultas Gustavo Coronel (Employee_id = 250) ha sido trasladado al mismo departamento del empleado 203, y su salario tiene que ser el mximo permitido en su puesto de trabajo.
SQL> select employee_id, first_name, last_name, department_id, job_id, salary 2 from employees 3 where employee_id = 250; EMPLOYEE_ID FIRST_NAME LAST_NAME DEPARTMENT_ID JOB_ID SALARY - - 250 Gustavo Coronel 100 FI_MGR 15400 SQL> update employees
42
2 set department_id = (select department_id from employees 3 where employee_id = 203), 4 salary = (select max_salary from jobs 5 where jobs.job_id = employees.job_id) 6 where employee_id = 250; 1 row updated. SQL> commit; Commit complete. SQL> select employee_id, first_name, last_name, department_id, job_id, salary 2 from employees 3 where employee_id = 250; EMPLOYEE_ID FIRST_NAME LAST_NAME DEPARTMENT_ID JOB_ID SALARY - - 250 Gustavo Coronel 40 FI_MGR 16000
Actualizando Varias Columnas con una Subconsulta Asumiremos que tenemos la tabla resumen_dept, con la siguiente estructura: Columna Department_id Emps Planilla Tipo Dato Number(4) Number(4) Nulos No Si Descripcion Cdigo de Departamento. Cantidad de Empleados en el departamento. Emporte de la planilla en el departamento.
Number(10,2) Si
Esta tabla guarda la cantidad de empleados y el importe de la planilla por departamento. Este script crea la tabla resumen_det e inserta los departamentos.
SQL> create table resumen_dept 2 ( 3 department_id number(4) primary key, 4 emps number(4),
43
5 planilla number(10,2) 6 ); Table created. SQL> insert into resumen_dept (department_id) 2 select department_id from departments; 31 rows created. SQL> commit; Commit complete.
Delete Una sentencia DELETE de SQL borra cero o ms registros existentes en una tabla,
44
Forma bsica
DELETE FROM tabla WHERE columna1 = valor1
Ejemplo
DELETE FROM My_table WHERE field2 = N;
45
Eliminar los empleados que tienen el salario mximo en cada puesto de trabajo.
SQL> delete from copia_emp 2 where salary = (select max_salary from jobs 3 where jobs.job_id = copia_emp.job_id); 1 row deleted. SQL> commit; Commit complete.
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 una sentencia (system privileges) o a acceder a un objeto de otro usuario (object privileges). La sintaxis es:
GRANT <ROL> TO <URUARIO / ROL/public > [WITH GRANT OPTION]
La opcion WITH GRANT OPTION otorga al usuario la posibilidad de otorgar el rol a otro usuario o rol. 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 de sistema (system privileges) 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:
47
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 Los roles CONNECT, RESOURCE y DBA ya no deben usarse (aunque estan soportados). 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,...)]
48
ON JAVA [RE]SOURCE [schema.]object TO {user, | role, |PUBLIC} [WITH GRANT OPTION] [WITH HIERARCHY OPTION]
Con la opcion WITH HIERARCHY OPTION damos permisos sobre todos los subojetos, incluso sobre los que se creen despues de ejecutar el GRANT. Con la opcin WITH GRANT OPTION damos permiso para que el que los recibe los pueda a su vez asignar a otros usuarios y roles. La opcin GRANT ALL PRIVILEGES se puede escribir tambien como GRANT ALL Podemos obtener la lista de permisos de las tablas asi:
SELECT * FROM ALL_TAB_PRIVS_MADE;
49
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;
50
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]
La opcin FORCE, quita todos los privilegios y descompila todos sus objetos. Commit Guarda los cambios de la transaccin en curso. Libera los recursos bloqueados por cualquier actualizacin hecha con la transaccin actual (LOCK TABLE).
COMMIT [WORK] [COMMENT 'comment_text'] COMMIT [WORK] [FORCE 'force_text' [,int] ] Si ejecutamos: DELETE FROM T_PEDIDOS WHERE COD_PEDIDO=15; COMMIT;
Borrar un registro y guarda los cambios. Rollback Deshace los cambios de la transaccin en curso. Libera los recursos bloqueados por cualquier actualizacin hecha con la transaccin actual (LOCK TABLE).
ROLLBACK [WORK] [TO [SAVEPOINT]savepoint_text_identifier]; ROLLBACK [WORK] [FORCE 'force_text'];
Si ejecutamos:
DELETE FROM T_PEDIDOS WHERE COD_PEDIDO=15; COMMIT;
Borrar un registro pero cancela los cambios. Queda como si no hubiesemos hecho nada.
51
Savepoint Sirve para marca un punto de referencia en la transaccin para hacer un ROLLBACK parcial.
SAVEPOINT identificador;
Solo guardamos la primera modificacin. Transacciones Una transaccin es un grupo de acciones que hacen transformaciones consistentes en las tablas preservando la consistencia de la base de datos. Una base de datos est en un estado consistente si obedece todas las restricciones de integridad definidas sobre ella. Los cambios de estado ocurren debido a actualizaciones, inserciones, y eliminaciones de informacin. Por supuesto, se quiere asegurar que la base de datos nunca entre en un estado de inconsistencia. Sin embargo, durante la ejecucin de una transaccin, la base de datos puede estar temporalmente en un estado inconsistente. El punto importante aqu es asegurar que la base de datos regresa a un estado consistente al fin de la ejecucin de una transaccin.
52
Lo que se persigue con el manejo de transacciones es por un lado tener una transparencia adecuada de las acciones concurrentes a una base de datos y por otro lado tener una transparencia adecuada en el manejo de las fallas que se pueden presentar en una base de datos. Propiedades de una Transaccin Una transaccin debe tener las propiedades ACID, que son las iniciales en ingls de las siguientes caractersticas: Atomicity, Consistency, Isolation, Durability. Atomicidad Una transaccin constituye una unidad atmica de ejecucin y se ejecuta exactamente una vez; o se realiza todo el trabajo o nada de l en absoluto. Coherencia Una transaccin mantiene la coherencia de los datos, transformando un estado coherente de datos en otro estado coherente de datos. Los datos enlazados por una transaccin deben conservarse semnticamente. Aislamiento Una transaccin es una unidad de aislamiento y cada una se produce aislada e independientemente de las transacciones concurrentes. Una transaccin nunca debe ver las fases intermedias de otra transaccin. Durabilidad Una transaccin es una unidad de recuperacin. Si una transaccin tiene xito, sus actualizaciones persisten, aun cuando falle el equipo o se apague. Si una transaccin no tiene xito, el sistema permanece en el estado anterior antes de la transaccin. Operacin de Transacciones
53
El siguiente grfico ilustra el funcionamiento de una transaccin, cuando es confirmada y cuando es cancelada.
Inicio de una transaccin El inicio de una transaccin es de manera automtica cuando ejecutamos una sentencia insert, update, delete. La ejecucin de cualquiera de estas sentencias da inicio a una transaccin. Las instrucciones que se ejecuten a continuacin formaran parte de la misma transaccin. Confirmacin de una transaccin Para confirmar los cambios realizados durante una transaccin utilizamos la sentencia commit. Cancelar una transaccin Para cancelar los cambios realizados durante una transaccin utilizamos la sentencia rollback.
54
Set transaction
SET TRANSACTION
inicia una transaccion como read-only (solo lectura) o read-write (escritura / lectura), establece el isolation level, y opcionalmente asigna un segment de rollback para la. Las transacciones de Solo Lectura (Read-only) son usadas, normalmente, para ejecutar multiples consultas sobre una o mas tablas, mientras otros usuarios modifican los datos de las tablas. La sintaxis del comando es:
55
READ ONLY Establece la transaccion como solo lectura de forma que las subsiguientes consultas vern solo los datos confirmados antes de las instruccion Set transaction. READ WRITE Establece la transaccin como Lectura-Escritura, el uso de READ-WRITE, no afecta a otros usuarios. Si la transaccin ejecuta manipulacin de datos, Oracle asigna un segmento de rollback para la transaccin. ISOLATION LEVEL Especifica el comportamiento de bloqueo de la transaccin para la conexin
SERIALIZABLE:
If a serializable transaction tries to execute a SQL data manipulation statement that modifies any table already modified by an uncommitted transaction, the statement fails. To enable SERIALIZABLE mode, your DBA must set the Oracle initialization parameter COMPATIBLE to 7.3.0 or higher.
READ COMMITTED:
Si la transaccion de manipulacion de datos require un bloqueo de filas que estan actualmente bloqueadas por otro usuario, la transaccin espera hasta que las filas sean liberadas. USE ROLLBACK SEGMENT Asigna a la transaccion un segment de rollback y establece la transaccin como Read-Write, no se puede usar esta opcin con Read Only NAME Establece el nombre o comentario para la transaccin. Notas:
56
SET TRANSACTION debe ser la primara sentencia e la transaccin y puede aparecer solamente una vez en la transaccin.
Ejemplo:
DECLARE daily_order_total NUMBER(12,2); weekly_order_total NUMBER(12,2); monthly_order_total NUMBER(12,2); BEGIN COMMIT; finalize la transaccin anterior SET TRANSACTION READ ONLY NAME Calculando total de transacciones; SELECT SUM (order_total) INTO daily_order_total FROM orders WHERE order_date = SYSDATE; SELECT SUM (order_total) INTO weekly_order_total FROM orders WHERE order_date = SYSDATE 7; SELECT SUM (order_total) INTO monthly_order_total FROM orders WHERE order_date = SYSDATE 30; COMMIT; finalize la transaccion read-only transaction END; /
Restricciones de SET TRANSACTION Solo las sentencias SELECT INTO, OPEN, FETCH, CLOSE, LOCK TABLE, COMMIT, ROLLBACK pueden utilizarse en transacciones Read-Only.
NVL Devuelve el valor recibido como parmetro en el caso de que expresin sea NULL,o expresin en caso contrario. NVL(<expresion>, <valor>) El siguiente ejemplo devuelve 0 si el precio es nulo, y el precio cuando est informado:
SELECT CO_PRODUCTO, NVL(PRECIO, 0) FROM PRECIOS;
Esta funcin evala una expresin <expr>, si se cumple la primera condicin <cond1> devuelve el valor1 <val1>, en caso contrario evala la siguiente condicin y as hasta que una de las condiciones se cumpla. Si no se cumple ninguna condicin se devuelve el valor por defecto. Es muy comn escribir la funcin DECODE identada como si se tratase de un bloque IF.
SELECT DECODE (co_pais, /* Expresion a evaluar */ ESP, ESPAA, /* Si co_pais = ESP ==> ESPAA */
MEX, MEXICO, /* Si co_pais = MEX ==> MEXICO */ PAIS ||co_pais)/* ELSE ==> concatena */ FROM PAISES; TO_DATE
58
Convierte una expresin al tipo fecha. El parmetro opcional formato indica el formato de entrada de la expresin no el de salida. TO_DATE(<expresion>, [<formato>]) En este ejemplo convertimos la expresion 01/12/2006 de tipo CHAR a una fecha (tipo DATE). Con el parmetro formato le indicamos que la fecha est escrita como da-mes-ao para que devuelve el uno de diciembre y no el doce de enero.
SELECT TO_DATE(01/12/2006,
DD/MM/YYYY) FROM DUAL; Este otro ejemplo muestra la conversin con formato de da y hora.
SELECT TO_DATE(31/12/2006 23:59:59,
DD/MM/YYYY HH24:MI:SS) FROM DUAL; TO_CHAR Convierte una expresin al tipo CHAR. El parmetro opcional formato indica el formato de salida de la expresin.
TO_CHAR(<expresion>, [<formato>])
FROM DUAL; TO_NUMBER Convierte una expresion alfanumrica en numerica. Opcionalmente podemos especificar el formato de salida. TO_NUMBER(<expresion>, [<formato>]) SELECT TO_NUMBER (10)
59
FROM DUAL; TRUNC Trunca una fecha o nmero. Si el parmetro recibido es una fecha elimina las horas, minutos y segundos de la misma.
SELECT TRUNC(SYSDATE)FROM DUAL;
INSTR Busca una cadena de caracteres dentro de otra. Devuelve la posicion de la ocurrencia de la cadena buscada. Su sintaxis es la siguiente:
INSTR(<char>, <search_string>, <startpos>, <occurrence> )
El siguiente ejemplo reemplaza la palabra HOLA por VAYA en la cadena HOLA MUNDO.
SELECT REPLACE (HOLA MUNDO,HOLA, VAYA) devuelve
60
SUBSTR Obtiene una parte de una expresion, desde una posicin de inicio hasta una determinada longitud.
SUBSTR(<expresion>, <posicion_ini>, <longitud> )
RPAD Aade N veces una determinada cadena de caracteres a la derecha una expresin. Muy util para generar ficheros de texto de ancho fijo.
RPAD(<expresion>, <longitud>, <pad_string> )
El siguiente ejemplo aade puntos a la expresion Hola mundo hasta alcanzar una longitud de 50 caracteres.
SELECT RPAD(Hola Mundo, 50, .)
61
FROM DUAL;
LPAD Aade N veces una determinada cadena de caracteres a la izquierda de una expresin. Muy util para generar ficheros de texto de ancho fijo.
LPAD(<expresion>, <longitud>, <pad_string> )
El siguiente ejemplo aade puntos a la expresion Hola mundo hasta alcanzar una longitud de 50 caracteres.
SELECT LPAD(Hola Mundo, 50, .) FROM DUAL;
62
FROM DUAL
63