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

Luc*_*cas 2 java sql database oracle jdbc

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

例如:

SELECT /*insert*/ * FROM table_name WHERE col_a = 1 AND col_b = 2;
Run Code Online (Sandbox Code Playgroud)

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

以往我跑我所有的查询JdbcTemplatePreparedStatementCreator,但在所有的方法JdbcTemplate似乎需要某种排映到查询内容到一个对象的属性转移.

Kri*_*ice 10

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

sqlcl.setStmt(<SCRIPTOUTPUTHERE>);
sqlcl.run();
Run Code Online (Sandbox Code Playgroud)

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

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);
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

  • 将来肯定会更加冗长. (2认同)