2017-08-11 6 views
1

J'utilise Mirth Connect 3.5.0.8232. J'ai créé une connexion persistante à une base de données Oracle et l'utilise dans mes connecteurs source et de destination. L'une des méthodes fournies par Mirth pour parler avec la base de données est executeUpdateAndGetGeneratedKeys. Ce serait très utile pour les instructions d'insertion qui retourneraient les clés primaires pour les lignes insérées.mirth connect utilisation de executeUpdateAndGetGeneratedKeys avec Oracle

Ma question est - comment spécifier quelles colonnes retourner? L'exécution de la fonction fournie fonctionne, mais retourne ROWID dans le CachedRowSet, ce qui n'est pas ce que je veux. Dans la mesure où j'ai compris, les colonnes à retourner dépendent du type de la base de données, et chaque base de données se comporte différemment. Je suis intéressé par Oracle spécifiquement.

Merci.

Répondre

1

La méthode executeUpdateAndGetGeneratedKeys utilise l'indicateur Statement.RETURN_GENERATED_KEYS pour signaler au pilote que les clés générées automatiquement doivent être renvoyées. Cependant, à partir du Oracle docs:

Si des colonnes clés ne sont pas explicitement indiqué, alors les pilotes JDBC d'Oracle ne peuvent pas identifier les colonnes doivent être récupérées. Lorsqu'un nom de colonne ou un tableau d'index de colonnes est utilisé, les pilotes Oracle JDBC peuvent identifier les colonnes contenant les clés générées automatiquement que vous souhaitez récupérer. Toutefois, lorsque l'indicateur d'entier Statement.RETURN_GENERATED_KEYS est utilisé, les pilotes Oracle JDBC ne peuvent pas identifier ces colonnes. Lorsque l'indicateur d'entier est utilisé pour indiquer que les clés générées automatiquement doivent être renvoyées, la pseudo colonne ROWID est renvoyée en tant que clé. Le ROWID peut ensuite être récupéré à partir de l'objet ResultSet et peut être utilisé pour extraire d'autres colonnes.

Ainsi, au lieu, essayez d'utiliser leur suggestion de passer dans un tableau de nom de colonne prepareStatement:

var dbConn; 

try { 
    dbConn = DatabaseConnectionFactory.createDatabaseConnection('oracle.jdbc.driver.OracleDriver','jdbc:oracle:thin:@localhost:1521:DBNAME','user','pass'); 

    // Create a Java String array directly 
    var keyColumns = java.lang.reflect.Array.newInstance(java.lang.String, 1); 
    keyColumns[0] = 'id'; 
    var ps = dbConn.getConnection().prepareStatement('INSERT INTO tablename (columnname) VALUES (?)', keyColumns); 

    try { 
     // Set variables here 
     ps.setObject(1, 'test'); 
     ps.executeUpdate(); 

     var result = ps.getGeneratedKeys(); 
     result.next(); 
     var generatedKey = result.getObject(1); 

     logger.info(generatedKey); 
    } finally { 
     ps.close(); 
    } 
} finally { 
    if (dbConn) { 
     dbConn.close(); 
    } 
} 
+0

Merci, Nick - merci pour le code aussi - je l'ai vu aussi que getGeneratedKeys peut parfois jeter l'action non pris en charge (ou quelque chose comme ça) exception. –