giovedì 19 febbraio 2026

ODI - Procedura per gestione Errori

 Di seguito una semplice procedura da inserire in ODI per gestire l'uscita da un package con errore.

DECLARE

v_sess_no NUMBER := <%=odiRef.getSession( "SESS_NO" )%>;v_error_msg VARCHAR2(4000);v_error_code NUMBER;BEGIN

v_error_msg:='Errore nel package CLOUDERA_TO_APEX_PI: ODI_SESSION_ID='||v_sess_no;RAISE_APPLICATION_ERROR(-20001, v_error_msg);

EXCEPTION WHEN NO_DATA_FOUND THEN    v_error_msg:='Errore nel package CLOUDERA_TO_APEX_PI: ODI_SESSION_ID='||v_sess_no;    RAISE_APPLICATION_ERROR(-20001, v_error_msg);WHEN OTHERS THEN    v_error_msg:='Errore nel package CLOUDERA_TO_APEX_PI: ODI_SESSION_ID='||v_sess_no;    RAISE_APPLICATION_ERROR(-20001, v_error_msg);END;

La proceduta deve essere inserita o in un package o LoadPlan per l'uscita dal processo in caso di un errore. Per farla funzionare basta collegare i KO in uscita da Mapping o altro alla procedura OD che contiene quanto indicato sopra.
  1. L'istruzione <%=odiRef.getSession( "SESS_NO" )%> restituisce ID di esecuzione del mapping o altro oggetto collegato in KO alla procedura.
Nel caso in cui si voglia parametrizzarla basta verificare le api di ODI o meglio le odiRef per ottenere eventualmente altre informazioni. 


Di seguito alcune versioni scritte in linguaggi differenti dal pl-sql

1. Se sei in un ODI Procedure con Tecnologia "Jython"

import java.sql.SQLException
import oracle.odi.core.persistence.transaction.support.DefaultTransactionDefinition

sess_no = odiRef.getSession("SESS_NO")
error_msg = "Errore nel package CLOUDERA_TO_APEX_PI: ODI_SESSION_ID=" + str(sess_no)

try:
    # Qui metti la logica che può fallire
    # Esempio: raise Exception("Test errore")
    pass
    
except Exception, e:
    # Logga l'errore
    odiRef.log("ERROR", error_msg + " | Dettaglio: " + str(e))
    # Rilancia l'errore a ODI per far fallire lo step
    raise Exception(error_msg)

2. Se sei in un ODI Procedure con Tecnologia "Java BeanShell"

import oracle.odi.runtime.agent.RuntimeAgent;
import oracle.odi.core.persistence.transaction.support.DefaultTransactionDefinition;

String sessNo = "<%=odiRef.getSession("SESS_NO")%>";
String errorMsg = "Errore nel package CLOUDERA_TO_APEX_PI: ODI_SESSION_ID=" + sessNo;

try {
    // Qui metti la logica che può fallire
    // Esempio: throw new Exception("Test errore");
    
} catch (Exception e) {
    // Log su ODI
    odiRef.log("ERROR", errorMsg + " | Dettaglio: " + e.getMessage());
    // Rilancia per far fallire il task ODI
    throw new RuntimeException(errorMsg, e);
}

3. Se vuoi replicare esattamente la RAISE_APPLICATION_ERROR PL/SQL da Java via JDBC.Usalo in un Java step che apre connessione al DB Oracle:

import java.sql.*;
import oracle.jdbc.OracleConnection;

String sessNo = "<%=odiRef.getSession("SESS_NO")%>";
String errorMsg = "Errore nel package CLOUDERA_TO_APEX_PI: ODI_SESSION_ID=" + sessNo;

Connection conn = null;
CallableStatement cs = null;

try {
    // Prendi la connessione da ODI
    conn = odiRef.getJDBCConnection("SRC"); // o "WORKREP" / "TGT" in base al logical schema
    
    // Chiama direttamente RAISE_APPLICATION_ERROR
    String sql = "BEGIN RAISE_APPLICATION_ERROR(-20001, ?); END;";
    cs = conn.prepareCall(sql);
    cs.setString(1, errorMsg);
    cs.execute();
    
} catch (SQLException e) {
    odiRef.log("ERROR", "SQLCODE: " + e.getErrorCode() + " - " + errorMsg);
    throw new RuntimeException(errorMsg, e);
} finally {
    if (cs != null) cs.close();
    if (conn != null) conn.close();
}

----
Note chiave:
Per ODI:odiRef.getSession("SESS_NO") funziona solo dentro step ODI. 
Fuori devi passarlo come parametro.
Per far fallire lo step: devi fare throw new Exception() o throw new RuntimeException(). 
ODI intercetta l'eccezione e marca lo step in errore.
  • odiRef.log("ERROR", msg) 
    • scrive nel log ODI, così vedi il tuo messaggio custom nell’Operator.Codice -20001: 
    • Se lanci RuntimeException, ODI lo marca come errore generico. 
    • Se vuoi il codice -20001 nel log devi usare la versione 3 con RAISE_APPLICATION_ERROR via JDBC.

Nessun commento:

Posta un commento