Está en la página 1de 12

CURSORES

MAIKOL STIVEL NIETO SANCHEZ.

Trabajo presentado al Mg. FRANCISCO J OBANDO VIDAL, en el área de:


TÓPICOS AVANZADOS EN BASE DE DATOS.
INGENIERÍA INFORMÁTICA.

INSTITUCIÓN UNIVERSITARIA “COLEGIO MAYOR DEL CAUCA”.


POPAYÁN – CAUCA.
08/04/2024.
PUNTO UNO

--Inserte los siguientes registros en la tabla Producto:


--INSERT INTO PRODUCTOS (PRO_ID, PRO_NOMBRE) VALUES ('30100211', 'SSD
--500gbb');
--INSERT INTO PRODUCTOS (PRO_ID, PRO_NOMBRE) VALUES ('30100212', 'tarjeta
--Grafica TX500');
--INSERT INTO PRODUCTOS (PRO_ID, PRO_NOMBRE) VALUES ('30100213', 'Monitor 27
--LG’’ ');
--Cree un procedimiento almacenado que permita Eliminar un producto dado
--el Id del producto, Use para pruebas los Producto insertandos.

CREATE OR REPLACE PROCEDURE Eliminar_Producto(


p_Pro_Id IN NUMBER
)
IS
BEGIN
DELETE FROM Productos WHERE Pro_Id = p_Pro_Id;
COMMIT;
DBMS_OUTPUT.PUT_LINE('Producto eliminado correctamente.');
EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('El producto con ID ' || p_Pro_Id || ' no
existe.');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Se produjo un error al intentar eliminar el
producto.');
END Eliminar_Producto;
/
SET SERVEROUTPUT ON;

BEGIN
DBMS_OUTPUT.PUT_LINE('Eliminando producto con ID 30100211...');
Eliminar_Producto(30100211);
END;
/

PUNTO DOS.

--Realice un procedimiento almacenado que permita guardar la información


--de un empleado (id, nombre, cargo, jefe, fecha contrato, salario,
comisión, y
--departamento al que pertenece). Si el empleado ya existe, se debe
--actualizar solo el cargo, salario y departamento al que pertenece.
--Excepciones y Datos Compuestos:

CREATE OR REPLACE PROCEDURE Guardar_Empleado(


p_Emp_Id IN NUMBER,
p_Emp_Nombre IN VARCHAR2,
p_Emp_Cargo IN VARCHAR2,
p_Emp_Jefe IN NUMBER,
p_Emp_FechaContrato IN DATE,
p_Emp_Salario IN NUMBER,
p_Emp_Comision IN NUMBER,
p_Dep_Id IN NUMBER
)
IS
v_Count NUMBER;
BEGIN
SELECT COUNT(*) INTO v_Count FROM Empleados WHERE Emp_Id = p_Emp_Id;

IF v_Count > 0 THEN


UPDATE Empleados
SET Emp_Cargo = p_Emp_Cargo,
Emp_Salario = p_Emp_Salario,
Dep_Id = p_Dep_Id
WHERE Emp_Id = p_Emp_Id;

DBMS_OUTPUT.PUT_LINE('Empleado actualizado exitosamente.');


ELSE
INSERT INTO Empleados (Emp_Id, Emp_Nombre, Emp_Cargo, Emp_Jefe,
Emp_FechaContrato, Emp_Salario, Emp_Comision, Dep_Id)
VALUES (p_Emp_Id, p_Emp_Nombre, p_Emp_Cargo, p_Emp_Jefe,
p_Emp_FechaContrato, p_Emp_Salario, p_Emp_Comision, p_Dep_Id);

DBMS_OUTPUT.PUT_LINE('Empleado guardado exitosamente.');


END IF;
EXCEPTION
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Error al guardar o actualizar empleado: ' ||
SQLERRM);
END;
/
SET SERVEROUTPUT ON;
BEGIN
Guardar_Empleado(7000, 'NUEVO EMPLEADO', 'ANALISTA', NULL,
TO_DATE('2024-04-08','YYYY-MM-DD'), 4000000, NULL, 20);
END;
/
BEGIN
Guardar_Empleado(7000, 'NUEVO EMPLEADO', 'GERENTE', NULL, TO_DATE('2024-
04-08','YYYY-MM-DD'), 5000000, NULL, 20);
END;
/
PUNTO TRES.

Realice un bloque anónimo que solicite el id de un producto específico y


muestre el nombre del producto e indique si se puede dar un descuento del
10%. Un producto se le puede realizar el 10% de descuento si la cantidad
de productos en una orden solicitados es mayor a de 100. En caso contrario
lance una excepción definida por el usuario.
Realice manejo de excepciones para:

•Lanzar excepción si la cantidad de productos es menor de o igual a 100. El


mensaje a mostrar será: “el producto id___ no puede generar descuento”
•Lanzar excepción si el producto no existe.

SET SERVEROUTPUT ON

DECLARE
v_pro_id NUMBER;
v_pro_nombre VARCHAR2(40);
v_cantidad_productos NUMBER;
v_descuento BOOLEAN := FALSE;
BEGIN
v_pro_id := &pro_id;

SELECT Pro_Nombre INTO v_pro_nombre


FROM Productos
WHERE Pro_Id = v_pro_id;
IF v_pro_nombre IS NULL THEN
RAISE_APPLICATION_ERROR(-20001, 'El producto con ID ' || v_pro_id ||
' no existe.');
END IF;

SELECT COUNT(*)
INTO v_cantidad_productos
FROM ProductosPorOrden
WHERE Pro_Id = v_pro_id;

IF v_cantidad_productos > 100 THEN


v_descuento := TRUE;
DBMS_OUTPUT.PUT_LINE('Se puede aplicar un descuento del 10% al
producto ' || v_pro_nombre);
ELSE
RAISE_APPLICATION_ERROR(-20002, 'El producto con ID ' || v_pro_id ||
' no puede generar descuento.');
END IF;

EXCEPTION
WHEN NO_DATA_FOUND THEN
DBMS_OUTPUT.PUT_LINE('El producto con ID ' || v_pro_id || ' no
existe.');
WHEN OTHERS THEN
DBMS_OUTPUT.PUT_LINE('Se ha producido un error: ' || SQLERRM);
END;
/
PUNTO CUATRO.

4. Defina una tabla de registros PL/SQL de tipo Productos.


A través de Bulk Colllect llene toda la tabla de registros.
Imprima finalmente los datos ingresados en la tabla de Registros con el
siguiente formato de mensaje ,también a través de un ciclo:
Producto ID:______-Nombre Producto:________
Nota: la tabla de registro NO debe tener el INDEXBYBINARY_INTEGER

SET SERVEROUTPUT ON

DECLARE
TYPE ProductoRecord IS RECORD (
Pro_Id NUMBER(8),
Pro_Nombre VARCHAR2(40)
);

TYPE ProductoTable IS TABLE OF ProductoRecord;

l_productos ProductoTable;
BEGIN

SELECT Pro_Id, Pro_Nombre


BULK COLLECT INTO l_productos
FROM Productos;

FOR i IN 1..l_productos.COUNT LOOP


DBMS_OUTPUT.PUT_LINE('Producto ID: ' || l_productos(i).Pro_Id || ' -
Nombre Producto: ' || l_productos(i).Pro_Nombre);
END LOOP;
END;
/
PUNTO 5.

5. Cree un procedimiento almacenado que le permita visualizar el nombre de


jefe directo de cada empleado en la tabla empleados. La columna jefe
indica el código del jefe correspondiente. El resultado de la ejecución de
la
consulta debe ser de la siguiente forma:
El Empleado Benavidez tiene como jefe a LOPEZ.

CREATE OR REPLACE PROCEDURE MostrarJefes AS

v_emp_nombre Empleados.Emp_Nombre%TYPE;
v_jefe_nombre Empleados.Emp_Nombre%TYPE;
v_emp_id Empleados.Emp_Id%TYPE;
v_jefe_id Empleados.Emp_Id%TYPE;

CURSOR empleados_cursor IS
SELECT Emp_Id, Emp_Nombre, Emp_Jefe
FROM Empleados;

BEGIN

OPEN empleados_cursor;

LOOP
BEGIN
FETCH empleados_cursor INTO v_emp_id, v_emp_nombre, v_jefe_id;

EXIT WHEN empleados_cursor%NOTFOUND;

SELECT Emp_Nombre INTO v_jefe_nombre


FROM Empleados
WHERE Emp_Id = v_jefe_id;

DBMS_OUTPUT.PUT_LINE('El Empleado ' || v_emp_nombre || ' tiene como


jefe a ' || v_jefe_nombre);
EXCEPTION
WHEN NO_DATA_FOUND THEN

DBMS_OUTPUT.PUT_LINE('El Empleado ' || v_emp_nombre || ' no tiene un


jefe asignado.');
END;
END LOOP;

CLOSE empleados_cursor;
END;
/

SET SERVEROUTPUT ON;

BEGIN
MostrarJefes;
END;
/
PUNTO 6.

6. Realice un procedimiento almacenado que recibe como parámetro una letra


y que por medio de una función obtenga el número de empleados cuyo
nombre inicia con dicha letra. Luego, se debe imprimir desde el
procedimiento un mensaje que indique el número de empleados que
cumplen la condición, es decir que empiezan con determinada letra y se
debe mostrara demás los nombres de dichos empleados.

CREATE OR REPLACE FUNCTION ContarEmpleadosPorLetra(letra IN VARCHAR2) RETURN


NUMBER IS
total_empleados NUMBER := 0;
BEGIN
SELECT COUNT(*)
INTO total_empleados
FROM Empleados
WHERE UPPER(SUBSTR(Emp_Nombre, 1, 1)) = UPPER(letra);

RETURN total_empleados;
EXCEPTION
WHEN NO_DATA_FOUND THEN
RETURN 0;
END ContarEmpleadosPorLetra;
/

SET SERVEROUTPUT ON;


CREATE OR REPLACE PROCEDURE MostrarEmpleadosPorLetra(letra IN VARCHAR2) AS

total NUMBER;
v_emp_nombre Empleados.Emp_Nombre%TYPE;

CURSOR empleados_cursor IS
SELECT Emp_Nombre
FROM Empleados
WHERE UPPER(SUBSTR(Emp_Nombre, 1, 1)) = UPPER(letra);

BEGIN

total := ContarEmpleadosPorLetra(letra);

DBMS_OUTPUT.PUT_LINE('El número de empleados cuyos nombres empiezan con la


letra ' || letra || ' es: ' || total);

OPEN empleados_cursor;

LOOP
FETCH empleados_cursor INTO v_emp_nombre;
EXIT WHEN empleados_cursor%NOTFOUND;
DBMS_OUTPUT.PUT_LINE(' - ' || v_emp_nombre);
END LOOP;

CLOSE empleados_cursor;
END;
/

BEGIN
MostrarEmpleadosPorLetra('A');
END;
/

También podría gustarte