es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

createStoredProcedureQuery – ¿devolviendo valor incorrecto? En la función “createStoredProcedureQuery” se está experimentando un problema donde se obtiene un valor incorrecto como resultado.

Tenemos este problema extremadamente extraño. Vemos que al llamar a un código Oracle PL/SQL (procedimiento almacenado ORACLECALCPRINTER_STATUS) desde Java, a veces devuelve resultados incorrectos…

Cuando llamamos a la misma función desde SQLDeveloper, obtenemos los resultados correctos… En Java, el 99% de las veces obtenemos los resultados correctos, pero hay momentos en los que no obtenemos los resultados correctos…

Estaba pensando que tal vez sea la forma en que llamamos al código PL/SQL, no cerrando algo correctamente, lo que causa algún tipo de problema de memoria intermedia / excepción extraña?

Pero no vemos ninguna excepción en los registros, vemos que el procedimiento almacenado devuelve un valor incorrecto. Es un valor posible en el procedimiento almacenado, pero no para la combinación de entradas enviadas…

Espero que puedan compartir algo para ayudar a depurar este esquivo problema.

StoredProcedureQuery oracleCalcPrntrStatus = 
            entityManager.createStoredProcedureQuery(ORACLE_CALC_PRINTER_STATUS)
                        .registerStoredProcedureParameter(1, String.class, ParameterMode.IN)
                        .registerStoredProcedureParameter(2, String.class, ParameterMode.IN)
                        .registerStoredProcedureParameter(3, String.class, ParameterMode.IN)
                        .registerStoredProcedureParameter(4, String.class, ParameterMode.OUT)
                        .setParameter(1, printerType)
                        .setParameter(2, printerId)
                        .setParameter(3, location);
    try {
        oracleCalcPrntrStatus.execute();             
        finalStatus = (String) oracleCalcPrntrStatus.getOutputParameterValue(4);
    } catch (Exception e) {
        logger.error(message, e);               
    } finally {
        oracleCalcPrntrStatus.unwrap(ProcedureOutputs.class).release();
    }

Esqueleto del procedimiento almacenado:

create or replace PROCEDURE  ORACLE_CALC_PRINTER_STATUS(PRINTER_TYPE    IN VARCHAR2, 
                                                        PRINTER_ID      IN VARCHAR2, 
                                                        LOCATION        IN VARCHAR2, 
                                                        FINAL_STATUS    OUT VARCHAR2)
AS
EXCEPTION_STR EXCEPTION;
BEGIN
    IF TRIM(UPPER(PRINTER_TYPE))='XEROX' THEN        
        ORACLE_CALC_PRINTER_STATUS_IN(PRINTER_TYPE,PRINTER_ID,LOCATION,FINAL_STATUS);
    ELSE
        RAISE EXCEPTION_STR;
    END IF;
EXCEPTION
    WHEN EXCEPTION_STR THEN
        DBMS_OUTPUT.PUT_LINE(SQLERRM);
END;

ACTUALIZACIÓN: Se corrigió la falta de IF/ELSE.

Por favor, comprenda que el código PL/SQL es extenso e imposible de publicar en su totalidad, pero lo probamos en la base de datos con los mismos parámetros y parece que se ejecuta correctamente.

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Posibles soluciones para depurar el problema:

    1. Asegúrese de que las entradas que se envían desde Java y SQL Developer sean exactamente las mismas. Cualquier variación mínima podría causar que el procedimiento almacenado devuelva resultados incorrectos.

    2. Intente depurar el código estableciendo puntos de interrupción y recorriéndolo paso a paso para ver si hay algún cambio inesperado en los valores de las variables.

    3. Verifique si hay incompatibilidades de tipos de datos entre el código de Java y el procedimiento almacenado. Asegúrese de que los tipos de datos sean los mismos y de que los datos se estén pasando correctamente.

    4. Dado que el problema es intermitente, podría estar relacionado con algún factor ambiental, como la carga en el sistema o problemas de red. Intente aislar el problema ejecutando las pruebas con diferentes parámetros y monitoreando el rendimiento del sistema.

    5. Intente registrar la entrada y salida del procedimiento almacenado en un archivo, para verificar si se están pasando y devolviendo los valores correctos.

    6. Es posible que haya un error en el procedimiento almacenado. Puede ser útil revisar el código y probarlo de forma aislada para asegurarse de que esté manejando todos los parámetros de entrada correctamente.

    7. Verifique si la base de datos tiene instalados los últimos parches y actualizaciones, ya que podría tratarse de un problema conocido que se ha solucionado en un parche posterior.

    8. Dado que no se están registrando excepciones, es posible que el procedimiento almacenado no esté lanzando ninguna excepción. Asegúrese de capturar todas las posibles excepciones y registrarlas, para agregar más rastreabilidad al problema.

    9. Verifique dos veces si la conexión a la base de datos se está cerrando correctamente después de cada llamada. Dejar conexiones abiertas podría causar problemas en la ejecución del procedimiento almacenado.

    10. Intente ejecutar el procedimiento almacenado directamente desde Java, sin utilizar JPA, para ver si esto marca alguna diferencia. Esto ayudaría a eliminar cualquier problema relacionado con JPA.

Comments are closed.