当前位置: 首页 > 面试题库 >

PLSQL JDBC:如何获取最后一行ID?

红经亘
2023-03-14
问题内容

这个SQL Server片段的PLSQL(Oracle)等效项是什么?

BEGIN TRAN
INSERT INTO mytable(content) VALUES ("test") -- assume there's an ID column that is autoincrement
SELECT @@IDENTITY
COMMIT TRAN

在C#中,您可以调用myCommand.ExecuteScalar()来检索新行的ID。

如何在Oracle中插入新行,并让JDBC获得新ID的副本?

编辑: BalusC提供了一个很好的起点。由于某种原因,JDBC不喜欢命名参数绑定。这给出了“错误设置或注册的参数”
SQLException。为什么会这样呢?

        OracleConnection conn = getAppConnection();
        String q = "BEGIN INSERT INTO tb (id) values (claim_seq.nextval) returning id into :newId; end;" ;
        CallableStatement cs = (OracleCallableStatement) conn.prepareCall(q);
        cs.registerOutParameter("newId", OracleTypes.NUMBER);
        cs.execute();
        int newId = cs.getInt("newId");

问题答案:

通常,
您将使用Statement#getGeneratedKeys()此方法,但是到目前为止(仍然)Oracle
JDBC驱动程序不支持此方法。

最好的办法是 要么
化妆使用的CallableStatement一个RETURNING条款:

String sql = "BEGIN INSERT INTO mytable(id, content) VALUES (seq_mytable.NEXTVAL(), ?) RETURNING id INTO ?; END;";

Connection connection = null;
CallableStatement statement = null;

try {
    connection = database.getConnection();
    statement = connection.prepareCall(sql);
    statement.setString(1, "test");
    statement.registerOutParameter(2, Types.NUMERIC);
    statement.execute();
    int id = statement.getInt(2);
    // ...

在同一笔交易SELECT sequencename.CURRVAL后开火INSERT

String sql_insert = "INSERT INTO mytable(content) VALUES (?)";
String sql_currval = "SELECT seq_mytable.CURRVAL FROM dual";

Connection connection = null;
PreparedStatement statement = null;
Statement currvalStatement = null;
ResultSet currvalResultSet = null;

try {
    connection = database.getConnection();
    connection.setAutoCommit(false);
    statement = connection.prepareStatement(sql_insert);
    statement.setString(1, "test");
    statement.executeUpdate();
    currvalStatement = connection.createStatement();
    currvalResultSet = currvalStatement.executeQuery(sql_currval);
    if (currvalResultSet.next()) {
        int id = currvalResultSet.getInt(1);
    }
    connection.commit();
    // ...


 类似资料:
  • 问题内容: 我有pandas数据帧和(df1是vanila数据帧,df2由’STK_ID’和’RPT_Date’索引): 我可以通过以下方式获得df2的最后3行: 同时给所有行: 为什么呢 如何获取(没有索引的数据帧)的最后3行?熊猫0.10.1 问题答案: 别忘了!例如

  • 问题内容: 如何获取ArrayList的最后一个值? 我不知道ArrayList的最后一个索引。 问题答案: 以下是接口的一部分(由ArrayList实现): 是元素类型。如果列表为空,则抛出。你可以在此处找到整个API文档。

  • 问题内容: 如何使用PHP获取MySQL中最后更新的行的ID? 问题答案: 我找到了这个问题的答案:) *由aefxx *编辑 可以进一步扩展此技术以检索受更新语句影响的每一行的ID: 这将返回一个字符串,其中所有ID都由逗号连接。

  • 问题内容: 我想获取表中最后一个ID插入的值。我该怎么做? 问题答案: 好吧,我使用的解决方案是: 这将从插入数据库的最后一行获取id列:)

  • 问题内容: 当使用Email-ext插件时,我还想在其中写入构建日志的最后20行(未作为文件附加),我知道我可以使用$ BUILD_LOG变量访问日志,但不知道确切的方法该变量中的las 20行。有什么帮助吗?非常感谢。 问题答案: 您可以使用“内容令牌”参考中的以下语法: $ {BUILD_LOG,maxLines,escapeHtml} -显示构建日志的结尾。maxLines- 最多显示日志的

  • 问题内容: 我输入的是一个字符串。如何获得最后的路径段(在我的情况下是id)? 这是我的输入URL: 我必须获得我尝试过的ID: 但这是行不通的,并且肯定有更好的方法可以做到这一点。 问题答案: 是您要寻找的: 或者