Hola Kergan
Veo que te estas complicando en el PL haciendo uso del CASE.
Mira esto:
Código SQL:
Ver originalCREATE OR REPLACE PROCEDURE calculoISR (
Sueldo_Gravable IN NUMBER,
Sueldo_Recibido OUT NUMBER,
Total_ISR OUT NUMBER,
v_porcentaje OUT NUMBER
)
AS
v_limite_inferior NUMBER;
v_cuota_fija NUMBER;
BEGIN
--Paso 1: Se ubica el sueldo en la tabla para saber el % y la cuota fija. La ubicación debe de ser entre el Límite inferior y Límite superior.
SELECT limite_inferior,
cuota_fija,
porcentaje
INTO
v_limite_inferior,
v_cuota_fija,
v_porcentaje
FROM datos_ISR
WHERE Sueldo_Gravable BETWEEN limite_inferior AND limite_superior;
--Paso 2: Se resta al sueldo gravable el límite inferior
Total_ISR := Sueldo_Gravable - v_limite_inferior;
--Paso 3: Al resultado se multiplica por el porcentaje (eje. 28%)
Total_ISR := Total_ISR * v_porcentaje;
--Paso 4: Al resultado se suma la cuota fija.
Total_ISR := Total_ISR + v_cuota_fija;
Sueldo_Recibido := Sueldo_Gravable + Total_ISR;
END calculoISR;
/
En los pasos que mencionas no entendí bien como sale el sueldo recibido. Yo lo puse como la suma del sueldo gravable mas el total ISR.
Para probar el procedimiento puedes ejecutar este bloque anonimo.
Código SQL:
Ver originalDECLARE
v_sueldo_gravable NUMBER := &SUELDO;
v_sueldo_recibido NUMBER;
v_total_isr NUMBER;
v_porcentaje NUMBER;
BEGIN
calculoISR(v_sueldo_gravable, v_sueldo_recibido, v_total_isr,v_porcentaje);
DBMS_OUTPUT.PUT_LINE('El sueldo recibido es: '||v_sueldo_recibido);
DBMS_OUTPUT.PUT_LINE('El total ISR es: '||v_total_isr);
DBMS_OUTPUT.PUT_LINE('El porcentaje es: '||v_porcentaje);
END;
/
Ya solo es cuestión que revises los calculos. Soy de Colombia y no tengo idea de que hablas