2017-08-11 50 views
1

我正在使用Mirth Connect 3.5.0.8232。我創建了一個到Oracle數據庫的持久連接,並在我的源和目標連接器中使用它。 Mirth提供的與數據庫交談的方法之一是executeUpdateAndGetGeneratedKeys。對於將返回插入行的主鍵的插入語句來說,這將非常有用。歡迎使用executeUpdateAndGetGeneratedKeys和Oracle

我的問題是 - 你如何指定WHICH列返回?運行提供的函數可以工作,但在CachedRowSet中返回ROWID,這不是我想要的。

據我瞭解,要返回的列取決於數據庫的類型,並且每個數據庫的行爲都有所不同。我特別對Oracle感興趣。

謝謝。

回答

1

executeUpdateAndGetGeneratedKeys方法使用Statement.RETURN_GENERATED_KEYS標誌向驅動程序發信號通知應該返回自動生成的密鑰。但是,從Oracle docs

如果未明確指示鍵列,則Oracle JDBC驅動程序無法識別需要檢索哪些列。當使用列名稱或列索引數組時,Oracle JDBC驅動程序可以識別哪些列包含要檢索的自動生成的鍵。但是,使用Statement.RETURN_GENERATED_KEYS整數標誌時,Oracle JDBC驅動程序無法識別這些列。當使用整數標誌指示要返回自動生成的密鑰時,僞列將作爲關鍵字返回。 ROWID然後可以從ResultSet對象中獲取,並可用於檢索其他列。

因此,不是,嘗試使用他們傳遞一個列名數組的建議,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

謝謝你,尼克 - 感謝代碼太 - 我也看到的getGeneratedKeys有時可能會引發不支持的動作(或類似的東西)異常。 –