【问题标题】:Create table as select on Oracle using Jdbc creates table with no rows使用 Jdbc 在 Oracle 上创建表作为选择创建没有行的表
【发布时间】:2018-06-18 17:13:00
【问题描述】:

我正在尝试使用 Spring 的 JdbcTemplate 在 Oracle 11g 命令上执行 CTAS。

private void ctasTest(JdbcTemplate jdbcTemplate) {
    String ctas = "CREATE TABLE TARGET_DATA NOLOGGING AS SELECT ID,
      NTILE(10) OVER (ORDER BY ID) AS CONTAINER_COLUMN FROM SOURCE_DATA";
    jdbcTemplate.execute(ctas);
}

针对新数据库运行时,会创建 TARGET_DATA 表,但即使 SOURCE_DATA 表有 1000 行,也有 0 行。

如果我随后使用 SQLDeveloper 删除空的 TARGET_DATA 表,并运行相同的命令,则成功,该表包含 1000 行。

然后我可以删除表并重新运行我的 Java 代码,它会成功并且 TARGET_DATA 将包含 1000 行。

SQLDeveloper 是否在后台提供了一些我需要包含在我的 Java 代码中的东西。我在普通的 JDBC 和 Oracle 12c 上尝试过同样的事情,得到了同样的结果。

【问题讨论】:

  • 有什么例外吗?
  • 无异常,代码完成无错误。
  • 那么,你是说它根本没有创建表吗??
  • 目标表已创建,但有 0 行。
  • 你可以运行SELECT ID, NTILE(10) OVER (ORDER BY ID) AS CONTAINER_COLUMN FROM SOURCE_DATA 看看你是否得到了行吗?我敢肯定,您正在使用相同的用户来获取 java 代码中的数据

标签: java spring jdbc oracle11g jdbctemplate


【解决方案1】:

试试这个作为你的陈述:

String ctas = "CREATE TABLE TARGET_DATA NOLOGGING AS (SELECT ID,
  NTILE(10) OVER (ORDER BY ID) AS CONTAINER_COLUMN FROM SOURCE_DATA)";

注意选择部分用括号括起来。

【讨论】:

  • 我不认为,这会有所不同
  • 谢谢,我已经尝试过了,但不幸的是仍然创建了一个空的目标表。
  • @user3130010 空目标是什么意思?你是说要创建表吗?
  • 是的,正在创建目标表。
  • @user3130010 那么你的 SQL 正在被执行,这也意味着 SQL 没有问题
【解决方案2】:

原来我没有提交我的测试数据。因此它在 SQLDeveloper 会话中仍然可见,但对 Java 应用程序不可见。

【讨论】:

  • 也许这应该是对您的问题的编辑或评论,而不是答案。
猜你喜欢
  • 2016-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-12-18
  • 2011-05-16
相关资源
最近更新 更多