2017-08-11 119 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有时可能会引发不支持的动作(或类似的东西)异常。 –