JDBC 批量插入、返回 ID

2024-02-01

有没有办法使用 RETURNING INTO 获取受影响行的值? 我必须插入相同的行 x 次并获取插入行的 id。

该查询如下所示:

public static final String QUERY_FOR_SAVE =
        "DECLARE " +
           " resultId NUMBER ; " +
        "BEGIN " +
           " INSERT INTO x " +
           " (a, b, c, d, e, f, g, h, i, j, k, l, m)  " +
           " values (sequence.nextVal, :a, :b, :c, :d, :e, :f, :g, :h, :i, :j, :k, :l) " +
           " RETURNING a INTO :resultId;" +
        "END;";

现在我可以使用 addBatch 在 JAVA 循环中将此查询添加到批处理中

            IntStream.range(0, count)
                .forEach(index -> {
                    try {
                        setting parameters...
                        cs.addBatch();

                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                });
        cs.executeBatch();

有什么方法可以像这样从批处理中返回数组或列表吗? 我可以仅使用 sql 执行这些插入 x 次,但在这种情况下,我还想知道如何返回 ids 数组。

提前致谢


我假设这是关于 Oracle 的。据我所知,这是不可能的,但您可以使用以下命令运行批量插入FORALL在您的匿名 PL/SQL 块中,正如我最近写的这篇文章中所述:https://blog.jooq.org/2018/05/02/how-to-run-a-bulk-insert-returning-statement-with-oracle-and-jdbc/ https://blog.jooq.org/2018/05/02/how-to-run-a-bulk-insert-returning-statement-with-oracle-and-jdbc/

这是文章中的一个独立的 JDBC 示例,它插入一个值数组并将结果批量收集回 JDBC 客户端:

try (Connection con = DriverManager.getConnection(url, props);
    Statement s = con.createStatement();

    // The statement itself is much more simple as we can
    // use OUT parameters to collect results into, so no
    // auxiliary local variables and cursors are needed
    CallableStatement c = con.prepareCall(
        "DECLARE "
      + "  v_j t_j := ?; "
      + "BEGIN "
      + "  FORALL j IN 1 .. v_j.COUNT "
      + "    INSERT INTO x (j) VALUES (v_j(j)) "
      + "    RETURNING i, j, k "
      + "    BULK COLLECT INTO ?, ?, ?; "
      + "END;")) {

    try {

        // Create the table and the auxiliary types
        s.execute(
            "CREATE TABLE x ("
          + "  i INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY,"
          + "  j VARCHAR2(50),"
          + "  k DATE DEFAULT SYSDATE"
          + ")");
        s.execute("CREATE TYPE t_i AS TABLE OF NUMBER(38)");
        s.execute("CREATE TYPE t_j AS TABLE OF VARCHAR2(50)");
        s.execute("CREATE TYPE t_k AS TABLE OF DATE");

        // Bind input and output arrays
        c.setArray(1, ((OracleConnection) con).createARRAY(
            "T_J", new String[] { "a", "b", "c" })
        );
        c.registerOutParameter(2, Types.ARRAY, "T_I");
        c.registerOutParameter(3, Types.ARRAY, "T_J");
        c.registerOutParameter(4, Types.ARRAY, "T_K");

        // Execute, fetch, and display output arrays
        c.execute();
        Object[] i = (Object[]) c.getArray(2).getArray();
        Object[] j = (Object[]) c.getArray(3).getArray();
        Object[] k = (Object[]) c.getArray(4).getArray();

        System.out.println(Arrays.asList(i));
        System.out.println(Arrays.asList(j));
        System.out.println(Arrays.asList(k));
    }
    finally {
        try {
            s.execute("DROP TYPE t_i");
            s.execute("DROP TYPE t_j");
            s.execute("DROP TYPE t_k");
            s.execute("DROP TABLE x");
        }
        catch (SQLException ignore) {}
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

JDBC 批量插入、返回 ID 的相关文章

  • INNER JOIN 可用作 SELECT,但不能用作 DELETE [重复]

    这个问题在这里已经有答案了 为什么这个有语法错误 DELETE FROM print mailing request pmr INNER JOIN person p ON p id pmr person AND p email LIKE T
  • MySQL 中的 UDF 性能

    我注意到 当查询在 SELECT 或 WHERE 子句中调用 UDF 时 MySQL 查询执行时间的性能会呈指数级下降 有问题的 UDF 查询本地表以返回标量值 因此它们不仅执行算术表达式 而且充当相关子查询 我通过简单地删除 UDF 并使
  • 使用 xmlagg 时出现子查询错误和太多值

    我在连接许多大型表中的所有数据时遇到问题 我昨天对此提出了问题 但不幸的是 listagg 似乎不是一个好的选择 链接子查询返回多行 https stackoverflow com questions 54651144 subquery r
  • SQL 插入失败 - 违反主键约束

    我在 SQL Insert 语句中看到一个非常奇怪的问题 我有一个简单的表 带有一个 ID 和 2 个日期时间 请参阅下面的创建脚本 CREATE TABLE dbo DATA POPULATION LOGS ID int IDENTITY
  • 如何将整行(在 SQL 中,而不是 PL/SQL 中)传递给存储函数?

    我遇到以下 非常简单 问题 我想编写一个 Oracle SQL 查询 大致如下 SELECT count MyFunc MyTable FROM MyTable GROUP BY MyFunc MyTable 在 PL SQL 中 可以使用
  • 如何在sqlite中添加特定数量的空行?

    我有一个SQLite文件 我想添加2550 empty NULL rows 我可以使用此代码添加一个空行 INSERT INTO my table DEFAULT VALUES 但我需要 2550 行 有什么捷径吗 我不想执行相同的代码 2
  • 在 Doctrine DQL 中选择 count() ,并使用左连接多对多单向关系,其中用户没有关系特定组

    情况 我尝试在 DQL 中为不属于特定组的用户选择 count 标准ManyToMany之间的单向关系User and Group实体来自FOSUserBundle and SonataUserBundle 系统 Symfony 2 5 D
  • SQLite 条件 ORDER BY 中的 DESC

    我需要选择按以下逻辑排序的记录 但是当 DESC 处于条件中时 SQLite 会引发错误 ORDER BY CASE WHEN parentGUID IS NULL THEN datePosted DESC ELSE datePosted
  • 如何将 SQL“LIKE”与 LINQ to Entities 结合使用?

    我有一个文本框 允许用户指定搜索字符串 包括通配符 例如 Joh Johnson mit ack on 在使用 LINQ to Entities 之前 我有一个存储过程 该存储过程将该字符串作为参数并执行以下操作 SELECT FROM T
  • Netezza SQL 将 VARCHAR 转换为二进制字符串

    我有一个位图存储为VARCHAR在内特扎 需要转换一下VARCHAR转换为 Netezza 中的二进制字符串 输入 Netezza col 值 VARCHAR 0xFFFFFFFFFFFFFFFF 期望的输出 VARCHAR gt 1111
  • MySql 复合索引

    我们使用 MySql 作为我们的数据库 以下查询在 mysql 表 大约 2500 万条记录 上运行 我在这里粘贴了两个查询 查询运行得太慢 我想知道更好的复合索引是否可以改善这种情况 你知道最好的综合指数是什么吗 并建议我这些查询是否需要
  • PLSQL 中的时区转换

    我需要将系统日期和时间转换为特定时区 例如东部时间 我无法假设我当前的时区 如何在plsql中转换它 请帮我 假设你有一个TIMESTAMP WITH TIME ZONE 例如systimestamp 您可以使用AT TIME ZONE句法
  • 当您执行“SELECT *”时,SQL Server 如何确定列的顺序?

    当您执行以下操作时 SQL Server 如何确定列的顺序SELECT 我知道 订购依据 对于订购至关重要data 但我预计列名保持一致 注意 我的代码是not取决于返回列的实际顺序 我只想知道 SQL Server 如何决定对列名进行排序
  • 嵌入定义绑定变量的 Oracle PL/SQL 代码的 Shell 脚本

    如果我运行下面的脚本 我会收到错误SP2 0552 未声明绑定变量 OUTRES 那么 如何定义绑定变量OUTRES以及在哪里定义呢 usr bin bash sqlplus s scott tiger lt lt EOF declare
  • 表被指定两次作为 INSERT 的目标和单独的数据源

    我做了这个查询 但它给了我错误 就像标题中一样 INSERT INTO data waktu vaksinasi id binatang id vaksin tanggal vaksin status vaksin VALUES 1 1 S
  • JDBC 连接关闭与中止

    我问了这个问题 如何调用 java sql Connection abort https stackoverflow com questions 51752254 how do i call java sql connectionabort
  • SQL最近的命令?微软SQL

    我只是编写一个查询来查看我的客户数据库并列出他们下了多少订单等 我正在努力添加到此查询中的是只显示该电子邮件的最新 OrderID 有任何想法吗 这是我的查询 select top 1000 BuyerEMail COUNT HowMany
  • 自定义 Sql Server 对象资源管理器右键单击菜单项

    如何在 Sql Server 2012 的对象资源管理器中添加或自定义右键菜单项 例如 我想将新项目添加到表右键菜单中以生成自定义表创建器脚本 您可以编写一个 SSMS 加载项 See http sqlblogcasts com blogs
  • JDBC元数据检索约束信息

    我需要来自约束名称的有关表和列名称的信息 是否存在类似于connection getMetadata getX的人来检索约束信息 我的测试用例在Oracle数据库中 但我最好的解决方案只是想用jdbc来解决 如果您正在谈论外键和主键约束 这
  • 针对 SqlClient 的 getschema("foreignkeys") 未产生足够的信息

    我需要两个表和两组字段 而不是外键名称和其中一个表名称 有谁知道如何查询SQL Server完整的外键信息 谢谢 这可能是一项复杂的冒险 GetSchema 和 INFORMATION SCHEMA 视图不完整 导致需要直接查询 sys 视

随机推荐

  • 如何使用输入重定向回表单 - Laravel 5

    如何使用给定的内容重定向回我的表单页面POSTparams 如果我的表单操作抛出异常 您可以使用以下内容 return Redirect back gt withInput Input all 如果您正在使用表单请求验证 http lara
  • CORS 策略阻止从源“null”访问“file:///sample.txt”处的 XMLHttpRequest:仅协议方案支持 CORS [重复]

    这个问题在这里已经有答案了 我是 AJAX 新手 目前正在学习它的基础知识 在我的 html 文件中 点击提交按钮时 我只是尝试记录与 html 文件本身位于同一目录中的文本文件的文本 但我收到了一个错误 从源 null 访问 file D
  • 如何交替选择每两个元素?

    我想选择每两行并以该模式交替和重复 我如何使用 CSS 来做到这一点 例如 蓝色行 1 2 5 6 9 10 红行 3 4 7 8 ul list style type none color white li nth of type odd
  • Sybase SQL 基于具有 ID 的多个列选择不同

    我正在尝试查询 sybase 服务器以获取我们出于测试目的而保存的不同类型数据的示例 我有一张如下所示的表格 摘要 Animals table id type breed name 1 dog german shepard Bernie 2
  • 如何在 Laravel 框架中以最少的时间浪费从数据库中取出一个普通数组中的所有单词?

    我想将数据库中的所有单词放入默认数组 我的数据库里有超过 50 000 个单词 这个数字很可能达到一百万 因此 我希望这个手术不需要花费太多时间 我尝试了这样的方法 其中不将任何单词放入通常的数组中 也就是说 单词被传递到关联数组 word
  • Excel VBA - 查找带有通配符的字符串

    我试图查找包含通配符的字符串 我需要找到该字符串在特定行中出现的位置 该字符串均采用 IP W XX 的形式 其中 XX 是我用来查找值的 2 个字母 是可以是任何随机数的数字通配符 因此 这就是我的查找字符串的样子 FullLookUpS
  • SQLAlchemy - 什么是 declarative_base

    我在学习sqlalchemy 这是我的初始代码 user py from sqlalchemy import Column Integer Sequence String from sqlalchemy ext declarative im
  • 可以在 C++ 中创建单例结构吗?如何?

    当我了解更多关于编码的知识时 我喜欢进行尝试 我有一个程序 在其运行时的生命周期中只需要一个结构的单个实例 并且想知道是否可以创建一个单例结构 我在互联网上看到很多有关创建单例类的信息 但没有看到有关创建单例结构的信息 这可以做到吗 如果是
  • 如何使用C++连接mySQL数据库

    我正在尝试从我的网站连接数据库并使用 C 显示一些行 所以基本上我正在尝试创建一个应用程序 从我的站点数据库的表中执行选择查询 现在 这一定是可能的 因为我已经看到大量的应用程序这样做了 我该怎么做呢 有人可以举个例子并告诉我应该使用哪些库
  • 如何在SQL Server中显示小数点后两位数

    我有一个表 其中有一列float数据类型输入SQL Server我想归还我的float具有 2 位小数的数据类型列值 例如 如果我插入12 3 它应该返回12 30 如果我插入12 它应该返回12 00 select cast your f
  • 使用 strope js 基于 Javascript 的 XMPP 聊天客户端 - 示例和教程? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我想制作一个简单的基于 javascript 的 XMPP 客户端 我偶然发现了 strope js
  • MYSQL - 使用联接删除查询

    我已经检查了已回答的问题 但是 解决方案对我不起作用 DELETE FROM TEST2 INNER JOIN TEST1 on TEST1 FIELD2 TEST2 FIELD2 WHERE TEST1 FIELD1 22 当我执行此查询
  • Bash 中循环遍历带有空格的目录

    在 bash 脚本中 我想迭代当前工作目录中的所有目录并对它们执行操作 它们可能包含特殊符号 尤其是空格 我怎样才能做到这一点 我有 for dir in ls l do if d dir 但这会跳过我的名称中带有空格的目录 任何帮助表示赞
  • 通过 AutoMapper 将 IList 映射到 ICollection

    public class Order public int OrderId get set public string OrderCode get set public IList
  • 选择元素上的省略号在 IE9 和 Chrome 中不起作用

    我有一个具有指定宽度的选择列表 文本溢出 省略号仅适用于 Firefox v15 它不适用于 IE7 IE9 和 Chrome IE7 IE 9 和 Chrome 是否支持文本溢出 省略号 如果是的话 我在这里缺少什么 有没有办法获得类似的
  • 当返回对象的函数在没有 return 语句的情况下结束时会发生什么

    在 C 中 当应该返回对象的函数在没有 return 语句的情况下结束时会发生什么 返回什么 e g std string func 返回什么 我们不知道 根据标准 该行为是未定义的 6 6 3 2 返回语句 stmt return htt
  • AVPlayer 在 iOS 10 上无法立即播放视频,而仅播放音频

    我正在使用 AVAssetExportSession 创建视频并在完成后播放视频 但视觉部分没有立即显示 而只有音频立即播放 视觉部分在大约 20 30 秒的延迟后出现 这是我播放视频的代码 void playUrl NSURL vUrl
  • Google应用程序引擎,静态文件的最大数量?

    我正在谷歌应用程序引擎中开发一个应用程序 它将具有用户配置文件类型的功能 我在浏览Google App的在线教程时发现静态文件 应用程序文件和静态文件 的最大数量不应超过3000 我担心当用户数量增加时用户是否能够上传他们的图像 此限制仅适
  • VBScript 将文件上传到 SharePoint DocLib

    我正在尝试自动将文件上传到 SharePoint 文档库 我已经看过无数的帖子 在这个论坛和其他论坛上 但似乎找不到有用的东西 我并不是真正的开发人员 尽管我已经完成了一些简单的 VBA 和 VB 脚本 我正在寻找的是一种自动将文件 特别是
  • JDBC 批量插入、返回 ID

    有没有办法使用 RETURNING INTO 获取受影响行的值 我必须插入相同的行 x 次并获取插入行的 id 该查询如下所示 public static final String QUERY FOR SAVE DECLARE result