TransWikia.com

¿Por que mi Stored Procedure en MySql esta ignorando un Else?

Stack Overflow en español Asked by user183157 on December 30, 2021

def NOMBRE(LISTA_DE_PARAMETROS):
"""DOCSTRING_DE_FUNCION"""
SENTENCIAS
RETURN [EXPRESION]

def hola(arg):
… """El docstring de la función"""
… print "Hola", arg, "!"

hola("Plone")
Hola Plone !

One Answer

El problema que tienes es que al estar por separado el evaluar IF CONTEO2 = 0 THEN... cuando esto se cumpla, sin importar donde entre en IF CONTEO = 1 THEH ... ELSE ... en cualquiera te devolverá PRESULTADO = 'DESHABILITADO'; ahora bien lo que debes hacer (mi sugerencia) es lo siguiente:

CREATE DEFINER=`n_devsacfi`@`%` PROCEDURE `INHA_SP_LOGIN`(
    IN PUSU VARCHAR(50),
    IN PCONTRA VARCHAR(50),
    IN IP VARCHAR(20),
    OUT PRESULTADO VARCHAR(20)
    #OUT USUARIO VARCHAR(50),
    #OUT ROL VARCHAR(100)
)
BEGIN
    DECLARE CONTEO /*, CONTEO2, CONTEO3*/ INT; /* Con una sola variable */
    /*CHECAR SI ES USUARIO ACTIVO*/
    /* Lo primero es revisar que los datos de autenticación proporcionados corresponde a un usuario */
    SELECT COUNT(*) INTO CONTEO FROM INHA_DET_CFGUSUARIOS WHERE CUSU_CUSUARIO = PUSU AND CUSU_CCONTRASENIA = PCONTRA /*AND CUSU_NESTATUSUSUARIO  = 1*/;  /* No checar si esta o no activo */
    /*CHECAR SI ES USUARIO INACTIVO*/
    /* SELECT COUNT(*) INTO CONTEO2 FROM INHA_DET_CFGUSUARIOS WHERE CUSU_CUSUARIO = PUSU AND CUSU_CCONTRASENIA = PCONTRA AND CUSU_NESTATUSUSUARIO  = 0; */ /* Ya no ejecutar esto aquí */

    IF CONTEO = 1 THEN
        /* Aquí llega si los datos de autenticación son correctos */
        /* Ahora verificas el "CUSU_NESTATUSUSUARIO" */
        SELECT COUNT(*) INTO CONTEO FROM INHA_DET_CFGUSUARIOS WHERE CUSU_CUSUARIO = PUSU AND CUSU_CCONTRASENIA = PCONTRA AND CUSU_NESTATUSUSUARIO  = 1;
        IF CONTEO=1 THEN
            SELECT US.CUSU_CUSUARIO AS USUARIO , USUROL.CUSR_NIDROL AS ROL
            FROM INHA_DET_CFGUSUARIOS US
            INNER JOIN INHA_DET_CFGUSUROL USUROL ON USUROL.CUSR_NIDUSUARIO = US.CUSU_NIDUSUARIO
            INNER JOIN INHA_MST_CFGROLES ROLS ON ROLS.CFRO_NIDROL = USUROL.CUSR_NIDROL  WHERE US.CUSU_CUSUARIO = PUSU AND US.CUSU_CCONTRASENIA = PCONTRA AND US.CUSU_NESTATUSUSUARIO  = 1; 
            SET PRESULTADO = 'OK';
        ELSE
            SELECT US.CUSU_CUSUARIO AS USUARIO , USUROL.CUSR_NIDROL AS ROL
            FROM INHA_DET_CFGUSUARIOS US
            INNER JOIN INHA_DET_CFGUSUROL USUROL ON USUROL.CUSR_NIDUSUARIO = US.CUSU_NIDUSUARIO
            INNER JOIN INHA_MST_CFGROLES ROLS ON ROLS.CFRO_NIDROL = USUROL.CUSR_NIDROL  WHERE US.CUSU_CUSUARIO = PUSU AND US.CUSU_CCONTRASENIA = PCONTRA OR US.CUSU_CCONTRASENIA <> PCONTRA  AND US.CUSU_NESTATUSUSUARIO  = 0; 
            SET PRESULTADO = 'DESHABILITADO';
        END IF;
    ELSE
        /* Aquí llega si uno o ambos datos de autenticación es/son incorrecto(s) */
        /* Veo en casa caso siempre aplicas un consulta, verifica cual aplicaria aquì para tu caso */
        SELECT US.CUSU_CUSUARIO AS USUARIO , USUROL.CUSR_NIDROL AS ROL
        FROM INHA_DET_CFGUSUARIOS US
        INNER JOIN INHA_DET_CFGUSUROL USUROL ON USUROL.CUSR_NIDUSUARIO = US.CUSU_NIDUSUARIO
        INNER JOIN INHA_MST_CFGROLES ROLS ON ROLS.CFRO_NIDROL = USUROL.CUSR_NIDROL  WHERE US.CUSU_CCONTRASENIA != PCONTRA  /*AND US.CUSU_NESTATUSUSUARIO  = 1*/; 
        /* SET PRESULTADO = 'CONTRASEÑA'; */
        SET PRESULTADO = 'USUARIO Y/O CONTRASEÑA INCORRECTA'; /* Damos entender que uno o todos los datos de autenticación està(n) mal; por seguridad no decimos cual */
    END IF;

En el código que pegaste parece falta el END; del BEGIN no lo coloque para respetar lo que proporcionaste en su estructura.

La clave esta en partir de lo básico e ir a lo más especifico conforme quieras ser muy detallado en tu mensaje; lo que te comente era que tu código:

IF CONTEO = 1 THEN 
SELECT US.CUSU_CUSUARIO AS USUARIO , USUROL.CUSR_NIDROL AS ROL
FROM INHA_DET_CFGUSUARIOS US
INNER JOIN INHA_DET_CFGUSUROL USUROL ON USUROL.CUSR_NIDUSUARIO = US.CUSU_NIDUSUARIO
INNER JOIN INHA_MST_CFGROLES ROLS ON ROLS.CFRO_NIDROL = USUROL.CUSR_NIDROL  WHERE US.CUSU_CUSUARIO = PUSU AND US.CUSU_CCONTRASENIA = PCONTRA AND US.CUSU_NESTATUSUSUARIO  = 1; 
SET PRESULTADO = 'OK';
ELSE
SELECT US.CUSU_CUSUARIO AS USUARIO , USUROL.CUSR_NIDROL AS ROL
FROM INHA_DET_CFGUSUARIOS US
INNER JOIN INHA_DET_CFGUSUROL USUROL ON USUROL.CUSR_NIDUSUARIO = US.CUSU_NIDUSUARIO
INNER JOIN INHA_MST_CFGROLES ROLS ON ROLS.CFRO_NIDROL = USUROL.CUSR_NIDROL  WHERE US.CUSU_CCONTRASENIA != PCONTRA  AND US.CUSU_NESTATUSUSUARIO  = 1; 
SET PRESULTADO = 'CONTRASEÑA';
END IF;

IF CONTEO2 = 0 THEN 
SELECT US.CUSU_CUSUARIO AS USUARIO , USUROL.CUSR_NIDROL AS ROL
FROM INHA_DET_CFGUSUARIOS US
INNER JOIN INHA_DET_CFGUSUROL USUROL ON USUROL.CUSR_NIDUSUARIO = US.CUSU_NIDUSUARIO
INNER JOIN INHA_MST_CFGROLES ROLS ON ROLS.CFRO_NIDROL = USUROL.CUSR_NIDROL  WHERE US.CUSU_CUSUARIO = PUSU AND US.CUSU_CCONTRASENIA = PCONTRA OR US.CUSU_CCONTRASENIA <> PCONTRA  AND US.CUSU_NESTATUSUSUARIO  = 0; 
SET PRESULTADO = 'DESHABILITADO';
END IF;

quedara de la siguiente forma:

IF CONTEO = 1 THEN 
SELECT US.CUSU_CUSUARIO AS USUARIO , USUROL.CUSR_NIDROL AS ROL
FROM INHA_DET_CFGUSUARIOS US
INNER JOIN INHA_DET_CFGUSUROL USUROL ON USUROL.CUSR_NIDUSUARIO = US.CUSU_NIDUSUARIO
INNER JOIN INHA_MST_CFGROLES ROLS ON ROLS.CFRO_NIDROL = USUROL.CUSR_NIDROL  WHERE US.CUSU_CUSUARIO = PUSU AND US.CUSU_CCONTRASENIA = PCONTRA AND US.CUSU_NESTATUSUSUARIO  = 1; 
SET PRESULTADO = 'OK';
ELSEIF CONTEO2 = 0 THEN 
SELECT US.CUSU_CUSUARIO AS USUARIO , USUROL.CUSR_NIDROL AS ROL
FROM INHA_DET_CFGUSUARIOS US
INNER JOIN INHA_DET_CFGUSUROL USUROL ON USUROL.CUSR_NIDUSUARIO = US.CUSU_NIDUSUARIO
INNER JOIN INHA_MST_CFGROLES ROLS ON ROLS.CFRO_NIDROL = USUROL.CUSR_NIDROL  WHERE US.CUSU_CUSUARIO = PUSU AND US.CUSU_CCONTRASENIA = PCONTRA OR US.CUSU_CCONTRASENIA <> PCONTRA  AND US.CUSU_NESTATUSUSUARIO  = 0; 
SET PRESULTADO = 'DESHABILITADO';
ELSE
SELECT US.CUSU_CUSUARIO AS USUARIO , USUROL.CUSR_NIDROL AS ROL
FROM INHA_DET_CFGUSUARIOS US
INNER JOIN INHA_DET_CFGUSUROL USUROL ON USUROL.CUSR_NIDUSUARIO = US.CUSU_NIDUSUARIO
INNER JOIN INHA_MST_CFGROLES ROLS ON ROLS.CFRO_NIDROL = USUROL.CUSR_NIDROL  WHERE US.CUSU_CCONTRASENIA != PCONTRA  AND US.CUSU_NESTATUSUSUARIO  = 1; 
SET PRESULTADO = 'CONTRASEÑA';
END IF;

Pero en caso que se proporcione mal el usuario y/o contraseña (exista o no) tanto conteo como conteo2 serían 0 (cero) y reportarias. Bueno esto por lo que cheque.

Answered by RobertoLeOr on December 30, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP