Está en la página 1de 4

SET SERVEROUTPUT ON

-- Ejemplo básico de un procedimiento en PL/SQL que acepta un parámetro de entrada


y realiza una acción:
-- Calcular_cuadrado y acepta un parámetro de entrada llamado numero y un parámetro
de salida llamado resultado.
-- El procedimiento calcula el cuadrado del número de entrada y lo asigna al
parámetro de salida.
CREATE OR REPLACE PROCEDURE calcular_cuadrado (
numero IN NUMBER,
resultado OUT NUMBER
) AS
BEGIN
resultado := numero * numero;
END;
/

-- Para ejecutar este procedimiento y ver el resultado. Realizamos un bloque


anónimo
DECLARE
resultado_numero NUMBER;
BEGIN
calcular_cuadrado(5, resultado_numero);
dbms_output.put_line('El resultado es: ' || resultado_numero);
END;
/

-- Ejemplo más completo de un procedimiento en PL/SQL que utiliza estructuras de


control y operaciones aritméticas:
-- Calcular el promedio de tres notas de un estudiante y determinar su estado
(aprobado o suspenso) en función del promedio obtenido
-- calcular_promedio y acepta tres parámetros de entrada nota1, nota2, y nota3, y
dos parámetros de salida promedio y estado.
-- El procedimiento calcula el promedio de las notas de entrada y determina el
estado del estudiante en función del promedio.
CREATE OR REPLACE PROCEDURE calcular_promedio (
nota1 IN NUMBER,
nota2 IN NUMBER,
nota3 IN NUMBER,
promedio OUT NUMBER,
estado OUT VARCHAR2
) AS BEGIN
-- Calcular el promedio y redondear a 2 decimales
promedio := round(( nota1 + nota2 + nota3 ) / 3, 2);

-- Determinar el estado del estudiante


IF promedio >= 5 THEN
estado := 'APROBADO';
ELSE
estado := 'SUSPENSO';
END IF;

END;

-- Pra ejecutar este procedimiento y ver el resultado, puedes hacer lo siguiente:

DECLARE
promedio_estudiante NUMBER;
estado_estudiante VARCHAR2(20);
BEGIN
calcular_promedio(3, 8, 9, promedio_estudiante, estado_estudiante);
DBMS_OUTPUT.PUT_LINE('El promedio del estudiante es: ' || promedio_estudiante);
DBMS_OUTPUT.PUT_LINE('El estado del estudiante es: ' || estado_estudiante);
END;

-- Creamos una tabla en la base de datos llamada empleados que contiene información
sobre los empleados de una empresa, incluyendo su salario.
CREATE TABLE empleados (
id_emp NUMBER PRIMARY KEY,
nombre VARCHAR2(50),
salario NUMBER(10, 2)
);

INSERT INTO empleados (id_emp, nombre, salario)


VALUES (1001, 'Juan Perez', 2500.00);

INSERT INTO empleados (id_emp, nombre, salario)


VALUES (1002, 'Maria Garcia', 3000.00);

INSERT INTO empleados (id_emp, nombre, salario)


VALUES (1003, 'Pedro Rodriguez', 2000.00);

-- Procedimiento que le aumenta el salario a un empleado segun un %


CREATE OR REPLACE PROCEDURE p_modificar_salario(
vin_id_emp IN NUMBER,
vin_aumento IN NUMBER
)
AS
v_salario empleados.salario%TYPE;
BEGIN
-- Obtener el salario bruto del empleado
SELECT salario INTO v_salario FROM empleados WHERE id_emp = vin_id_emp;

-- Calcular las aumento


v_salario := v_salario + (v_salario * vin_aumento/100);

-- aumentar salario en la tabla


UPDATE empleados set salario = v_salario WHERE id_emp = vin_id_emp;

-- Mostrar el resultado
DBMS_OUTPUT.PUT_LINE('El nuevo salario del empleado con ID ' || vin_id_emp || '
es: ' || v_salario);
EXCEPTION
WHEN no_data_found THEN
dbms_output.put_line('El error es: ' || sqlcode);
dbms_output.put_line(sqlerrm);
END;

-- aumentar el salario que le pasamos a p_aumentar_salario con un valor de entrada


de 1001.
EXECUTE p_modificar_salario(1001, 50);

-- Crear una funcion que acepte un identificador de empleado como entrada y calcule
su salario neto después de aplicar impuestos y deducciones.
-- Si el identificador no existe en la tabla, la función debe lanzar una excepción.
/

CREATE OR REPLACE FUNCTION f_salario_neto (


vin_id_empleado IN NUMBER
) RETURN NUMBER AS
v_salario_neto empleados.salario%TYPE;
v_salario_bruto empleados.salario%TYPE;
v_deducciones NUMBER := 0;
v_por_deduc decimal(5, 2) := 0.15;
BEGIN
-- Obtener el salario bruto del empleado
SELECT
salario
INTO v_salario_bruto
FROM
empleados
WHERE
id_emp = vin_id_empleado;

-- Verificar si el empleado existe


IF v_salario_bruto IS NULL THEN
raise_application_error(-20001, 'El identificador de empleado no existe');
END IF;

-- Calcular las deducciones


v_deducciones := v_salario_bruto * v_por_deduc;

-- Calcular el salario neto


v_salario_neto := v_salario_bruto - v_deducciones;

RETURN v_salario_neto;

EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line('Error: ' || sqlerrm);
END;

-- Calcular el salario que le pasamos a f_salario_neto con un valor de entrada de


1001.
DECLARE
v_salario_empleado NUMBER;
v_id_emp empleados.id_emp%TYPE := 1001;
BEGIN
v_salario_empleado := f_salario_neto(v_id_emp);
-- Mostrar el resultado
DBMS_OUTPUT.PUT_LINE('El salario neto del empleado con ID ' || v_id_emp || ' es:
' || v_salario_empleado);
END;

-- Función que acepta una cadena de texto como entrada y devuelve el número de
palabras en esa cadena

CREATE OR REPLACE FUNCTION f_contar_palabras(


vin_texto IN VARCHAR2
)
RETURN NUMBER
AS
v_palabra_count NUMBER := 0;
BEGIN
IF vin_texto IS NOT NULL THEN
-- Dividir el texto en palabras
FOR i IN 1..LENGTH(vin_texto) LOOP
-- Cada vez que encontramos un espacio contamos palabra
IF SUBSTR(vin_texto, i, 1) = ' ' THEN
v_palabra_count := v_palabra_count + 1;
END IF;
END LOOP;
v_palabra_count := v_palabra_count + 1; -- Contar la última palabra
END IF;
RETURN v_palabra_count;
END;

-- Para llamar a esta función y obtener su resultado


DECLARE
v_texto VARCHAR2(100) := 'Esta es una cadena de texto de ejemplo';
v_resultado NUMBER;
BEGIN
v_resultado := f_contar_palabras(v_texto);
DBMS_OUTPUT.PUT_LINE('El número de palabras en el texto es: ' || v_resultado);
END;

También podría gustarte