Está en la página 1de 9

Ing.

Mara Elena Valle Duarte

Oracle PL/Sql Funciones Sintaxis bsica de una funcin


create o replace function NOMBREFUNCION(PARAMETRO1 TIPODATO, PARAMETRON TIPODATO) return TIPODEDATO is DECLARACION DE VARIABLES begin ACCIONES; return VALOR; end; ejemplo.

La siguiente funcin recibe dos valores numricos como parmetros y retorna el promedio:
create or replace function f_promedio (avalor1 number, avalor2 number) return number is begin return (avalor1+avalor2)/2; end;

La siguiente funcin recibe un parmetro de tipo numrico y retorna una cadena de caracteres. Se define una variable en la zona de definicin de variables denominada "valorretornado" de tipo varchar. En el cuerpo de la funcin empleamos una estructura condicional (if) para averiguar si el valor enviado como argumento es menor o igual a 20, si lo es, almacenamos en la variable "valorretornado" la cadena "economico", en caso contrario guardamos en tal variable la cadena "costoso"; al finalizar la estructura condicional retornamos la variable "valorretornado":
create or replace function f_costoso (avalor number) return varchar is valorretornado varchar(20); begin valorretornado:=''; if avalor<=20 then valorretornado:='economico'; else valorretornado:='costoso'; end if; return valorretornado; end;

Ing. Mara Elena Valle Duarte

Procedimientos Almacenados Estructura que debe llevar un procedimiento


DECLARE
//Seccin declarativa: variables, tipos, y subprogramas //de uso local

BEGIN
//Seccin ejecutable: las instrucciones procedimentales, y de SQL //aparecen aqu. Es la nica seccin obligatoria en el bloque.

EXCEPTION
//Seccin de manejo de excepciones. Las rutinas de manejo de errores //aparecen aqu

END;
Solo se requiere que aparezca la seccin ejecutable. Lo dems es opcional. Las nicas instrucciones SQL permitidas en un bloque PL/SQL son INSERT, UPDATE, DELETE y SELECT, adems de algunas instrucciones para manipulacin de datos, e instrucciones para control de transacciones. Otras instrucciones de SQL como DROP, CREATE o ALTER no son permitidas. Se permite el uso de comentarios estilo C (/* . . .*/). PL/SQL no es case sensitiva por lo que no hay distincin entre nombres con maysculas y minsculas. Ahora veamos un ejemplo detallado En la seccin de declaraciones, se indican las variables que sern usadas dentro del bloque y sus tipos. Por ejemplo:

DECLARE myBeer VARCHAR(20); price NUMBER(6,2);


En algunos casos, es posible que se desee que el tipo de una variable coincida con el tipo usado para una columna de una tabla determinada, en esos casos se puede usar la construccin:

DECLARE myBeer Beers.name%TYPE;


Con lo cual se logra que la variable myBeer tenga el mismo tipo que la columna name de la tabla Beers. Tambien es posible inicializar las variables, mediante el operador :=. Ademas, mediante el uso del mismo operador es posible hacer asignaciones en el cuerpo del programa. Por ejemplo:

DECLARE price NUMBER := 300; BEGIN price := price + 150; END;


La ejecucin de este bloque no tendr ningn efecto, ya que no se estn haciendo cambios sobre la base de datos. Adems es posible usar sentencias condicionales y ciclos dentro de los bloques de PL/SQL. Una sentencia condicional tpica es de la forma:

IF (condicin) THEN (lista de acciones) ELSE (lista de acciones) END IF;


Si se desea, se puede hacer el uso de varios casos de condicin, mediante el uso de:

IF . . . THEN . . . ELSIF . . . THEN . . . ELSIF . . . THEN . . .

Ing. Mara Elena Valle Duarte

. . . ELSE . . . END IF;


En ambos casos, la clausula ELSE es opcional. Si se desea crear un lazo, se puede usar la instruccin:

LOOP lista_de_instrucciones END LOOP;


Al menos alguna de las instrucciones debe ser:

EXIT WHEN condicion;


De esta manera, el lazo terminar cuando la condicin sea verdadera. Adems es posible utilizar la instruccin:

WHILE (condicion) LOOP lista_de_instrucciones END LOOP; FOR i IN a..b LOOP lista_de_instrucciones END LOOP;

ejemplo concreto de Procedimiento


SQL> CREATE PROCEDURE credit (acc_no IN NUMBER, mar IN NUMBER) 1> AS BEGIN 2> UPDATE accounts 3> SET balance = balance + mar 4> WHERE account_id = acc_no; 5> END;
Este procedimiento actualizar la(s) tupla(s) con nmero de cuenta igual al parmetro acc_no con un incremento de mar en el balance de dicha cuenta. Si se desea eliminar (borrar) un procedimiento almacenado, se usa la instruccin:

SQL> DROP PROCEDURE name;

declaracin de un curso

Ing. Mara Elena Valle Duarte

Estructura Ejemplo

Ejemplo utilizando for,


PROCEDURE VENTAS5 (xfecha DATE) is BEGIN DECLARE CURSOR cventas (cfecha DATE) IS SELECT articulo,valor FROM ventas WHERE fecha=cfecha ORDER BY valor DESC; xarticulo ventas.articulo%TYPE; xvalor ventas.valor%TYPE; BEGIN OPEN cventas(xfecha); FOR i IN 1..5 LOOP FETCH cventas INTO xarticulo,xvalor; EXIT WHEN cventas%NOTFOUND; INSERT INTO ventamayor VALUES (xfecha,xarticulo,xvalor); COMMIT; END LOOP; CLOSE cventas; END; END;

Para llamar al procedimiento ventas5 en una fecha dada, se puede escribir, por ejemplo: ventas5(to_date('15/11/95','DD/MM/YY') o ventas5(sysdate).

Ing. Mara Elena Valle Duarte

A continuacin detallaremos las sentencias usadas en este procedimiento: DECLARE cursor Define el cursor, su consulta y la lista de parmetros que se pasan a la orden WHERE, es solo la declaracin del cursor y no la realizacin de la consulta.

xarticulo ventas.articulo%TYPE; Define la variable xarticulo igual a la columna artculo de la tabla ventas, que con el uso del atributo de variable %TYPE permite declarar una variable del mismo tipo que una columna de la tabla. No es necesario conocer cmo est definida esa columna en la tabla y, en caso que la definicin de la columna sea modificada, automticamente se cambia la variable xarticulo. OPEN cventas(xfecha); Realiza la consulta asociada al cursor, pasando el valor del parmetro y guardando sus resultados en un rea de la memoria, desde la cual, posteriormente, se pueden leer estas filas. FOR i IN 1..5 LOOP Ciclo numrico de repeticin para poder consultar las 5 primeras ventas devueltas por el cursor. FETCH cventas INTO xarticulo,xvalor;

Ing. Mara Elena Valle Duarte

Lee la siguiente fila de de datos del cursor cventas y pasa los datos de la consulta a las variables xarticulo y xvalor. EXIT WHEN cventas%NOTFOUND; Garantiza la salida del ciclo antes de las ltima repeticin, en caso que para una fecha dada se hayan efectuado menos de 5 ventas, ya que en esta situacin la consulta del cursor devuelve menos de 5 filas. %NOTFOUND es un atributo de cursor que es verdadero cuando la ltima sentencia FETCH no devuelve ninguna fila. INSERT INTO ventamayor VALUES(xfecha,xarticulo,xvalor); Insertar en la tabla ventamayor los valores ledos desde el cursor. COMMIT; Actualizacin de la tabla ventamayor. END LOOP; Fin del ciclo. CLOSE cventas; Cierra el cursor, eliminado sus datos del rea de memoria.

Trigers

Ing. Mara Elena Valle Duarte

Orden de ejecucin de los triggers Una misma tabla puede tener varios triggers. En tal caso es necesario conocer el orden en el que se van a ejecutar. Los disparadores se activan al ejecutarse la sentencia SQL.
y y

Si existe, se ejecuta el disparador de tipo BEFORE (disparador previo) con nivel de orden. Para cada fila a la que afecte la orden: o Se ejecuta si existe, el disparador de tipo BEFORE con nivel de fila. o Se ejecuta la propia orden. o Se ejecuta si existe, el disparador de tipo AFTER (disparador posterior) con nivel de fila. Se ejecuta, si existe, el disparador de tipo AFTER con nivel de orden.

Restricciones de los triggers El cuerpo de un trigger es un bloque PL/SQL. Cualquier orden que sea legal en un bloque PL/SQL, es legal en el cuerpo de un disparador, con las siguientes restricciones:
y

y y

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. Por razones idnticas, ningn procedimiento o funcin llamado por el disparador puede emitir rdenes de control de transacciones. El cuerpo del disparador no puede contener ninguna declaracin de variables LONG o LONG RAW

Un trigger es una clase especial de procedimiento almacenado. Trigger significa disparador, es decir, es un procedimiento almacenado que se ejecuta cuando sucede un evento especfico, tal como una instruccin insert, update o un delete. Un Trigger sirve para mantener la integridad y la coherencia de nuestra informacin de manera independiente a la aplicacin.

Ing. Mara Elena Valle Duarte

Sintaxis
CREATE TRIGGER [owner.]trigger_name ON [owner.]table_name FOR {INSERT | UPDATE | DELETE} [,{INSERT | UPDATE | DELETE}...]

AS SQL_statements |
IF UPDATE (column_name) [{AND | OR} UPDATE (column_name)...]

Ejempo concreto de trigers

Este ejemplo imprime un mensaje cada vez que el usuario aade o modifica datos en la tabla "Titulos" create trigger reminder on Titulos for insert, update as print "No olvides imprimir el informe de contabilidad"

ejemplo 2

muestra un trigger que inserta un registro en la tabla PRECIOS_PRODUCTOS cada vez que insertamos un nuevo registro en la tabla PRODUTOS:
CREATE OR REPLACE TRIGGER TR_PRODUCTOS_01 AFTER INSERT ON PRODUCTOS FOR EACH ROW DECLARE

Ing. Mara Elena Valle Duarte


-- local variables BEGIN INSERT INTO PRECIOS_PRODUCTOS (CO_PRODUCTO,PRECIO,FX_ACTUALIZACION) VALUES (:NEW.CO_PRODUCTO,100,SYSDATE); END ;

El trigger se ejecutar cuando sobre la tabla PRODUCTOS se ejecute una sentencia INSERT.
INSERT INTO PRODUCTOS (CO_PRODUCTO, DESCRIPCION) VALUES ('000100','PRODUCTO 000100');

También podría gustarte