Está en la página 1de 58

Creación y Manejo de Funciones.

Creación de Packages. Sql


Immediate. Autonomous
Transaction. Creación de triggers.
2

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

Pasos de una Función


El diagrama muestra los pasos básicos del desarrollo de una función.
5

Formas de ejecutar una Función


Existen distintas formas de invocar una función :
• La primera utilizando una variable de tipo Host, estas variables se pueden utilizar
afuera de los programas y quedan residentes en la DB.
• Utilizar una variable local y asignar el valor de la función.
• Utilizar la función como parámetro para otro programa.
• Utilización de la función en una sentencia SQL ( Esta forma es muy utilizada ).
6

Ventajas de usar una Función en Sentencias SQL

A continuación detallamos, cuáles son las ventajas de


utilizar funciones en sentencias SQL:

• Puede extender las actividades de SQL que son


complejas, difíciles o que no existen en el propio SQL.
• Puede mejorar la eficiencia cuando se utiliza filtros en la
cláusula WHERE, encontra posición a filtrar información
en la aplicación.
• Puede manipular valores de información.
7

Función en expresiones SQL


8

Lugares para llamar a funciones

Las funciones definidas por el usuario son utilizadas por cada fila
que retorne una consulta de SQL y pueden ser encontradas en:

1-En la lista de la cláusula SELECT de un query.

2-Expresiones condicionales en las cláusulas WHERE y


HAVING.

3-Las cláusulas, CONNECT BY, START WITH, ORDER BY, y


GROUP BY.

4-En la cláusula "SET" de una sentencia UPDATE.


9

Restricciones de llamar Funciones dentro de sentencias de SQL

1. Las funciones que son llamadas desde expresiones de SQL


deben:

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.

2. Cuando las funciones son llamadas en sentencias de SQL:

A) Los parámetros deben especificar la notación posicional.


B) Tenemos que ser propietarios de la función, o tener el
privilegio "EXECUTE“.
10

Restricciones de llamar Funciones dentro de sentencias de SQL


11

Eliminar funciones de la DB
Se puede utilizar la siguiente sentencia para eliminar una
función almacenada en la DB.

Todos los privilegios que son otorgados a la función son


revocados cuando la función es dropeada.

La sintáxis CREATE OR REPLACE es equivalente a


dropear una función y volverla a crear. Lo mismo ocurre
para los privilegios otorgados a la función.
12

Buscar funciones en el Diccionario


Este primer query, permite ver las líneas de código de las
funciones que uno quiera encontrar. Habría que agrega
en el WHERE name = “Nombre_Funcion” que uno desea.

En este segundo query, se puede buscar todas las


funciones creadas por el usuario, no su código, sino los
nombres de las mismas.
13

Procedimientos vs Funciones

Procedimientos Funciones
Es ejecutado como una Invocada como parte de una
sentencia PL/SQL expresión

No contiene una cláusula de Contiene una cláusula de


"RETURN" en la cabecera "RETURN" en la cabecera

Puede retornar valores en los


parámetros IN OUT Retorna un solo valor

Puede contener una sentencia Debe contener al menos una


"RETURN" sin valor sentencia "RETURN"
14

Privilegios requeridos para las sentencias y las operaciones PL/SQL

1. Para los usuarios de PL/SQL, el control de acceso afecta la


habilidad de crear, modificar, dropear y ejecutar procedimientos y
funciones de PL/SQL, incluyendo packages y las funciones y
procedimientos que se alojan dentro de estos packages.

2. Necesitamos el privilegio de CREATE PROCEDURE para crear


un procedimiento, o el privilegio CREATE ANY PROCEDURE si
el mismo fué creado en otro schema que no sea nuestro propio
usuario. Para dropear el procedimiento se necesita el privilegio
DROP ANY PROCEDURE.

3. Para ejecutar un procedimiento o función, debemos ser el dueño,


y tener el privilegio de "EXECUTE".
15

Otorgar y revocar privilegios

Utilizar la sentencia de SQL "GRANT" para otorgar privilegios. Usar el


privilegio REVOKE para revocar los mismos.

Veamos el ejemplo de ambos casos utilizando 2 usuarios…

Otorgar privilegio:

Command> grant execute on user1.myproc to user2;


Command> grant execute on user1.mypkg to user2;

Revocar el privilegio:

Command> revoke execute on user1.myproc from user2;


Command> revoke execute on user1.mypkg from user2;
16

Creación de Packages
Los packages de PL/SQL son unidades de programación que:

Agrupan lógicamente un grupo de componentes como ser:


1.Tipos de PL/SQL
2.Variables, Estructuras de información, excepciones.
3. Subprogramas: Procedimientos y Funciones.

Consiste en 2 partes:
1.Una especificación (Specification).
2.Un cuerpo (body).

Habilita al Oracle server a leer multiples objetos en la memoria al mismo


tiempo.
17

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

Visibilidad de los Componentes


Como observamos en la imagen, en la sección pública se encuentra la sección
declarativa del procedimiento, y en la sección privada, aparece el desarrollo del
mismo.
19

Pasos para crear y ejecutar un Package


A continuación, podemos observar, los distintos pasos para poder editar, crear,
compilar, almacenar y ejecutar finalmente un Package. También que comando
utilizar para ver los errores.
20

Ejemplo de un specification de un Package

1. La opción "OR REPLACE" dropea y re-crea la especificación de un package.


2. Las variables declaradas en la especificación son inicializadas en NULL por
defecto.
3. Todas las construcciones declaradas en la especificación de un package son
visibles por los usuarios que tienen permisos otorgados sobre ese package.
4. STD_COMM es una variable global inicializada en 0.10.
5. RESET_COMM es un procedimiento público. Es utilizado para resetear la
comisión standard basado en reglas de negocios. Es implementado en el
package body (cuerpo del paquete).
21

Ejemplo de un body de un Package


22

Ejemplo de un body de un Package

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 procedure "reset_comm" invoca la función privada antes de cambiar la comisión


standard en "std_comm".

Tengamos en cuenta que :

1. La variable "std_comm" es referenciada en el procedimiento "reset_comm".


2. El procedimiento "reset_comm" implementa la definición pública dentro del
"specification".
3. En el body de "comm_pkg", la función "validate" es privada y es directamente
referenciada por el procedure "reset_comm".
23

Invocando un Package de distintas maneras

Ejemplo 1: Invoca la función "validate" desde el procedure "reset_comm" en el


mismo package.
Ejemplo 2: Se llama al procedure "reset_comm" directamente desde la interfaz de
iSQL*Plus para resetear la comisión al valor 0.15 para la sesión de
usuario.
Ejemplo 3: Se llama al procedure "reset_comm" dentro del package desde un
usuario que no es el dueño.
24

Crear y utilizar un Package sin body

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 segundo caso, la constante "mile_2_kilo" es referenciada desde el package


"global_consts".

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

Para borrar un package completo (specification y body) utilizar la siguiente forma:

Para borrar el body de un package, utilizar la siguiente sentencia:

Cuando un package no se utiliza más, se puede uutilizar una sentencia de SQL


para removerlo.

El package tiene 2 partes: Pero se puede remover todo el package, o


solamente remover el package body y retener el package specification.
26

Ver un Package en el Diccionario

El código de los packages es mantenido y puede ser visto dentro


de las siguientes tablas del diccionario USER_SOURCES, y ALL_SOURCE.

Para ver el specification del package, utilizar:

Para ver el body del package, utilizar:


27

Ventajas de utilizar un Package


Modularidad: Encapsula las contrucciones relacionadas.
Mantenimiento Sencillo: Mantiene unida una funcionalidad relacionandola
lógicamente.
Diseño sencillo de aplicaciones: Se puede compilar y códificar el specification y el
body en forma separada.
Ocultar Información:
1. Solamente las declaraciones que se encuentran en el specification del
package son visibles y accesibles por las aplicaciones.
2. Las construcciones privadas en el body del package son ocultas e
inaccesibles.
3. Todo el código es ocultado en el body del package.
Funcionalidad adicional: Persistencia de variables y cursores.
Mejora de Performance:
1. Todo el package es alocado en memoria cuando el package es
referenciado por primera vez.
2. Solo existe una copia del mismo en memoria para todos los usuarios.
3. La dependencia jerárquica se simplifica.
Sobrecarga: Varios subprogramas con el mismo nombre.
28

SQL Immediate – SQL Dinámicos

Los SQL dinámicos pertenecen a una metodología de programación que


genera y ejecuta sentencias SQL en tiempo de ejecución.
Se utiliza para:

1-Escribir programas que deben ejecutar sentencias DDL (como ser


CREATE, ALTER, DROP).

2-O cuando no se conoce en tiempo de compilación el texto completo de


la sentencia SQL o el número o tipo de dato de las variables de entrada
y salida.

El código de los SQL dinámicos nativos son fáciles de leer y grabar, y se


ejecutan rápidamente. Sin embargo, para escribir un SQL dinámico,
debemos saber en tiempo de compilación el número y el tipo de dato
de las variables de entrada y salida de esa sentencia.
29

SQL Immediate con CURSORES


DECLARE

TYPE EmpCurTyp IS REF CURSOR;


v_emp_cursor EmpCurTyp;
emp_record employees%ROWTYPE;
v_stmt_str VARCHAR2(200);
v_e_job employees.job%TYPE;

BEGIN
-- Dynamic SQL statement en un variable
v_stmt_str := 'SELECT * FROM employees WHERE job_id = ‘’’ST_MARK’’';

OPEN v_emp_cursor FOR v_stmt_str USING 'MANAGER';


LOOP
FETCH v_emp_cursor INTO emp_record;
EXIT WHEN v_emp_cursor%NOTFOUND; END LOOP;

-- Close cursor:
CLOSE v_emp_cursor;
END;
/
30

Otros ejemplo de SQL Immediate


DECLARE

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

Otros ejemplo de SQL Immediate


En este caso, se crea una tabla con un campo salario, luego se la elimina de la
DB, y luego se la vuelve a crear con otro campo.

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“.

Son especificadas con PRAGMA AUTONOMOUS_TRANSACTION.


33

Características de Autonomous Transactions

1-Son independientes de la transacción principal.

2-Suspende la llamada de transacción hasta ser completada.

3-No son transacciones anidadas.

4-No se realiza rollback si la transacción principal hace rollback.

5-Habilita a hacer cambios que se ven visibles por otras transacciones


utilizando commit.

6-Son demarcadas ( comenzadas y terminadas ) por subprogramas, pero


no por bloques anónimos.
34

Ejemplo de Autonomous Transactions


35

Triggers
1. Es un bloque de PL/SQL o un procedure PL/SQL asociado a una tabla, vista,
schema o base de datos.

2. Ejecutar implícitamente si un evento particular tiene lugar.

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).

Los triggers de base de datos se ejecutan implícitamente cuando ocurre cualquiera


de estos eventos:
• Operaciones DML sobre una tabla.
• Operaciones DML sobre una vista, utilizando un trigger de tipo "INSTEAD
OF".
• Sentencias DDL, como CREATE y ALTER.
36

Triggers
Diseñamos triggers para:
Ejecutar acciones relacionadas.
Centralizar operaciones globales.

No se diseña triggers para:


Cuando la funcionalidad existe en el Oracle Server.
Cuando duplica otros triggers ya existentes.

Se puede crear un stored procedures y ser invocados dentro de un


trigger, si el código PL/SQL es largo.

Si realizamos un excesivo uso de triggers, puede generar una


interdependencia compleja, que resulta complicado su mantenimiento en
aplicaciones grandes.
37

Tipos de Triggers DML


El tipo de trigger determina si el body ejecuta cada fila o solo se dispara
una vez por la sentencia de trigger.

A) El trigger "sentencia“ :

- Se ejecuta una sola vez por el evento del trigger.


- Es el trigger por default.
- Se ejecuta una vez, aunque no hayan filas afectadas al trigger.

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

¿ Cuando se debe disparar un trigger ?

1) BEFORE: Se ejecuta el body del trigger antes que se ejecute la


sentencia DML en la tabla.

2) AFTER: Se ejecuta el body del trigger después que se ejecute la


sentencia DML en la tabla.

3) INSTEAD OF: Se ejecuta el body del trigger en lugar de la sentencia


del mismo. Se utiliza sobre las vistas que no son modificables.

Nota: Si existen varios triggers sobre el mismo objeto, el orden en que se


disparan los mismos es arbitrario.
39

Secuencia de disparo de un Trigger


Utilizar la siguiente secuencia de disparo para un trigger que se basa en una tabla
cuando una fila es manipulada:
40

Secuencia de disparo de un Trigger


Utilizar la secuencia de disparo para un trigger que se basa en una tabla
cuando VARIAS filas son manipuladas:
41

Tipos de Eventos y Cuerpo de un Trigger

Un evento del trigger:

- Determina que sentencia DML causa la ejecución del trigger.


- Los tipos son:
- INSERT
- UPDATE (OF column)
- DELETE

El body del trigger:

- Determina que acción se debe ejecutar.


- Es un bloque PL/SQL o una llamada a un procedimiento.
42

Ejemplo de un Trigger de “sentencia” DML

Testeamos el trigger…y vemos la salida…


43

Utilización de predicados condicionales


Se puede combinar distintos eventos de trigger en uno solo, tomando como ventaja
los predicados condicionales especiales como ser:
INSERTING, UPDATING, y DELETING en el body del trigger.
44

Ejemplo de un Trigger de “fila” DML

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

Utilización de Calificadores OLD y NEW


Siguiendo con el ejemplo anterior…
46

Restricciones en los triggers “fila”


Para restringir la acción de un trigger sobre las filas se puede utilizar una condición
en la cláusula "WHEN…Veamos un ejemplo…
47

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

El Diccionario de datos El Diccionario de datos


contiene el código dentro contiene el código dentro de
de USER_TRIGGERS USER_SOURCE
Son invocados Son explícitamente
implícitamente por DML invocados
No se permite COMMIT, Se permite COMMIT,
SAVEPOINT, ROLLBACK SAVEPOINT, ROLLBACK
52

Manejo de Triggers
Habilitar o deshabilitar el trigger de base de datos

Habilitar o deshabilitar todos los trigger de una tabla

Recompilar un trigger de una tabla

Eliminar un trigger de la base de datos


53

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.

Cuando un privilegio es otorgado nuevamente, el usuario puede explícitamente


recompilar y revalidar el objeto ejecutando los comandos de
ALTER PROCEDURE,
ALTER FUNCTION, o
ALTER PACKAGE.

Alternativamente, cada objeto es recompilado y revalidado automáticamente la


próxima vez que es ejecutado.

Para verificar los objetos inválidos se puede ejecutar la siguiente sentencia:

select * from user_objects where status='INVALID';


54

Control de acceso sobre las operaciones SQL

Para cada query, sentencia DML que es ejecutada en un bloque


anónimo, o cualquier sentencia DDL que es ejecutada en una sentencia
de EXECUTE IMMEDIATE, se asume que el usuario tiene que tener los
privilegios apropiados para ejecutar dicha sentencia y acceder a los
objetos deseados.

El SQL ejecutado en un bloque anónimo de PL/SQL requiere los mismos


privilegios que cuando se ejecuta directamente.

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!

También podría gustarte