Está en la página 1de 8

Taller PL/SQL: Bloques Anónimos, Procedimientos

Almacenados, Funciones y Triggers sobre una base de datos


Oracle 1xC
¿Qué es PL/SQL?
A diferencia de SQL (Structure Query Language), PL/SQL es un lenguaje de programación de
tipo procedimental.

Las siglas PL y SQL de su nombre significan: «Procedural Language / Structure Query


Language«.

Debes tener en cuenta que, PL/SQL fue desarrollado por la empresa Oracle Inc para dotar de
mayores características y herramientas al SQL convencional, convirtiéndolo en un
potente lenguaje de consulta y manipulación de base de datos Oracle.

Podemos decir que, el lenguaje PL/SQL viene incorporado en el servidor de base


de datos Oracle y forma parte de la suite de herramientas que ofrece Oracle a sus
millones de clientes.

Es precisamente con el lenguaje PL/SQL que podemos crear estructuras para consultar y
manipular base de datos Oracle, como por ejemplo:

• Bloques anónimos
• Procedimientos Almacenados
• Funciones
• Triggers

IT América L. Sabalú Santillan 1


Instructora - Docente
MOS & MTA Microsoft
asabalu@isise.edu.pe
¿Qué es un procedimiento almacenado?
Un procedimiento almacenado, es un bloque de código declarativo de SQL o
PL/SQL que se almacena en el catálogo de la base de datos y puede ser invocado
posteriormente por un programa, un trigger o incluso otro procedimiento
almacenado.

La ventaja de trabajar con procedimientos almacenados es que la definición


y sintaxis del SQL o PL/SQL ya se encuentran interpretados por la instancia de una
base de datos, mejorando los tiempos de respuesta al consumidor (aplicación o agente
que solicita información)

IT América L. Sabalú Santillan 2


Instructora - Docente
MOS & MTA Microsoft
asabalu@isise.edu.pe
¿Qué es un trigger?
Un trigger o disparador (en español) son bloques de código que se ejecutan de
manera automática cuando ocurre un evento en la base de datos o en algún objeto de
la base de datos.
Por ejemplo, un trigger puede ejecutarse antes o después que ocurra un evento en
la base de datos (inserción, actualización o eliminación de registros de una tabla).

Los ejercicios abordarán los siguientes temas:

• Declaración de variables
• Estructuras de control (IF, LOOP, WHILE, FOR)
• Manejo de cursores
• Manipulación de Excepciones
• Creación de Bloques Anónimos
• Creación de Procedimientos Almacenados
• Creación de Funciones
• Creación de Triggers
• Código PL/SQL

IT América L. Sabalú Santillan 3


Instructora - Docente
MOS & MTA Microsoft
asabalu@isise.edu.pe
A continuación, se detalla el enunciado para cada ejercicio y el script de la solución.
Iniciaremos con ejercicios básicos (que no necesitan una base de datos), hasta
ejercicios que devuelvan informes y/o se ejecuten cuando ocurra un evento en la base
de datos.

SET SERVEROUTPUT ON;

Ejercicio 01 : Funciones Matemáticas

Crear un programa que calcule la distancia de dos puntos de un plano cartesiano (x,y).
Dado los valores, x = (3, 2); y = (5, 8). Mostrar en pantalla la distancia de los puntos x,
y.
DECLARE
v_point_x1 NUMBER := 3;
v_point_x2 NUMBER := 2;
v_point_y1 NUMBER := 5;
1 v_point_y2 NUMBER := 8;
2 v_distance DECIMAL(6,2);
3 BEGIN
4 v_distance := SQRT(POWER((v_point_x1-v_point_x2),2)+POWER((v_point_y1-v_point_y2),2));
5 DBMS_OUTPUT.PUT_LINE('CALCULAR LA DISTANCIA DE DOS PUNTOS');
6 DBMS_OUTPUT.PUT_LINE('************************************');
7 DBMS_OUTPUT.PUT_LINE('Punto X : (' || v_point_x1||','||v_point_x2||')');
8 DBMS_OUTPUT.PUT_LINE('Punto Y : (' || v_point_y1||','||v_point_y2||')');
9 DBMS_OUTPUT.PUT_LINE('Distancia XY : ' || v_distance);
10 END;
11
12
13
14

Ejercicio 02 : Sentencia Loop While

Desarrollar un programa que sume «n» veces un número aleatorio.


Imprimir en pantalla los números aleatorios generados y la suma obtenida.

IT América L. Sabalú Santillan 4


Instructora - Docente
MOS & MTA Microsoft
asabalu@isise.edu.pe
La cantidad de iteraciones deberá generarse de manera aleatoria, considerando los valores del 1
al 10. Los números aleatorios generados en cada iteración deberán ser del 10 al 100.
1
2 DECLARE
3 v_sum NUMBER := 0;
4 v_x NUMBER :=0;
5 v_num NUMBER;
v_limit NUMBER;
6 BEGIN
7 v_limit := FLOOR(DBMS_RANDOM.value(1,10));
8 LOOP
9 v_x := v_x + 1;
v_num := FLOOR(DBMS_RANDOM.value(10,100));
10 DBMS_OUTPUT.PUT_LINE('Número aleatorio '||v_x||' -> '|| v_num);
11 v_sum := v_sum + v_num;
12 EXIT WHEN v_x = v_limit;
13 END LOOP;
14 DBMS_OUTPUT.PUT_LINE('Suma Total = '||v_sum);
END;
15
16

Ejercicio 03 : Sentencia FOR

Desarrollar un programa que devuelva la cantidad de números múltiplos de 3 que


existen del 1 al 100.

1
2 DECLARE
3 v_multiple_3 NUMBER := 0;
BEGIN
4 FOR v_num IN 1..100 LOOP
5 IF (MOD(v_num,3)=0) THEN
6 v_multiple_3 := v_multiple_3 + 1;
7 END IF;
END LOOP;
8 DBMS_OUTPUT.PUT_LINE('Números multiplos de 3 del 1 al 100: '||v_multiple_3);
9 END;
10 Output:
11 -- Números multiplos de 3 del 1 al 100: 3
12

IT América L. Sabalú Santillan 5


Instructora - Docente
MOS & MTA Microsoft
asabalu@isise.edu.pe
Ejercicio 04: Cursores
Elabore un bloque anónimo PL/SQL que almacene en un objeto cursor la lista de
empleados (código, nombres, apellidos y salario) que tiene un sueldo menor e igual
$ 2,800.
Mostrar el resultado por cada registro.
Utilizar el esquema de base de datos HR (Human Resources) que viene por defecto
en Live SQL.
1 DECLARE
2 CURSOR employees_cursor
3 IS
4 SELECT employee_id,first_name,last_name,salary FROM
5 hr.employees WHERE salary<=2800;
6 v_id hr.employees.employee_id%TYPE;
7 v_name hr.employees.first_name%TYPE;
8 v_surname hr.employees.last_name%TYPE;
9 v_salary hr.employees.salary%TYPE;
10 v_num NUMBER := 0;
11 BEGIN
12 DBMS_OUTPUT.PUT_LINE(LPAD('-',50,'-'));
13 DBMS_OUTPUT.PUT_LINE('INFORME DE EMPLEADOS');
14 DBMS_OUTPUT.PUT_LINE(LPAD('-',50,'-'));
15 OPEN employees_cursor;
16 LOOP
17 FETCH employees_cursor INTO
18 v_id,v_name,v_surname,v_salary;

IT América L. Sabalú Santillan 6


Instructora - Docente
MOS & MTA Microsoft
asabalu@isise.edu.pe
19 EXIT WHEN employees_cursor%NOTFOUND;
20 v_num := v_num+1;
21 DBMS_OUTPUT.PUT_LINE('[' || v_num || '] Empleado N° '||
v_id || ' - ' || v_name || ' ' || v_surname || ' tiene un sueldo de'
||TO_CHAR(v_salary,'$99,999.00'));
END LOOP;
CLOSE employees_cursor;
END;

Ejercicio 05: Sentencia IF

Elaborar un bloque anónimo PL/SQL que devuelva un reporte de los empleados que
tienen un salario menor e igual a $ 2,800.00. El reporte debe mostrarse agrupado por
departamentos. Los valores de la columna deben ser por ancho fijo.

IT América L. Sabalú Santillan 7


Instructora - Docente
MOS & MTA Microsoft
asabalu@isise.edu.pe
DECLARE
CURSOR dpto_employees_cursor IS
1 SELECT
2 e.department_id,d.department_name,e.employee_id,e.first_name,e.last_name,e.salary
3 FROM hr.employees e
4 INNER JOIN hr.departments d ON e.department_id=d.department_id
5 WHERE salary<2800
6 ORDER BY d.department_name DESC, salary DESC;
7 v_last_department_id hr.departments.department_id%TYPE:=0;
8 v_num NUMBER := 0;
9 BEGIN
10 DBMS_OUTPUT.PUT_LINE(LPAD('-',70,'-'));
11 DBMS_OUTPUT.PUT_LINE('INFORME DE EMPLEADOS POR DEPARTAMENTOS');
12 DBMS_OUTPUT.PUT_LINE(LPAD('-',70,'-'));
13 FOR emp IN dpto_employees_cursor
14 LOOP
15 IF v_last_department_id<>emp.department_id THEN
16 DBMS_OUTPUT.PUT_LINE(chr(13)||'DEPARTAMENTO: ' ||
17 UPPER(emp.department_name));
18 DBMS_OUTPUT.PUT_LINE(LPAD('-',70,'-'));
19 ELSE
20 DBMS_OUTPUT.PUT_LINE(rpad(emp.employee_id, 10) ||
21 rpad(emp.first_name|| ' ' || emp.last_name, 20)
22 ||TO_CHAR(emp.salary,'$999,999.00'));
23 END IF;
24 v_last_department_id:=emp.department_id;
END LOOP;
END;

IT América L. Sabalú Santillan 8


Instructora - Docente
MOS & MTA Microsoft
asabalu@isise.edu.pe

También podría gustarte