Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Oracle PL
Oracle PL
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;
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:
WHILE (condicion) LOOP lista_de_instrucciones END LOOP; FOR i IN a..b LOOP lista_de_instrucciones END LOOP;
declaracin de un curso
Estructura Ejemplo
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).
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;
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
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.
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)...]
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
El trigger se ejecutar cuando sobre la tabla PRODUCTOS se ejecute una sentencia INSERT.
INSERT INTO PRODUCTOS (CO_PRODUCTO, DESCRIPCION) VALUES ('000100','PRODUCTO 000100');