Está en la página 1de 9

Procedimientos y Funciones.

• Oracle permite acceder y manipular información de la base de datos definiendo


objetos procedurales (subprogramas) que se almacenan en la base de datos. Estos
objetos procedurales son unidades de programa PL/SQL: Funciones y
Procedimientos almacenados.

• Los procedimientos o funciones son bloques PL/SQL con nombre, que pueden
recibir parámetros y pueden ser invocados desde distintos entornos: SQL*PLUS,
Oracle * Forms, desde otros procedimientos y funciones y desde otras herramientas
Oracle y aplicaciones.

• Los procedimientos y funciones llevan a cabo tareas específicas, y su mayor


diferencia radica en que las funciones devuelven un valor
Sintaxis

Sintaxis Procedimientos

CREATE [OR REPLACE} PROCEDURE [esquema].nombre-procedimiento


(nombre-parámetro {IN | OUT | IN OUT} tipo de dato, ..) {IS | AS}
Declaración de variables;
Declaración de constantes;
Declaración de cursores;
BEGIN
Cuerpo del subprograma PL/SQL;
EXCEPTION
Bloque de excepciones PL/SQL;
END;

Sintaxis Funciones

CREATE [OR REPLACE] FUNCTION [esquema].nombre-función


(nombre-parámetro {IN | OUT | IN OUT} tipo-de-dato, ...)
RETURN tipo-de-dato {IS | AS}
Declaración de variables;
Declaración de constantes;
Declaración de cursores;
BEGIN
Cuerpo del subprograma PL/SQL;
EXCEPTION
Bloque de excepciones PL/SQL;
END;
Descripción de la sintaxis:

• Nombre-parámetro: es el nombre que queramos dar al parámetro. Podemos


utilizar múltiples parámetros. En caso de no necesitarlos, podemos omitir los
paréntesis.

• IN: especifica que el parámetro es de entrada y que, por tanto, dicho parámetro
tiene que tener un valor en el momento de llamar a la función o procedimiento. Si
no se especifica nada, los parámetros son por defecto de tipo entrada.

• OUT: especifica que se trata de un parámetro de salida. Son parámetros cuyo


valor es devuelto después de la ejecución el procedimiento al bloque PL/SQL que
lo llamó. Las funciones PLSQL no admiten parámetros de salida.

• IN OUT: Son parámetros de entrada y salida a la vez.

• Tipo-de-dato: Indica el tipo de dato PLSQL que corresponde al parámetro


(NUMBER, VARCHAR2, etc.).

Concepto y Ejemplo de Disparadores (Triggers) en Oracle

Concepto

Un disparador define una acción que la base de datos debe llevar a cabo cuando
se produce algún suceso relacionado con la misma. Los disparadores (triggers)
pueden utilizarse para completar la integridad referencial, también para imponer
reglas de negocio complejas o para auditar cambios en los datos. El código
contenido en un disparador, denominado cuerpo del disparador, está formado por
bloques PL/SQL. La ejecución de disparadores es transparente al usuario.

Para crear un disparador (trigger) en una tabla, el usuario con el que accedamos a
Oracle deberá ser propietario de la misma, teniendo así el privilegio ALTER para la
tabla ó ALTER ANY TABLE. Además, dicho usuario, debe disponer del privilegio
CREATE TRIGGER.

Tipos

Existen varios tipos de disparadores, dependiendo del tipo de transacción de


disparo y el nivel en el que se ejecuta el disparador (trigger):

1. Disparadores de nivel de fila: se ejecutan una vez para cada fila afectada por
una instrucción DML. Los disparadores de nivel de fila se crean utilizando la
cláusula for each row en el comando create trigger.

2. Disparadores de nivel de instrucción: se ejecutan una vez para cada


intrucción DML. Por ejemplo, si una única intrucción INSERT inserta 500 filas
en una tabla un disparador de nivel de instrucción para dicha tabla sólo se
ejecutará una vez. Los disparadores de nivel de instrucción son el tipo
predeterminado que se crea con el comando create trigger.

3. Disparadores Before y After: puesto que los disparadores son ejecutados por
sucesos, puede establecerse que se produzcan inmediatamente antes
(before) o después (after) de dichos sucesos.

4. Disparadores Instead Of: puede utilizar INSTEAD OF para indicar a Oracle


lo que tiene que hacer en lugar de realizar las acciones que invoca el
disparador. Por ejemplo, podría usar un disparador INSTEAD OF en una vista
para gestionar las inserciones en una tabla o para actualizar múltiples tablas
que son parte de una vista.

5. Disparadores de esquema: puede crear disparadores sobre operaciones en


el nivel de esquema tales como create table, alter table, drop table, audit,
rename, truncate y revoke. Puede incluso crear disparadores para impedir
que los usuarios eliminen sus propias tablas. En su mayor parte, los
disparadores de nivel de esquema proporcionan dos capacidades: impedir
operaciones DDL y proporcionar una seguridad adicional que controle las
operaciones DDL cuando éstar se producen.

6. Disparadores en nivel de base de datos: puede crear disparadores que se


activen al producirse sucesos de la base de datos, incluyendo errores, inicios
de sesión, conexiones y desconexiones. Puede utilizar este tipo de
disparador para automatizar el mantenimiento de la base de datos o las
acciones de auditoría.

Ejemplo de Triggers

En primer lugar, abriremos la Consola de Oracle Enterprise Manager:

Imagen 1.1 Abriendo el programa


seleccionaremos "Iniciar en Modo Autónomo" y pulsaremos en "Aceptar":

Imagen 1.2 inicio de la base de datos


Seleccionaremos la Base de Datos del árbol e
introduciremos un usuario y contraseña con
permisos suficientes para crear trigger en la tabla
de ejemplo (en nuestro caso accederemos como
"system"):

Imagen 1.3 acceso del usuario


En el árbol accederemos a "Esquema" y a
continuación seleccionaremos el usuario
propietario de la tabla en la que crearemos el
trigger, en nuestro caso "ALONSO". Después
pulsaremos en "Tablas", seleccionemos la
tabla a la que queramos aplicarle el
disparador y, sobre la carpeta "Disparadores"
pulsaremos con el botón derecho del ratón,
nos aparecerá un menú emergente,
pulsaremos "Crear...":
Imagen 1.4 creación de la base de datos

En "Nombre" introduciremos el nombre del


disparador y en "Cuerpo del Disparador"
introduciremos el código PL/SQL que queramos que
se ejecute, en nuestro caso queremos que el
disparador añada un registro otra tabla llamada
"resultadodisparador" cuando el valor que introduzca
el usuario en el campo CAMPO2 de la tabla PRUEBA
(después de insertar una nueva fila) sea superior a
1000:

En la pestaña "Evento" de la ventana de "Crear


Disparador" marcaremos "Disparador en Tabla",
marcaremos "Después" y marcaremos también en
Imagen 1.5 creación de trigger
"Arrancar Disparador:" "Insertar":

Pulsaremos en "Crear" y, si no ha habido errores el el


código PL/SQL nos aparecerá un mensaje como este
"Disparador se ha creado correctamente":

Nota: también se pueden crear disparadores sin


necesidad de utilizar la interfaz gráfica (Consola de
Oracle Enterprise Manager). Se pueden crear mediante
SQL. La consulta SQL que crea el disparador anterior
es la siguiente:

Imagen 1.6 Confirmación de


trigger
CREATE OR REPLACE TRIGGER
"ALONSO"."INSERCIONNUMEROMAYOR1000" AFTER
INSERT ON "ALONSO"."PRUEBA" FOR EACH ROW WHEN (new.CAMPO2 >
1000)
BEGIN
insert into resultadodisparador (fecha, aviso, tabla)
values
(Sysdate, 'Registro con CAMPO2 superior a 1000',
'PRUEBA');
END;

Con este disparador, cuando un usuario inserte un registro en la tabla PRUEBA


cuyo CAMPO2 tenga un valor superior a 1000 se insertará automáticamente
(transparente para el usuario) otro registro en la tabla "resultadodisparador" con la
fecha de la inserción (sysdate), el aviso "Registro con CAMPO2 superior a 1000" y
el nombre de la tabla origen del disparador "PRUEBA".

Obviamente, para que este disparador funcione correctamente deberán existir las
tablas PRUEBA (origen del disparador) y "resultadodisparador" (donde se insertará
el registro si se cumple la condición CAMPO2 > 1000.

La consulta SQL necesaria para crear la tabla "PRUEBA":

CREATE TABLE "ALONSO"."PRUEBA" ("CAMPO1" VARCHAR2(10) NOT NULL,


"CAMPO2" NUMBER)

La consulta SQL necesaria para crear la tabla "resultadodisparador":

CREATE TABLE "ALONSO"."RESULTADODISPARADOR" ("FECHA" DATE NOT


NULL, "AVISO" VARCHAR2(100) NOT NULL,"TABLA" VARCHAR2(50)NOT NULL)

En nuestro ejemplo estamos trabajando en todo momento utilizando el usuario


ALONSO para la creación del disparador y de las tablas, puesto que es el propietario
de dichos objetos.

Vistas

Una vista es una consulta, que refleja el contenido de una o más tablas, desde la
que se puede acceder a los datos como si fuera una tabla.

Dos son las principales razones por las que podemos crear vistas.

Seguridad, nos pueden interesar que los usuarios tengan acceso a una parte de la
información que hay en una tabla, pero no a toda la tabla.
Comodidad, como hemos dicho el modelo relacional no es el más comodo para
visualizar los datos, lo que nos puede llevar a tener que escribir complejas
sentencias SQL, tener una vista nos simplifica esta tarea.
Las vistas no tienen una copia física de los datos, son consultas a los datos que hay
en las tablas, por lo que, si actualizamos los datos de una vista, estamos
actualizando realmente la tabla, y si actualizamos la tabla estos cambios serán
visibles desde la vista.

Ejemplo

El ejemplo en este tema muestra cómo crear una vista simple en Oracle para
restringir el acceso del usuario a columnas específicas. El ejemplo se basa en una
tabla con la siguiente definición:

CREATE TABLE employees (emp_id number(38) unique not null, name varchar2
(32), department number not null, hire_date date not null);

Otorgar privilegios en la tabla

Si el usuario que crea la vista no es el propietario de la tabla o las tablas en las que
se basa la vista, el propietario de la tabla debe otorgarle al creador de la vista como
mínimo el privilegio de selección en la tabla. Si el propietario de la vista necesita
otorgar privilegios en la vista a otros usuarios, el propietario de la tabla debe otorgar
al propietario de la vista la capacidad para otorgar privilegios en la tabla a otros
usuarios.

En este ejemplo, la tabla en la que se basa la vista (empleados) pertenece al usuario


gdb. El usuario que crea la vista es el usuario rocket. Además, el usuario rocket
otorgará privilegios en la vista a otros usuarios. Por lo tanto, el usuario gdb debe
otorgar al usuario rocket el privilegio de selección en la tabla de empleados e incluir
WITH GRANT OPTION para que el usuario rocket pueda otorgar a otros usuarios
los privilegios SELECT en la vista.

conn gdb/gdb.bdg
GRANT SELECT
ON gdb.employees
TO rocket WITH GRANT OPTION;

Crear una vista

En este ejemplo, el usuario rocket crea una vista en la tabla de empleados para
restringir el acceso solo a aquellos registros en los que el departamento es 201:

CREATE VIEW view_dept_201


AS (SELECT emp_id,name,department,hire_date)
FROM gdb.employees
WHERE department = 201;
Otorgar privilegios en la vista

Puede otorgar privilegios en la vista a usuarios específicos sin tener que otorgarle
a estos usuarios acceso a la tabla base (empleados). En este ejemplo, al usuario
mgr200 se le otorgan privilegios SELECT en la vista, view_dept_201:

conn rocket/nopeeking
GRANT SELECT
ON rocket.view_dept_201
TO mgr200;

Probar privilegios

Inicie sesión como mgr200 y seleccione registros en view_dept_201:

conn mgr200/topsecret
SELECT * FROM rocket.view_dept_201;

EMP_ID NAME DEPT HIRE_DATE


112 LOLLI POP 201 06/30/2007
134 VAN CHIN 201 10/15/2007
150 DON GUN 201 03/01/2009

Como se esperaba, sólo se devuelven los registros para los empleados en el


departamento 201.

Replicación.

La replicación de datos es un procedimiento que consiste en copiar datos de un


dispositivo de almacenamiento primario a un dispositivo secundario o de copia de
seguridad. Si el dispositivo primario falla, los datos están disponibles en el
secundario. La replicación de datos asegura alta disponibilidad y tolerancia ante
errores graves del clúster.

La replicación permite tener una copia exacta de una base de datos alojada en un
servidor (maestro) que se guardará en otro servidor (esclavo). Todas las
modificaciones que se hagan en la base de datos del servidor maestro se
actualizarán inmediatamente en el servidor esclavo. Esto no es una copia de
seguridad, ya que, si borramos una fila en la base de datos maestra, también se
borrará en la base de datos esclava.

Ejemplo:

Este procedimiento presupone que los discos especificados están disponibles para
la creación de réplicas de la base de datos. Sustituya sus propios nombres de disco
en este procedimiento.
Cree las réplicas de la base de datos de estado en ambos nodos.

Cree tres réplicas en cada uno de los dos discos internos.

phys-X# metadb -af -c 3 c0t0d0s7


phys-X# metadb -a -c 3 c0t1d0s7

Compruebe las réplicas en ambos nodos.

phys-X# metadb
flags first blk block count
a u 16 8192 /dev/dsk/c0t0d0s7
a u 8208 8192 /dev/dsk/c0t0d0s7
a u 16400 8192 /dev/dsk/c0t0d0s7
a u 16 8192 /dev/dsk/c0t1d0s7
a u 8208 8192 /dev/dsk/c0t1d0s7
a u 16400 8192 /dev/dsk/c0t1d0s7

Espejos

Se conoce como copia espejo (en inglés data mirroring) al procedimiento de


protección de datos y de acceso a los mismos en los equipos informáticos
implementado en la tecnología de RAID1.

Consiste en la idea básica de tener dos discos duros conectados. Uno es el principal
y en el segundo se guarda la copia exacta del principal, almacenando cualquier
cambio que se haga en tiempo real en las particiones, directorios, etc, creando
imágenes exactas, etc.

De esta forma se consigue tener 2 discos duros idénticos y que permiten, si todo
está bien configurado, que ante el fallo del disco principal, el secundario tome el
relevo, impidiendo la caída del sistema y la pérdida de los datos almacenados.

Beneficios del espejeo

Además de proporcionar una copia adicional de los datos con el fin de redundancia
en caso de fallo de hardware, la duplicación de disco puede permitir que cada disco
se acceda por separado para los propósitos de lectura. En determinadas
circunstancias esto puede mejorar significativamente el rendimiento ya que el
sistema puede elegir para cada lectura que disco puede buscar más rápidamente a
los datos requeridos. Esto es especialmente importante cuando hay varias tareas
que compiten por los datos en el mismo disco, y el "trashing" (donde el cambio entre
tareas ocupa más tiempo que la tarea en sí) se puede reducir. Esta es una
consideración importante en las configuraciones de hardware que frecuentemente
tienen acceso a los datos en el disco.
En algunas implementaciones, el disco reflejado se puede dividir fuera y se utiliza
para la copia de seguridad de datos, permitiendo que el primer disco para
permanecer activos. Sin embargo, la fusión de los dos discos se puede requerir un
período de sincronización en su caso escribir la actividad I/O ha ocurrido con el
disco duplicado.

Creación de espacios de disco con espejo

Una vez preparados los discos, para crear el RAID, y si hemos seguido la misma
estructura de mi ejemplo, usaremos las siguientes órdenes, suponiendo que los
discos nos los ha identificado como sda, sdb, sdc y sdd:

mdadm --create --level=raid1 --raid-devices=2 /dev/sda1 /dev/sdb1 /dev/sdc1


/dev/sdd1

mdadm --create --level=raid5 --raid-devices=4 /dev/sda3 /dev/sdb3 /dev/sdc3


/dev/sdd3

La primera orden nos creará un RAID de tipo RAID1 con sólo 2 componentes
activos, empleando para ello la primera partición de cada disco. Como le indicamos
menos dispositivos de raid (2) que dispositivos físicos, lo que hace es poner los
otros dos como spares.

La segunda orden nos creará un RAID5 con la tercera partición de todos los discos
indicados. En este caso, el parámetro --raid-devices=4 es superfluo y se podría
omitir, ya que si no decimos nada sobreentiende que queremos usar todos los
discos.

Referencias

ArcMap (2017) Ejemplo: crear una vista de base de datos en Oracle con SQL (2012)
recuperado http://desktop.arcgis.com/es/arcmap/10.3/manage-data/using-sql-with-
gdbs/example-creating-a-view-in-oracle-with
sql.htm#ESRI_SECTION1_CD24F90D9BC547588892E531846AB5A7

Oracle(2017) Métodos de replicación de datos (2010) recuperado


https://docs.oracle.com/cd/E22734_01/html/821-2812/datarep.html

Oracle (2017) Comprensión de la replicación de datos(2010) recuperado


https://docs.oracle.com/cd/E22734_01/html/821-2812/gbhpl.html

Santana Macías Jesús Daniel (2017) Espejeo y Replicación (2012) recuperado


http://dan1456bd.blogspot.mx/p/espejeo.html

También podría gustarte