Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Creación de Funciones
Las funciones son bloques de código de PL/SQL con las
siguientes características:
• Es un tipo de bloque PL/SQL que retorna un valor.
• Es almacenado en la DB como un objeto de schema que
puede ser ejecutado repetidamente.
• Es llamado como parte de una expresión o utilizado como
un valor de parámetro.
3
Ejemplo de Función
No debemos olvidar que las funciones retornan valores, en este caso el valor
retornado es de tipo “NUMBER”. La invocación de la función es utilizada dentro
de la sentencia dbms_output.put_line que va a mostrar como salida el valor de la
misma.
4
Las funciones definidas por el usuario son utilizadas por cada fila
que retorne una consulta de SQL y pueden ser encontradas en:
A) Ser almacenadas en la DB
B) Aceptan solamente parámetros "IN" con tipos de datos de
SQL válidos.
C) Retornan tipos de datos válidos de SQL, no tipos
específicos de PL/SQL.
Eliminar funciones de la DB
Se puede utilizar la siguiente sentencia para eliminar una
función almacenada en la DB.
Procedimientos vs Funciones
Procedimientos Funciones
Es ejecutado como una Invocada como parte de una
sentencia PL/SQL expresión
Otorgar privilegio:
Revocar el privilegio:
Creación de Packages
Los packages de PL/SQL son unidades de programación que:
Consiste en 2 partes:
1.Una especificación (Specification).
2.Un cuerpo (body).
Componentes de un Package
El package contiene 2 tipos de secciones, el “specification” es público y
es visto por todos los que tienen acceso al package, y el privado es
propietario solamente del package. Veamos la Imagen…
18
El package body "comm_pkg" incluye una función privada llamada "validate" que
verifica que la comisión sea válida.
La validación requiere que la comisión sea positiva y menor que la mayor comisión
que exista en la tabla employees.
El primer ejemplo crea un specification de un package con varias constantes para convertir
tasas. El package body no es necesario en este caso para soportar la especificación del
package.
En el tercer caso, se crea una función denominada "mtr2yrd" que realiza una conversión, y
utiliza la constante "meter_2_yard" que es declarada en el package "global_consts" La función
es invocada en el parámetro de DBMS_OUTPUT.PUT_LINE.
25
Dropear un Package
BEGIN
-- Dynamic SQL statement en un variable
v_stmt_str := 'SELECT * FROM employees WHERE job_id = ‘’’ST_MARK’’';
-- Close cursor:
CLOSE v_emp_cursor;
END;
/
30
sql_stmt VARCHAR2(200);
plsql_block VARCHAR2(500);
emp_id NUMBER(4) := 7566;
dept_id NUMBER(2) := 50;
dept_name VARCHAR2(14) := 'PERSONNEL';
location VARCHAR2(13) := 'DALLAS';
emp_rec emp%ROWTYPE;
BEGIN
-- DML Insert
sql_stmt := 'INSERT INTO dept VALUES (:1, :2, :3)';
EXECUTE IMMEDIATE sql_stmt USING dept_id, dept_name, location;
-- DML Select
sql_stmt := 'SELECT * FROM emp WHERE empno = :id';
EXECUTE IMMEDIATE sql_stmt INTO emp_rec USING emp_id;
-- PLSQL Call
plsql_block := 'BEGIN emp_pkg.raise_salary(:id, :amt); END;';
EXECUTE IMMEDIATE plsql_block USING 7788, 500;
END;
/
31
BEGIN
EXECUTE IMMEDIATE 'create table employees (salario NUMBER)';
EXECUTE IMMEDIATE 'drop table employees';
EXECUTE IMMEDIATE 'create table employees (apellido VARCHAR2(10))';
END;
-- DML Delete con una condición
CREATE OR REPLACE PROCEDURE delete_rows (
table_name IN VARCHAR2,
condition IN VARCHAR2 DEFAULT NULL) AS
where_clause VARCHAR2(100) := ' WHERE ' || condition;
BEGIN
IF condition IS NULL THEN
where_clause := NULL;
END IF;
EXECUTE IMMEDIATE 'DELETE FROM ' || table_name || where_clause;
END;
/
32
AUTONOMOUS TRANSACTIONS
Son transacciones independientes que comienzan por una transacción "principal“.
Triggers
1. Es un bloque de PL/SQL o un procedure PL/SQL asociado a una tabla, vista,
schema o base de datos.
3. Pueden ser:
A)Triggers de Aplicación: Son ejecutados cuando un evento ocurre en una
aplicación en particular.
B) Triggers de Base de Datos: Son ejecutados cuando un evento de
información (Por ejemplo cuando ocurre una sentencia DML) o evento de
sistemas (como loguearse o apagar una DB).
Triggers
Diseñamos triggers para:
Ejecutar acciones relacionadas.
Centralizar operaciones globales.
A) El trigger "sentencia“ :
B) El trigger "fila“ :
- Se ejecuta una vez por cada fila afectada al evento del mismo.
- No se ejecuta si el evento del trigger no afecta a ninguna fila.
- Es indicado especificando la cláusula "FOR EACH ROW".
38
Sincronización de Triggers
Podemos crear un trigger de tipo "BEFORE" fila, para prevenir que una operación pueda ser éxitosa si una
condición en particular es violada.
En el ejemplo anterior, el trigger es creado para no permitir a ciertos empleados ganar un salario mayor a
$15000. Si se ejecuta el UPDATE de la izquiera, se desplegará el error de la derecha.
Por cada fila del trigger, se puede referenciar el valor de una columna antes o después de que su valor
cambia, utilizando los calificadores OLD y NEW.
45
INSTEAD OF Trigger
Los triggers INSTEAD OF se utilizan sobre vistas que pueden tener por ejemplo un
Join en el SQL a las que éstas pertenecen…Veamos la imagen…
48
INSTEAD OF Trigger
Siguiendo con la imagen anterior, miremos un ejemplo concreto…Ejecutamos una
sentencia de INSERT en la tabla EMP_DETAILS que se basa, en la tabla
EMPLOYEES y en la tabla DEPARTMENTS.
49
INSTEAD OF Trigger
Utilizamos INSTEAD OF triggers, para realizar operaciones DML sobre vistas
complejas…
50
INSTEAD OF Trigger
51
Triggers vs Procedures
Triggers Procedures
Definidos por CREATE Definidos por CREATE
TRIGGER PROCEDURE
Manejo de Triggers
Habilitar o deshabilitar el trigger de base de datos
Objetos Inválidos
Cuando un privilegio sobre un objeto es revocado a un usuario, todos los objetos
de PL/SQL de ese usuario que referencian a ese objeto son temporalmente
inválidos.
Por ejemplo, para agregar filas en una tabla que nosotros hemos creado,
no es necesario ningún privilegio. Pero si queremos, ingresar registros
nuevos en una tabla que nosotros no somos dueños, tenemos que tener
el privilegio que otorga el permiso de INSERT sobre esa tabla o tener el
privilegio INSERT ANY TABLE.
55
Resumen de la Unidad
En esta unidad aprendimos los siguientes temas :
• Creación de funciones de DB
1.Consultar tablas y retornar valores específicos.
2.Para ser utilizados en sentencias SQL.
3.Para insertar una nueva fila, con valores de parámetros específicos
en una tabla de DB.
• Invocación de funciones en sentencias SQL.
• Invocación de funciones desde procedimientos almacenados.
• Eliminar funciones de la base de datos.
• Buscar funciones en el diccionario de la base de datos.
• Diferencias entre procedimientos y funciones.
• Privilegios requeridos para las sentencias y las operaciones PL/SQL.
• Otorgar y revocar privilegios.
• Objetos Inválidos.
• Control de acceso sobre las operaciones SQL.
56
Resumen de la Unidad
• Mejora de la organización del código, del management, la seguridad, y la performance a
partir de la utilización de los packages.
• Creación y borrado de specification y body de un package.
• Grupos relacionados de procedimientos y funciones todos juntos en un package.
• Encapsulamiento del código dentro del body del package.
• Definición y utilización de componentes en un package sin body.
• Se puede cambiar el package body sin afectar el specification de un package.
• Manejo de sql dinámicos con la sentencia SQL IMMEDIATE.
• Manejo de la sentencia AUTONOMOUS TRANSACTION.
• Creación de triggers de base de datos que son invocados por operaciones DML.
• Creación de tipos de triggers de "sentencia" y de "fila".
• Utilización de reglas para disparar un trigger.
• Habilitar, deshabilitar y gestionar triggers de base de datos.
• Eliminación de triggers de la base de datos.
57
A trabajar entonces…
Completa el cuestionario,
no lo olvides !
58
Muchas Gracias!