You are on page 1of 31

Manual de Oracle

Tabla resumen de tipos de datos.


Tipo Dato VARCHAR2(size [BYTE | CHAR]) Descripcin
Cadena de caracteres de longitud variable que tiene como tamao mximo el valor de size en BYTE o CHAR. El tamao mximo es de 4000 bytes o caracteres, y la mnima es de 1 byte o un carcter. Se debe especificar el tamao de para VARCHAR2. Cadena de caracteres Unicode de longitud variable con size como mximo tamao de longitud. El nmero de bytes que pueden ser hasta dos veces el tamao de codificacin AL16UTF16 y tres veces el tamao de la codificacin UTF8. El tamao mximo est determinado por la definicin del juego de caracteres nacional, con un lmite mximo de 4000 bytes. Se debe especificar el size de NVARCHAR2. Nmero con p precisin (parte entera) y s escala (parte decimal). La precisin p puede variar de 1 a 38. La s escala puede variar desde -84 hasta 127. Tanto la precisin y la escala se encuentran en dgitos decimales. Un valor numrico requiere 1 a 22 bytes. Un subtipo del tipo de datos NUMBER con precisin p. Un valor de coma flotante se representa internamente como un NUMBER. La precisin p puede variar desde 1 hasta 126 dgitos binarios. Un valor flotante requiere 1 a 22 bytes. Tipo de datos de caracteres de longitud variable de hasta 2 gigabytes, o 231 -1 bytes. Permanece para compatibilidad con versiones anteriores de Oracle. Intervalo de fechas vlidas del 1 de enero de 4712 antes de Cristo a el 31 de diciembre de 9999. El formato por defecto se determina explcitamente por el parmetro NLS_DATE_FORMAT o implcitamente por el parmetro NLS_TERRITORY. El tamao es de 7 bytes. Este tipo de datos contiene los campos de fecha y hora AO, MES, da, hora, minuto y segundo. No tiene fracciones de segundo o de una zona horaria. Nmero en coma flotante de 32 bits. Este tipo de datos requiere 4 bytes. Nmero en coma flotante de 64 bits. Este tipo de datos se requieren de 8 bytes. Ao, mes y da como valores de la fecha, as como la hora, minutos y segundos como valores de tiempo, donde fractional_seconds_precision es el nmero de dgitos en la parte fraccionaria del segundo del campo datetime. Los valores aceptados de fractional_seconds_precision son del 0 al 9. El valor por defecto es 6. El formato por defecto se determina explcitamente por el parmetro NLS_TIMESTAMP_FORMAT o implcitamente por el parmetro NLS_TERRITORY. El tamao es de 7 o 11 bytes, dependiendo de la precisin. Este tipo de datos contiene los campos datetime AO, MES, DIA, HORA, MINUTO y SEGUNDO. Contiene las fracciones de segundo, pero no tiene una zona horaria. Todos los valores de TIMESTAMP, as como el valor de tiempo de desplazamiento de la zona, donde fractional_seconds_precision es el nmero de dgitos en la parte fraccionaria del segundo del campo datetime. Los valores aceptados son del 0 al 9. El valor por defecto es 6. El formato por defecto se determina explcitamente por el parmetro NLS_TIMESTAMP_FORMAT o implcitamente por el parmetro NLS_TERRITORY. El tamao se fija en 13 bytes. Este tipo de datos contiene los campos datetime AO, MES, DIA, HORA, MINUTO, SEGUNDO, TIMEZONE_HOUR y TIMEZONE_MINUTE. Cuenta con las fracciones de segundo y una zona horaria explcita. Todos los valores de TIMESTAMP siguientes

NVARCHAR2(size)

NUMBER [ (p [, s]) ]

FLOAT [(p)]

LONG

DATE

BINARY_FLOAT

BINARY_DOUBLE TIMESTAMP [(fractional_seconds_precision)]

TIMESTAMP [(fractional_seconds_precision)] WITHTIMEZONE

TIMESTAMP [(fractional_seconds)] WITHLOCALTIMEZONE

WITHTIMEZONE, con las


excepciones:

Manual de Oracle
* Los datos se normalizan con la zona horaria de base de datos cuando se almacenan en la base de datos. * Cuando se recuperan los datos, los usuarios ven los datos en la zona de tiempo de la sesin. El formato por defecto se determina explcitamente por el parmetro NLS_TIMESTAMP_FORMAT o implcitamente por el parmetro NLS_TERRITORY. El tamao es de 7 o 11 bytes, dependiendo de la precisin.

INTERVALYEAR [(year_precision)] TOMONTH INTERVALDAY [(day_precision)] TOSECOND [(fractional_seconds)]

Almacena un perodo de tiempo en aos y meses, donde year_precision es el nmero de dgitos en el campo datetime AO. Los valores aceptados son del 0 al 9. El valor predeterminado es 2. El tamao se fija en 5 bytes. Almacena un perodo de tiempo en das, horas, minutos y segundos, donde * day_precision es el nmero mximo de dgitos en el campo datetime DA. Los valores aceptados son del 0 al 9. El valor predeterminado es 2. * fractional_seconds_precision es el nmero de dgitos en la parte fraccionaria del campo SEGUNDO. Los valores aceptados son del 0 al 9. El valor por defecto es 6. El tamao se fija en 11 bytes.

RAW(size) LONG RAW ROWID UROWID [(size)]

Datos binarios sin formato de longitud size. El tamao mximo es de 2000 bytes. Se debe especificar el tamao de un valor RAW. Datos binarios de tipo RAW de longitud variable hasta 2 gigabytes. Cadena en base 64 que representa la direccin nica de una fila en la tabla. Este tipo de datos es principalmente para los valores devueltos por la pseudo columna ROWID. Cadena en base 64 que representa la direccin lgica de una fila de una tabla de ndice organizado. El tamao opcional es el tamao de una columna de tipo UROWID de Oracle. El tamao mximo y por defecto es de 4000 bytes. Cadena de caracteres de longitud fija de size bytes de tamao o size de caracteres. El tamao mximo es de 2000 bytes o caracteres, el tamao predeterminado y mnimo es de 1 byte. Cadena de caracteres de longitud fija de size caracteres de tamao de largo. El nmero de bytes pueden ser hasta dos veces el tamao de codificacin AL16UTF16 y tres veces el tamao de la codificacin UTF8. El tamao mximo est determinado por la definicin del juego de caracteres nacional, con un lmite mximo de 2000 bytes. El tamao predeterminado y mnimo es de un carcter. Un objeto de tipo LOB que contiene caracteres de un byte o multibyte. Son compatibles tanto de ancho fijo y conjuntos de ancho variable de caracteres, con el carcter de base de datos establecida. El tamao mximo es (4 gigabytes - 1) * (tamao del bloque de la base de datos). Un objeto de tipo LOB que contiene caracteres Unicode. Son compatible tanto de ancho fijo y conjuntos de ancho variable de caracteres, con el conjunto base de datos de carcter nacional. El tamao mximo es (4 gigabytes - 1) * (tamao del bloque de la base de datos). Guarda los datos nacionales sobre el conjunto de caracteres. Un objeto de tipo LOB binario. El tamao mximo es (4 gigabytes - 1) * (tamao del bloque de la base de datos). Contiene un localizador a un archivo binario almacenado fuera de la base de datos. Permite flujo de bytes de E/S para el acceso a LOB externos que residen en el servidor de base de datos. El tamao mximo es de 4 gigabytes.

CHAR [(size [BYTE | CHAR])] NCHAR[(size)]

CLOB

NCLOB

BLOB BFILE

Manual de Oracle

Manual de Oracle
Prctica Cambiar un valor null por otro
La funcin NVL() te permite sustituir valores null con una cadena en los resultados de una consulta. Si expr1 es nulo, NVL devuelve expr2. Si expr1 no es nulo, NVL devuelve expr1. Los argumentos expr1 y expr2 pueden tener cualquier tipo de dato. Si sus tipos de datos son diferentes, entonces la base de datos Oracle convierte implcitamente al otro. Si no se puede convertir de forma implcita, la base de datos devuelve un error. La conversin implcita se lleva a cabo de la siguiente manera: Si expr1 es de tipo carcter, la base de datos Oracle convierte expr2 al tipo de datos de expr1 antes de compararlos y devuelve un VARCHAR2 en el juego de caracteres de expr1 Si expr1 es de tipo numrico, base de datos Oracle determina qu argumento tiene la mxima prioridad numrica, convierte implcitamente el argumento vlido para ese tipo de datos, y devuelve ese tipo de datos La funcin NVL() se puede utilizar tanto en Oracle 10g como en Oracle 11g. Ejemplos En este ejemplo aparece un listado de productos con su descuento, si descuento es null colocamos un 0. 1.SELECTDescripcion, NVL(TO_CHAR(descuento), 0) Descuento 2. FROMproductos 3. WHEREprecio< 12 4. ORDERBY 1;

DESCRIPCION DESCUENTO --------------------------- -------------Cuaderno anillas 10 A4 0 Grapadora pequea 10 Paquete 500 folios A4 0 Portaminas 0.5 2 Rotulador rojo 4 En este otro ejemplo si descuento es null colocamos una cadena de caracteres Sin Descuento. 1.SELECTDescripcion, NVL(TO_CHAR(descuento), 'Sin Descuento') Descuento 2. FROMproductos 3. WHEREprecio< 12 4. ORDERBY1;

Manual de Oracle
DESCRIPCION ----------------------Cuaderno anillas 10 A4 Grapadora pequea Paquete 500 folios A4 Portaminas 0.5 Rotulador rojo DESCUENTO --------------Sin Descuento 10 Sin Descuento 2 4

Manual de Oracle
Prctica ndices Definicin de ndice Qu es un ndice? Para qu sirve?
El ndice de una base de datos es una estructura de datos que mejora la velocidad de las operaciones, permitiendo un rpido acceso a los registros de una tabla. Al aumentar drsticamente la velocidad de acceso, se suelen usar sobre aquellos campos sobre los cuales se vayan a realizar bsquedas frecuentes. El ndice tiene un funcionamiento similar al ndice de un libro, guardando parejas de elementos: el elemento que se desea indexar y su posicin en la base de datos. Para buscar un elemento que est indexado, slo hay que buscar en el ndice de dicho elemento para, una vez encontrado, devolver el registro que se encuentre en la posicin marcada por el ndice. Los ndices pueden ser creados usando una o ms columnas, preparando la base de datos tanto para bsquedas rpidas al azar como para ordenaciones eficientes de los registros. Los ndices son construidos sobre rboles B, B+, B* o sobre una mezcla de ellos, funciones de clculo u otros mtodos. El espacio en disco requerido para almacenar el ndice es tpicamente menor que el espacio de almacenamiento de la tabla (puesto que los ndices generalmente contienen solamente los campos clave de acuerdo con los que la tabla ser ordenada, y excluyen el resto de los detalles de la tabla), lo que da la posibilidad de almacenar en memoria los ndices de tablas que no cabran en ella. En una base de datos relacional un ndice es una copia de parte de una tabla. Crearemos una tabla para el ejemplo de creacin de ndices ejecutando la siguiente consulta SQL: CREATE TABLE facturacion ( codigonumber(10) notnull, fecha date default sysdate, codigoclientenumber(10), nombreclientevarchar(100), observacionvarchar(2000), constraintpk_facturacion_codigoprimarykey (codigo) ) tablespace USERS Como se puede observar en la consulta SQL anterior, al aadir la lnea: Constraint pk_facturacion_codigo primary key (codigo)

Manual de Oracle
Estamos indicando a Oracle que cree la tabla "facturacion", con el campo "codigo" y que ste sea clave primaria, por lo que crear un ndice automticamente para este campo. Esta es una forma de crear ndices, en la creacin de la tabla: Tras crear la tabla insertaremos algunos registros con la instruccin SQL: Insert into facturacion (codigo, codigocliente, nombrecliente) values (1, 50, 'AletsLorat') Puesto que hemos indicado que la columna "codigo" sea clave primaria, Oracle no permitir valores duplicados para esta columna, esta comprobacin la realizar basndose en el ndice creado. Si intentamos agregar un nuevo registro con el valor de "codigo" a "1" (que ya existe) nos mostrar este error: Con el texto: ORA-00001: restriccin nica (SYSTEM.PK_FACTURACION_CODIGO) violada, indicando que la restriccin nica PK_FACTURACION_CODIGO no se ha cumplido por lo que no dejar insertar el registro. Insertaremos varios registros (cambiando el valor de "codigo"). Ejecutando la consulta SQL: select * from facturacion

Crear un ndice en una tabla que ya existente en Oracle


La creacin de un ndice en Oracle se realiza mediante el comando createindex. Cuando se define una clave primaria o una columna unvoca (UNIQUE) durante la creacin de una tabla o su mantenimiento, Oracle crear automticamente un ndice de tipo UNIQUE que gestione dicha restriccin, como hemos indicado anteriormente. La sintaxis completa de createindexes la siguiente: create [bitmap | unique] indexnombre_indiceon nombre_tabla (nombre_columna [, nombre_columna2] ...) [reverse];

bitmap indica que se cree un ndice de mapa de bits que permite crear ndices en columnas con muy pocos valores diferentes. unique indica que el valor de la o las columnas indexadas debe ser nico, no puede haber duplicidades. nombre_indicedebe ser un nombre unvoco (no debe existir otro nombre de objeto en Oracle) que siga los convenios de denominacin de Oracle para nombrar columnas. nombre_tabla ser el nombre de la tabla donde se crear el ndice. nombre_columna (o columnas) ser la columna de la tabla nombre_tabla en la que se crear el ndice. Se puede crear un ndice para varias columnas.

Manual de Oracle

reverse indica a Oracle que invierta los bytes del valor indexado, lo que puede mejorar la distribucin del procesamiento y de los datos cuando se insertan muchos valores de datos secuenciales.

Para crear un ndice en Oracle podemos utilizar SQL*Plus (herramienta de lnea de comandos incluida con Oracle), se puede utilizar Oracle Enterprise Manager (modo grfico) o una aplicacin externa que permita acceso a Oracle, como por ejemplo: Siguiendo con el ejemplo, aadiremos un ndice normal para la columna "nombrecliente" de la tabla "facturacion". Para ello ejecutaremos la siguiente consulta SQL: CREATE INDEX facturacionCte ON facturacion(NombreCliente); Para ver el ndice creado podemos ejecutar la siguiente consulta SQL (como indicamos aqu): Select index_name as Nombre, index_type as Tipo, table_name as Tabla, tablespace_name as Tablespace, secondary as Secundario from all_indexes where table_name = 'FACTURACION'; Para aadir un ndice de tipo UNIQUE, obligando a que los valores del campo indexado sean unicos, no se puedan repetir en el campo de la tabla, ejecutaremos la siguiente sentencia SQL: Create unique index IN_FACTURACION_COD_CODCLI_FE on FACTURACION (CODIGOCLIENTE, FECHA) De esta forma Oracle no permitir que haya dos registros en la tabla "facturacion" con el mismo valor en los campos "codigocliente" y "fecha", es decir, slo podr aadirse una factura por cliente y por da, un cliente no podr tener dos facturas en un mismo da. Por ejemplo, si insertamos este registro: Insert into facturacion(codigo, codigocliente, fecha)values (6900, 500, to_date('31/12/2009', 'DD-MM-YYYY')) Intentaremos insertar un segundo registro con el mismo valor en codigocliente y en fecha: Insert into facturacion(codigo, codigocliente, fecha)values (6910, 500, to_date('31/12/2009', 'DD-MM-YYYY')) Oracle detectar que se est intentando infringir una restriccin nica, por lo que mostrar el siguiente mensaje de error y no dejar que se inserte el registro:

Manual de Oracle
Con el texto: ORA-00001: restriccin nica (SYSTEM.IN_FACTURACION_COD_CODCLI_FE) violada.

Cmo saber si un ndice se est utilizando, monitorizacin del uso de ndices en Oracle
Para consultar las estadsticas sobre el uso de uno o varios ndices de tablas de Oracle, en primer lugar deberemos activar la monitorizacin del ndice que queramos, para ello utilizaremos el siguiente comando SQL: Alter index nombre_indice monitoring usage; Por ejemplo, en nuestro caso, para monitorizar el ndice IN_FACTURACION_NOMBRECLIENTE: Alter index IN_FACTURACION_NOMBRECLIENTE monitoring usage; Tras activar la monitorizacin, podremos ver si el ndice ha sido usado ejecutando la siguiente consulta SQL. En nuestro caso comprobaremos si han sido usados los ndices monitorizados de la tabla FACTURACION: select * from v$object_usage where table_name = 'FACTURACION' Mostrar un registro indicando los siguientes datos:

INDEX_NAME: nombre del ndice usado. TABLE_NAME: nombre de la tabla a la que pertenece el ndice usado. MONITORING: estado de monitorizacin, si est activa mostrar "YES". USED: mostrar "NO" si an no ha sido usado. START_MONITORING: fecha y hora de inicio de monitorizacin. END_MONITORING: fecha y hora de fin de monitorizacin.

Si insertamos algunos registros en la tabla FACTURACION y hacemos alguna consulta SQL ordenando por "nombre_cliente" para que el ndice sea usado podremos ver cmo cambia el valor de USED en v$object_usage: Para desactivar la monitorizacin ejecutaremos el siguiente comando SQL: Alter index nombre_indiceno monitoring usage; En nuestro ejemplo: Alter index IN_FACTURACION_NOMBRECLIENTE nomonitoring usage

Manual de Oracle
Ejecutando nuevamente la consulta: select * from v$object_usage where table_name = 'FACTURACION' Veremos que ha cambiado el valor de MONITORING a "NO" y ha aadido la fecha y hora a END_MONITORING.

Mostrar informacin de los ndices de una tabla en Oracle


Mostrar todas las restricciones de una tabla de Oracle
Para mostrar todas las restricciones de una tabla oracle (nombre de la restriccin, nombre de la tabla, columnas a las que afecta) ejecutaremos la siguiente consulta SQL: Select constraint_nameNombre, table_nameTabla, substr(column_name, 1, 255) Columnas from all_cons_columns where table_name = 'FACTURACION'

Mostrar todos los ndices de una tabla en Oracle


La siguiente consulta SQL mostrar todos los ndices de la tabla "FACTURACION" de Oracle (nombre del ndice, tipo de ndice, nombre de la tabla, tablespace en el que se guarda, si es secundario): Select index_name Nombre, index_type Tipo, table_name Tabla, tablespace_name Tablespace, secondary Secundario from all_indexes where table_name = 'FACTURACION'

Obtener el tamao ocupado por un ndice de una tabla de Oracle


La siguiente consulta SQL mostrar el tamao en megabytes de un ndice determinado, en nuestro caso del ndice PK_FACTURACION_CODIGO perteneciente a la tabla FACTURACION y el campo CODIGO del ejemplo. La consulta SQL para mostrar el tamao ocupado por un ndice es la siguiente: Select segment_name, sum(bytes)/1024/1024 MB from dba_extents

Manual de Oracle
where segment_name = 'PK_FACTURACION_CODIGO' group by segment_name

Reconstruccin de ndices cando es necesaria? cmo hacerla?, parmetros de los ndices en Oracle
Reconstruir ndices en Oracle
Oracle proporciona la capacidad de realizar una reconstruccin rpida de ndices, que permite crear de nuevo un ndice sin necesidad de eliminar el ndice existente. El ndice actualmente disponible se usa como origen de datos para el ndice nuevo, en lugar de utilizar la tabla como origen de datos. Durante la reconstruccin del ndice pueden cambiarse los parmetros de almacenamiento (storage) y la asignacin del espacio de tablas (tablespace). Para reconstruir un ndice de una tabla utilizaremos la clusula rebuild con el comando alter index. Un ejemplo de reconstruccin de un ndice en Oracle podra ser: ALTER INDEX nombre_indice REBUILD; Siguiendo nuestro ejemplo, para reindexar el ndice PK_FACTURACION_CODIGO ejecutaremos la siguiente instruccin SQL: ALTER INDEX PK_FACTURACION_CODIGO REBUILD; Ejecutaremos esta consulta desde Oracle Enterprise Manager, accediendo a la opcin "Hoja de Trabajo de SQL", desmarcaremos la opcin "Permitir Slo Sentencias SELECT", en "Comandos SQL" introduciremos: ALTER INDEX PK_FACTURACION_CODIGO REBUILD; Y pulsaremos en "Ejecutar". Si todo es correcto nos devolver en "Resultados": SQL se ha ejecutado correctamente.

Cambiar los parmetros de configuracin de un ndice en Oracle


Si queremos cambiar algn parmetro de configuracin de algn ndice, como el almacenamiento (storage) o incluso el espacio de tablas (tablespace) podremos ejecutar la siguiente instruccin SQL: alter index nombre_indice rebuild storage (initial 8M next 4M) tablespacenombre_tablespace;

Manual de Oracle
Con la instruccin anterior se reconstruir el ndice "nombre_indice" asignndole un tamao inicial de extensin de 8MB y un tamao para las siguientes extensiones de 4MB. El ndice "nombre_indice" ser creado en el tablespace "nombre_tablespace". Por lo que esta instruccin SQL servir para cambiar de tablespace un ndice (si as lo deseamos).

Manual de Oracle
Integridad
Para preservar la consistencia y correccin de los datos almacenados, un DBMS relacional impone generalmente una o ms restricciones de integridad de datos. Estas restricciones restringen los valores que pueden ser insertados en la base de datos o creados mediante una actualizacin de la base de datos.

Este tipo de integridad se demostr en la anterior.

Prctica ndices

vista en el tema

Integridad de Entidad
La integridad de entidad define una fila como entidad nica para una tabla determinada. La integridad de entidad fuerza la integridad de la columna o columnas de los identificadores o la clave principal de una tabla (mediante ndices, restricciones UNIQUE y restricciones PRIMARY KEY).

Integridad Referencial
La integridad referencial garantiza la coherencia de la informacin entre dos tablas que se encuentran relacionadas, de manera que se garantice que no efectu el cambio s:

Agregar registros a una tabla relacionada si no hay ningn registro asociado en la tabla principal. Cambiar valores en una tabla principal de manera que queden registros hurfanos en una tabla relacionada.

Oracle slo admite dos tipos de integridad referencial:

Activar la integridad referencial para comprobar los valores de las tablas relacionadas al especificar los datos. Si el valor del dato no est permitido (determinado por las reglas definidas anteriormente), se produce un error en la entrada de datos y no se agregan a la base de datos. Eliminaciones en cascada. Para implementar la integridad referencial contamos con: Foreign Key. Si intentamos eliminar un registro de la tabla referenciada por una restriccin "foreign key" cuyo valor de

Manual de Oracle
clave primaria existe referenciada en la tabla que tiene dicha restriccin, la accin no se ejecuta y aparece un mensaje de error. Esto sucede porque, por defecto, para eliminaciones, la opcin de la restriccin "foreign key" es "no action". La restriccin "foreign key" tiene la clusula "on delete", que son opcionales. Esta clusula especifica cmo debe actuar Oracle frente a eliminaciones en las tablas referenciadas en la restriccin.

Las opciones para estas clusulas son las siguientes: "set null": indica que si eliminamos un registro de la tabla referenciada (TABLA2) cuyo valor existe en la tabla principal (TABLA1), dicho registro se elimine y los valores coincidentes en la tabla principal se seteen a "null". "cascade": indica que si eliminamos un registro de la tabla referenciada en una "foreign key" (TABLA2), los registros coincidentes en la tabla principal (TABLA1), tambin se eliminen; es decir, si eliminamos un registro al cual una clave fornea referencia, dicha eliminacin se extiende a la otra tabla (integridad referencial en cascada). "no action": es la predeterminada; indica que si se intenta eliminar un registro de la tabla referenciada por una "foreign key", Oracle no lo permita y muestre un mensaje de error. Se establece omitiendo la clusula "on delete" al establecer la restriccin. La sintaxis completa paar agregar esta restriccin a una tabla es la siguiente: alter table TABLA1 add constraint NOMBRERESTRICCION foreign key (CAMPOCLAVEFORANEA) references TABLA2(CAMPOCLAVEPRIMARIA) on delete OPCION;

Veamos un ejemplo. Definimos una restriccin "foreign key" a la tabla "libros" estableciendo el campo "codigoeditorial" como clave fornea que referencia al campo "codigo" de la tabla "editoriales". La tabla "editoriales" tiene como clave primaria el campo "codigo". Especificamos la accin en cascada para las eliminaciones: alter table libros add constraint FK_libros_codigoeditorial foreign key (codigoeditorial) references editoriales(codigo) on delete cascade;

Manual de Oracle
Si luego de establecer la restriccin anterior, eliminamos una editorial de "editoriales" cuyo valor de cdigo est presente en "libros", se elimina dicha editorial y todos los libros de tal editorial. Si consultamos "user_constraints", en la columna "delete_rule" mostrar "cascade". Para definir una restriccin "foreign key" sobre la tabla "libros" estableciendo el campo "codigoeditorial" como clave fornea que referencia al campo "codigo" de la tabla "editoriales" especificando la accin de seteo a "null" tipeamos: alter table libros add constraint FK_libros_codigoeditorial foreign key (codigoeditorial) references editoriales(codigo) on delete set null;

Si luego de establecer la restriccin anterior, eliminamos una editorial de "editoriales" cuyo valor de cdigo est presente en "libros", se elimina dicha editorial y todos los valores de libros que coinciden con tal editorial se setean a null. Si consultamos "user_constraints", en la columna "delete_rule" mostrar "set null".

Sintetizando, si al agregar una restriccin "foreign key":

No se especifica accin para eliminaciones, y se intenta eliminar un registro de la tabla referenciada en la "foreign key" (editoriales) cuyo valor de clave primaria (codigo) existe en la tabla principal (libros), la accin no se realiza. Se especifica "cascade" para eliminaciones ("on delete cascade") y elimina un registro de la tabla referenciada (editoriales) cuyo valor de clave primaria (codigo) existe en la tabla principal(libros), la eliminacin de la tabla referenciada (editoriales) se realiza y se eliminan de la tabla principal (libros) todos los registros cuyo valor coincide con el registro eliminado de la tabla referenciada (editoriales). Se especifica accin para eliminaciones ("on delete set null") y se elimina un registro de la tabla referenciada en la "foreign key" (editoriales) cuyo valor de clave primaria (codigo) existe en la tabla principal (libros), la accin se realiza y se setean a "null" todos los valores coincidentes en la tabla principal (libros).

Manual de Oracle
La restriccin "foreign key" NO tiene una clusula para especificar acciones para actualizaciones.

Si intentamos actualizar un registro de la tabla referenciada por una restriccin "foreign key" cuyo valor de clave primaria existe referenciada en la tabla que tiene dicha restriccin, la accin no se ejecuta y aparece un mensaje de error. Esto sucede porque, por defecto (y como nica opcin), para actualizaciones existe "no action".

Integridad de Dominio
La integridad de dominio viene dada por la validez de las entradas para una columna determinada. Puede forzar la integridad de dominio si restringe el tipo (mediante tipos de datos), o el intervalo de valores posibles (mediante restricciones FOREIGN KEY, restricciones CHECK, definiciones DEFAULT, definiciones NOT NULL). Tratamiento de valores Null en ORACLE. Esta restriccin especifica si una columna puede contener o no valores nulos. ORACLE por defecto se asume que la columna admite valores nulos. Formato: atributo tipo [CONSTRAINT nombre] NOT NULL | NULL. Ejemplo: Dni integer CONSTRAINT nn_dni NOT NULL

Tratamiento de los valores defecto en ORACLE (DEFAULT). En este caso, las restricciones de integridad se utilizan para especificar valores que sern asignados a una columna, cuando en sta no se introduzca ningn valor. El valor especificado en este campo debe ser del mismo tipo que la columna.

Las restricciones se especifican como parte de la definicin de la columna.

Para el tratamiento de informacin faltante, se le puede especificar un NULL como valor por defecto siempre que la columna permita nulos.

Manual de Oracle
En la expresin no se puede hacer referencia a otras columnas. Formato: atributo tipo DEFAULT expresin. Ejemplo: Num integer DEFAULT 1+3.

Tratamiento de las restricciones de validez en ORACLE (CHECK) Las restricciones de integridad de dominio sern aquellas frmulas bien formadas de primer orden construidas con atributos de la tabla como trminos bsicos, que depende satisfacerse en todos los estados vlidos para las tuplas de una tabla. Estas restricciones de integridad estn especificadas en ORACLE dentro de una restriccin de tipo CHECK asociada a una columna o una tabla. La implementacin de esta restriccin en una columna sera: Formato: atributo tipo [CONSTRAINT nombre] CHECK condicin. Ejemplo: Saldo integer CHECK saldo!=saldo_base A diferencia de otros gestores, en esa condicin se puede hacer referencia a cualquier columna de la tabla. Si intentamos agregar una restriccin que no permita que el precio mayorista supere el precio minorista: alter table libros add constraint CK_libros_preciominmay check (preciomay<=preciomin); No se pueden introducir en estas condiciones atributos de otras tablas. En ese caso, slo queda el recurso de programar explcitamente la restriccin de integridad, lo que habitualmente se hace generando disparos (triggers) de la base de datos.

Manual de Oracle
Integridad Definida por el Usuario
La integridad definida por el usuario permite definir reglas de empresa especficas que no pertenecen a ninguna otra categora de integridad. Todas las categoras de integridad admiten la integridad definida por el usuario.

Triggers
Un disparador (o trigger) es un tipo especial de procedimiento almacenado asociado a una tabla que se ejecuta al realizar una operacin bsica (INSERT, un DELETE o un UPDATE) sobre sta. La operacin bsica que despierta al trigger es conocida como sentencia disparadora. La ejecucin del disparador puede ser antes (before) o despus (after) de llevar a cabo la sentencia disparadora. Es posible especificar condiciones adicionales para la ejecucin del disparador (restrictores). Dado que una sentencia disparadora puede afectar una o ms filas de una tabla, es necesario especificar si se quiere que el disparador se ejecute para cada una de las filas afectadas o para el bloque en general. Para disear un disparador hay que cumplir dos requisitos:

descompone en un evento que causa la comprobacin del disparador y una condicin que se debe cumplir para ejecutar el disparador.

Los triggers PL/SQL constituyen una potente herramienta para mantener la integridad de la base de datos, ya que pueden llevar a cabo cualquier accin que sea necesaria para el mantenimiento de dicha integridad. Los triggers PL/SQL pueden llamar a otros procedimientos y disparar otros triggers, pero no admiten parmetros y no pueden ser invocados desde otros procedimientos PL/SQL. La sintaxis de un disparador Oracle es
CREATE [OR REPLACE] TRIGGER nombre {BEFORE | AFTER | INSTEAD OF} // Temporalidad del Evento {INSERT | DELETE | UPDATE [OF <lista de columnas>]} ON <tabla> [FOR EACH ROW | STATEMENT] //Granularidad [WHEN condicin]

Evento

Lgica

Manual de Oracle
[DECLARE//Declaracin de variables ] BEGIN

Cdigo
cuerpo del trigger [EXCEPTION ] END;

Suponga que se tienen las siguientes relaciones, asociadas a la concesin de prstamos en un banco:

Manual de Oracle
Para implementar el diagrama entidad relacin se tiene en Oracle el siguiente cdigo
CREATE TABLE DEUDOR ( IFE CHAR(13) NOT NULL, NOMBRE CHAR(50) NOT NULL, DIRECCION CHAR(100) NOT NULL, TELEFONO CHAR(10) NOT NULL, CONSTRAINT PKDeudor PRIMARY KEY (IFE) ); CREATE TABLE PRESTAMO ( NPRESTAMO NUMBER(5) NOT NULL PRIMARY KEY, IFE CHAR(13) NULL UNIQUE REFERENCES Deudor(IFE), INTERES NUMBER(4,2) NOT NULL, MONTO NUMBER(8) NOT NULL CHECK(monto > 0) ); CREATE TABLE PAGO ( NPRESTAMO NUMBER(5) NOT NULL, NPAGO NUMBER(2) NOT NULL, CANTIDAD NUMBER(8) CHECK (CANTIDAD >0), F_VENC DATE NOT NULL, F_PAGO DATE, CONSTRAINT PKCUOTA PRIMARY KEY (NPRESTAMO,NPAGO), CONSTRAINT FKCUOTA_PRESTAMO FOREIGN KEY (NPRESTAMO) REFERENCES PRESTAMO(NPRESTAMO) );

En la creacin de las tablas se incluyeron todas las restricciones, excepto aquella que dice que toda cuota debe ser pagada antes de su fecha de vencimiento. A continuacin se presenta el diseo del disparador que garantiza el cumplimiento de esta restriccin: Sentencia Disparadora: Como en la BD estn todas los pagos (realizados o no) asociadas a los prstamos, la fecha de pago se actualiza. Por lo tanto, la sentencia disparadora es la actualizacin de fecha de pago en la tabla Pagos. Antes / Despus: La restriccin de integridad no se puede violar, por lo tanto el trigger debe ser disparado antes de realizar la actualizacin. Para Todas/Para el bloque: La verificacin de la restriccin se hace para todas las filas que se actualicen al ejecutar la sentencia disparadora. Restrictor: Se debe impedir la actualizacin, slo cuando la fecha de pago sea mayor que la fecha de vencimiento de la cuota. Accin: Dar un error por violacin de la restriccin.

Manual de Oracle
A continuacin se especifica el trigger asociado con la tabla Pago: CREATE OR REPLACE TRIGGER DIS_PAGO BEFORE UPDATE OF f_pago ON Pago FOR EACH ROW WHEN (new.f_pago > old.f_venc) BEGIN raise_application_error(-20000, 'Pago ' || TO_CHAR(:old.nPago) || ' del prestamo ' || TO_CHAR(:old.nPrestamo) || ' vencida. Por favor, dirigirse a la gerencia.'); END; Para probar la validacin del trigger insertaremos informacin en las tablas: Insert into Deudor(ife,nombre,direccion,telefono) values ('1234567890123','alets lora','Nomeolvides 210','000000'); Insert into prestamo(nprestamo,ife,monto,interes) values (1234,'1234567890123',130000,1.26); Insert into Pago (nprestamo,npago,cantidad,f_venc) values(1234,1,10000 + 10000 * 0.0126,'2(11/2013'); --Este update viola la integridad protegida por el trigger en donde la fecha de pago no --Puede ser superior a la fecha de vencimiento. Update Pago set f_pago = '05/11/2013' where nprestamo=1234 and npago=1; select * from pago; --Este update se ejecuta con exito Update Pago set f_pago = '01/11/2013' where nprestamo=1234 and npago=1; Los disparadores sea activan al crearlos. Eliminar un disparador: DROP TRIGGER nombre_disparador; Activar/ Desactivar dispadores: Existen dos opciones. ALTER TRIGGER nombre_disparador {DISABLE | ENABLE}; ALTER TABLE nombre_tabla {ENABLE | DISABLE} ALL TRIGGERS; Temporalidad del Evento: AFTER / BEFORE

Manual de Oracle
BEFORE: Ejecutan la accin asociada antes de que la sentencia sea ejecutada Decidir si la accin debe realizarse o no Utilizar valores alternativos para la sentencia CREATE TRIGGER NombreTrigger BEFORE Insert ON NombreTabla .

AFTER: Ejecutan la accin asociada despus de que se haya ejecutado la sentencia CREATE TRIGGER NombreTrigger AFTER Insert ON NombreTabla . INSTEAD OF: Desde Oracle 8 se proporciona los disparadores de sustitucin, con ciertas restricciones INSTEAD OF es una clusula vlida solo para vistas; no se puede especificar un disparador INSTEAD OF en una tabla. Si una vista tiene un disparador INSTEAD OF, cualquier vista creada sobre sta debe tener a su vez un disparador INSTEAD OF. Cuando definimos disparadores INSTEAD OF para columnas LOB, podemos leer tanto el seudo-registro :OLD como el seudo-registro :NEW, pero no se puede modificar sus valores. Evento: Tipo de orden DML sobre una tabla que provoca la activacin del disparador. {INSERT | DELETE | UPDATE [OF <lista de columnas>]}

La lista de columnas slo tiene sentido en el evento UPDATE. Granuralidad del Evento: A NIVEL DE FILA: FOR EACH ROW:Ejecutan la accin asociada tantas veces como filas se vean afectadas por la sentencia que lo dispara. Si ninguna fila se ve afectada, no se dispara A NIVEL DE SENTENCIA: FOR EACK STATEMENT: Disparadores con nivel de orden. Es la opcin por defecto. Ejecutan una nica vez la accin asociada,

Manual de Oracle
independientemente del nmero de filas que se vean afectadas por la sentencia (incluso si no hay filas afectadas). Condicin: WHEN La clusula WHEN slo es vlida para los disparadores con nivel de fila, no puede contener subconsultas, vistas. Si est presente, el cuerpo del disparador slo se ejecutar para las filas que cumplan la condicin especificada en la clusula. La clusula WHEN tiene la forma: WHEN condicin

donde condicin es una expresin booleana que ser evaluada para cada fila. Se puede hacer tambin referencia a los registros :new y :old dentro de la condicin, pero en ese caso no se utilizan los dos puntos. Registros :old y :new Estas variables se utilizan del mismo modo que cualquier otra variable PL/SQL, con la salvedad de que no es necesario declararlas, son de tipo %ROWTYPE y contienen una copia del registro antes (OLD) y despues(NEW) de la accin SQL (INSERT, UPDATE, DELETE) que ha ejecutado el trigger. Utilizando esta variable podemos acceder a los datos que se estn insertando, actualizando o borrando.

De uso exclusivo en los disparadores de nivel de fila, si se intenta hacer referencia a cualquiera de los dos dentro de otro tipo de disparador, se obtendr un error de compilacin. :old y :new son registros que nos permiten acceder a los datos de la fila actual La siguiente tabla resume los valores regresados por estos seudoregistros en diferentes eventos Seudoregistros Evento :OLD INSERT NULL :NEW Nuevos valores

Manual de Oracle
DELETE UPDATE Valores almacenados Valores almacenados NULL Nuevos valores

Bloque PL/SQL Bloque es la unidad de estructura bsica en los programas PL/SQL. Supone una mejora en el rendimiento, pues se envan los bloques completos al servidor para ser procesados en lugar de enviar cada secuencia SQL. Partes de un bloque:

Zona de declaraciones: zona opcional. Se declaran los objetos locales (variables, constantes...). Zona de instrucciones: zona obligatoria. Zona de tratamiento de excepciones: zona opcional. Se tratan excepciones en el programa.

Forma de crear un bloque: Zona de declaraciones: DECLARE Tipos de datos NUMBER CHAR (longitud fija) VARCHAR (longitud variable) DATE BOOLEAN (es un tipo PL/SQL, no de BD). Declaracin implcita del tipo de datos. var1 var2%TYPE var tabla.campo%TYPE Declaracin de registros

Manual de Oracle
var tabla%ROWTYPE var cursor%ROWTYPE

Cuerpo: bloque PL/SQL y SQL, este bloque de instrucciones se realiza si se ejecuta la sentencia activadora especificada para el trigger y, si existe una clusula WHEN sta es TRUE. Con las siguientes restricciones:

Un disparador no puede emitir ninguna orden de control de transacciones (COMMIT, ROLLBACK o SAVEPOINT). El disparador se activa como parte de la ejecucin de la orden que provoc el disparo, y forma parte de la misma transaccin que dicha orden. Cuando la orden que provoca el disparo es confirmada o cancelada, se confirma o cancela tambin el trabajo realizado por el disparador. Ningn procedimiento o funcin llamada por el disparador puede emitir rdenes de control de transacciones. No puede contener ninguna declaracin de variables LONG o LONG RAW. Restricciones en tablas a las que se puede acceder (Tablas Mutantes). No puede modificar las columnas de clave primaria.

INSERTING, DELETING Y UPDATING Si un trigger puede ser activado por ms de un tipo de operacin (por ejemplo, "INSERT OR DELETE OR UPDATE OF Tabla"), el cuerpo del trigger puede utilizar los predicados condicionales INSERTING, DELETING y UPDATING para ejecutar bloques especficos de cdigo, dependiendo del tipo de operacin que activ el disparador. La sintaxis es la siguiente CREATE OR REPLACE TRIGGER Ejemplo BEFORE INSERT OR UPDATE OR DELETE ON tabla BEGIN IF DELETING THEN Acciones asociadas al borrado ELSIF INSERTING THEN Acciones asociadas a la insercin ELSIF UPDATING Acciones asociadas a la modificacin END IF; END Ejemplo;

Manual de Oracle
En un UPDATE, se puede especificar el nombre de una columna en un predicado condicional UPDATING para determinar si la columna especificada ha sido actualizada. Por ejemplo: CREATE OR REPLACE TRIGGER Ejemplo BEFORE INSERT OR DELETE OR UPDATE ON tabla BEGIN IF DELETING THEN Acciones asociadas al borrado ELSIF INSERTING THEN Acciones asociadas a la insercin ELSIF UPDATING(COL1) Acciones asociadas a la modificacin ELSIF UPDATING(COL2) Acciones asociadas a la modificacin END IF;

RAISE_APPLICATION_ERROR Permite que un programa PL/SQL pueda generar errores tal y como lo hace Oracle.

Cuando se produce un error no tratado en la seccin EXCEPTION, el error pasa fuera del bloque, al entorno que realiz la llamada. Con RAISE_APPLICATION_ERROR se pueden generar errores similares con el mensaje que se quiera y, como ocurre con los errores generados por Oracle, el programa genera una EXCEPCIN. La excepcin puede tratarse en la seccin EXCEPTION del bloque PL/SQL que la genera o del bloque que efecte su llamada, usando el manejador OTHERS y SQLCODE/SQLERRM. Formato: RAISE_APPLICATION_ERROR(<NE>, <ME>, [<PE>]) o <NE>: Nmero del error, comprendido entre 20.000 y 20.999. o <ME>: Mensaje del error, de longitud mxima 512 caracteres. o <PE>: Preservar errores es un valor lgico opcional. Indica si el error se introduce a la lista de errores ya generados (TRUE) o sustituye la lista actual con el nuevo error (FALSE, valor predeterminado). Permite generar errores con mensajes ms significativos que los que generara Oracle: Puede utilizarse en la seccin EXCEPTION. Hace que requieran el mismo tratamiento los errores definidos por el usuario y los errores predefinidos.

Manual de Oracle
Hay Excepciones Predefinidas que controlan errores particulares (excepto OTHERS Todas aquellas excepciones que no son controladas por el sistema manejador excepciones Oracle y/o por las excepciones definidas por el programador, controlando cualquier tipo de error). Algunas son:

INVALID_CURSOR: Se genera al intentar efectuar una operacin ilegal sobre un cursor, como cerrar o intentar extraer datos de un cursor no abierto. CURSOR_ALREADY_OPEN: Surge al intentar abrir un cursor ya abierto. NO_DATA_FOUND: Cuando una orden SELECT..INTO no devuelve ninguna fila o cuando se intenta referenciar un elemento de una tabla PL/SQL al que no se le ha asignado ningn valor previamente. TOO_MANY_ROWS: Si una orden SELECT..INTO devuelve ms de una fila. INVALID_NUMBER: Si falla la conversin de cierto valor a un tipo NUMBER o cuando usamos un dato no numrico en lugar de un dato numrico. VALUE_ERROR: Se genera cada vez que se produce un error aritmtico, de conversin, de truncamiento o de restricciones en una orden procedimental (si es una orden SQL se produce la excepcin INVALID_NUMBER). Ej.: Si asignamos una cadena o nmero de mayor longitud que el tipo de la variable receptora. STORAGE_ERROR y PROGRAM_ERROR: Son errores internos que no deberan producirse. Ocurren respectivamente si PL/SQL se queda sin memoria o por un fallo en el motor PL/SQL de Oracle y debera avisarse del error al departamento de soporte tcnico de Oracle. DUP_VAL_ON_INDEX: Es el error ORA-1, generado cuando se intenta insertar una fila en una tabla con un atributo UNIQUE y el valor de ese campo en la fila que se intenta insertar ya existe. ZERO_DIVIDE: Intento de divisin por cero.

Ejemplos: Se desea mantener la informacin de los socios del videoClub Patito, aunque estos se den de baja, para lo que se crea una tabla SOCIO_BAJA, que contiene los datos de socio y la fecha de baja y que se actualizar cada vez que se borre un socio. Considere el siguiente cdigo: CREATE TABLE SOCIO( IFE CHAR(13) NOT NULL, nombreSocio CHAR(40) NOT NULL, direccion CHAR(50) NOT NULL, telefono CHAR(13) NOT NULL,

Manual de Oracle
CONSTRAINT PK_SOCIOBAJA PRIMARY KEY (IFE) ); CREATE TABLE SOCIO_BAJA ( IFE CHAR(13) NOT NULL, nombreSocio CHAR(40) NOT NULL, direccion CHAR(50) NOT NULL, telefono CHAR(13) NOT NULL, FECHA_BAJA DATE, CONSTRAINT PK_BAJA PRIMARY KEY (IFE) ); Disparador CREATE OR REPLACE TRIGGER DIS_SOCIO AFTER DELETE ON SOCIO FOR EACH ROW BEGIN INSERT INTO Socio_Baja VALUES (:OLD.IFE, :OLD.nombreSocio, :OLD.direccion, :OLD.telefono, SYSDATE); END;

Ejemplo De la tabla empleado considere que el mximo salario posible es de $30,000 y el mnimo de $3,000 mensuales. Cualquier valor fuera de este rango deber ajustarse a estos lmites.
EMPLEADO CREATE TABLE EMPLEADO( IDEMPLEADO NUMBER(3) NOT NULL, RFC CHAR(14), NOMBREEMPLEADO CHAR(40) NOT NULL, OFICIO CHAR(11) NOT NULL, CARGO CHAR(9) NOT NULL, JEFE NUMBER(3), INGRESO DATE NOT NULL, SALARIO NUMBER(10,2), COMISION NUMBER(10,2),

Manual de Oracle
CONSTRAINT DOM_EMPLEADO_SALARIO CHECK ( salario > 0 ), CONSTRAINT PK_EMPLEADO PRIMARY KEY (idEmpleado), CONSTRAINT AK_EMPLEADO UNIQUE (rfc), CONSTRAINT FK_EMPLEADO_JEFE FOREIGN KEY (jefe) REFERENCES Empleado(IDEMPLEADO), CONSTRAINT DOM_EMPLEADO_NOMBREEMPLEADO CHECK (nombreEmpleado = NLS_UPPER(nombreEmpleado)) ); DISPARADOR CREATE OR REPLACE TRIGGER DIS_EMPLEADO Before INSERT OR UPDATE OF SALARIO ON EMPLEADO FOR EACH ROW WHEN ((new.salario < 3000) OR (new.salario > 30000)) BEGIN IF (:new.salario < 3000) THEN :new.salario := 3000; END IF; IF (:new.salario > 30000) THEN :new.salario := 30000; END IF; END;

Compilado Triggers El funcionamiento de un trigger deja de estar ENABLE si dependen de Procedimientos almacenados o funcin en el cuerpo del disparador y este es modificado. Los disparadores DISABLE por razones de dependencia son recompilado en la prxima invocacin. Es posible que pueda examinar las ALL_DEPENDENCIES para ver las dependencias de un disparador. Por ejemplo, la siguiente declaracin
SELECT NAME, REFERENCED_OWNER, REFERENCED_NAME, REFERENCED_TYPE FROM ALL_DEPENDENCIES WHERE OWNER = 'EPACHECO'

Creacin de atributos autoincrement en Oracle

Manual de Oracle
En muchos casos es til poseer campos autoincrementales en una base de datos. Algunos gestores de bases de datos permiten hacer esto de forma automtica mediante AUTOINCREMENT, IDENTITY, etc. pero Oracle no posee esta caracterstica. A continuacin se mostrar cmo hacerlo para crear un campo numrico que incremente su valor automticamente. Vamos a crear una tabla a modo de ejemplo llamada usuarios la cual va a almacenar cierta informacin. Esta tabla tendr una clave primaria (idUsr) la cual ser autoincrementada automticamente. Creacin de tabla usuarios CREATE TABLE Usuario( idUsr NUMBER PRIMARY KEY, NomUsrVARCHAR2(60) NOT NULL, DomUsrVARCHAR(60), FecNac DATE ); Como podemos comprobar, la creacin de la tabla usuario no tiene ningn elemento diferenciador ni hay ningn indicio que va a contener un campo auto numrico.

Creacin de la secuencia Para simular esta funcionalidad en Oracle debemos crear una secuencia, la cual poseer las siguientes caractersticas bsicas: nombre valor de inicio valor de fin (valor mximo) incremento. CREATE SEQUENCE seq_usuarios_idusuario --nombre de la secuencia START WITH 1 --la secuencia empieza por 1 INCREMENT BY 1 --se incrementa de uno en uno NOMAXVALUE; --no tiene valor maximo Con la secuencia creada, podemos obtener su valor actual llamando a la funcin nextval indicando nombreDeSecuencia.nextval. SELECT seq_usuarios_idusuario.nextval FROM dual;

Manual de Oracle
Con este select obtenemos un nuevo valor de la secuencia. Una vez que sta da un valor, no lo volver a ofrecer ms. Si queremos consultar el valor por el que se encuentra actualmente la secuencia, lo podemos hacer mediante currval. SELECT seq_usuarios_idusuario.currval FROM dual; Ya tenemos la secuencia que genera nmeros de forma continua, ahora necesitamos algn mtodo para aadir estos valores a la clave primaria de la tabla creada anteriormente. Es cierto que siempre podemos usar nextval en un insert de forma: INSERT INTO usuario(idUsr, NomUsr) VALUES(seq_usuarios_idusuario.nextval, Juan Perez); Pero quiz sea mejor buscar una forma automtica de hacer esta insercin. Para ello, usaremos un disparador o trigger. Creacin del disparador Para que este proceso se realice automticamente debemos crear un disparador tal y como vemos a continuacin. CREATE TRIGGER trig_usuarios_seq BEFORE INSERT ON usuario FOR EACH ROW BEGIN SELECT seq_usuarios_idusuario.nextval INTO :new.idUSR FROM dual; END ; El cual, antes de realizar cualquier insercin en la tabla usuarios, asignar el nextval de nuestra secuencia al nuevo valor del campo id, con lo cual, posteriormente, se realizar el insert con el id generado automticamente. De esta forma, en el insert anterior, podemos obviar la insercin de la clave primaria sin obtener ningn error.

You might also like