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;
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.
- L'istruzione <%=odiRef.getSession( "SESS_NO" )%> restituisce ID di esecuzione del mapping o altro oggetto collegato in KO alla procedura.
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