如何从 Java 中的 Oracle SQL 选择中获取原始脚本输出而不是查询结果

Posted

技术标签:

【中文标题】如何从 Java 中的 Oracle SQL 选择中获取原始脚本输出而不是查询结果【英文标题】:How do I get the raw script output instead of the query result from an Oracle SQL select in Java 【发布时间】:2018-01-31 21:22:55 【问题描述】:

我需要通过 Java 应用程序将一些数据备份为 INSERT 语句。我在 SQL Developer 中能找到的最直接的方法是使用 /*insert*/ 运行选择。

例如:

SELECT /*insert*/ * FROM table_name WHERE col_a = 1 AND col_b = 2;

如果我在 SQL Developer 中将此查询作为脚本 (F5) 运行,我会得到我需要的结果。问题是我找不到从我的 Java 应用程序中将这个查询作为脚本运行并将 DB 文本输出返回给程序的方法。我想将脚本输出作为字符串接收,然后将其打印到文件中。

通常我使用JdbcTemplatePreparedStatementCreator 运行所有查询,但JdbcTemplate 中的所有方法似乎都需要某种行映射来将查询内容传输到对象的属性。

【问题讨论】:

将查询结果转换为INSERT 语句是SQL Developer 所做的事情,而不是数据库。您必须编写自己的逻辑来将 ResultSet 数据转换为 INSERT 语句。 @Andreas 谢谢你的回答。我选择听从您的建议并实现了一个行映射器,它将结果集中的行作为插入语句输出。我认为这不是最优雅的解决方案,但它确实有效。 【参考方案1】:

正如所指出的,/*insert*/ 是一个 sqldev / sqlcl 功能。但是,您可以将 SQLcl 包含到您的 java 代码中并调用这些功能。这是一个获取插入语句的示例。然后运行它们:

sqlcl.setStmt(<SCRIPTOUTPUTHERE>);
sqlcl.run();

我在这里写了一篇关于它的博客文章:

http://krisrice.io/2016-11-15-sqlcl-as-library-in-existing-programs/

Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@//localhost:1521/XE","klrice","klrice");

//#get a DBUtil but won't actually use it in this example
DBUtil util = DBUtil.getInstance(conn);

//#create sqlcl
ScriptExecutor sqlcl = new ScriptExecutor(conn);
ByteArrayOutputStream bout = new ByteArrayOutputStream();
BufferedOutputStream buf = new BufferedOutputStream(bout);
sqlcl.setOut(buf);

//#setup the context
ScriptRunnerContext ctx = new ScriptRunnerContext();

//#set the context
sqlcl.setScriptRunnerContext(ctx);
ctx.setBaseConnection(conn);

//#change the format
sqlcl.setStmt("set sqlformat insert");
sqlcl.run();

//#run the sql
sqlcl.setStmt("select * from user_objects");
sqlcl.run();

String results = bout.toString("UTF8");
System.out.println(results);

【讨论】:

嗨,克里斯,在分享您自己的东西的链接时,请务必明确声明归属! 未来肯定会更详细。 您的回答似乎很好。然而,我最终实现了我自己的“as insert”输出生成器。我会接受这个答案,因为您指出的图书馆似乎确实解决了这个问题,除了提供其他几种可能性。非常感谢。

以上是关于如何从 Java 中的 Oracle SQL 选择中获取原始脚本输出而不是查询结果的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 java.sql 包中的 rs.getSQLXML() 函数从 Oracle 数据库中获取 XMLType 列?

如何从表中选择带有 oracle sql 中的 group by 子句的嵌套 json 对象?

如何从 oracle sql 中只选择 1 行?

如何从 T-SQL 中的表中选择前 N 行?

从Oracle SQL中的每个组中选择具有最大值的行[重复]

如何使用参数从 Oracle PL/SQL 执行 Java jar 文件?