【问题标题】:Make sure Oracle insert statement in order确保Oracle插入语句按顺序
【发布时间】:2014-03-08 21:05:58
【问题描述】:

我有一个 ArrayList,比方说按定义的顺序有 4 行。我想将这 4 行相应地插入到 Oracle 表中。但奇怪的是,它进入了表格但顺序错误。

for (int x = 0; x < myArray.size(); x++) {
   //Some validation
   //insert statement
   MyJB myJB = (MyJB) myArray.get(x);
   String query = "insert into table X values(myJB.getColumn1,myJB.getColumn2)";
   log.debug(query);
   stmt = conn.prepareStatement(query);
   stmt.executeUpdate();
   stmt.close();
}

日志将显示正确的顺序,即从 x=0 到 x=3。 但是 select * from table X 将产生 4 行但顺序不同

如何强制Oracle按照ArrayList中的正确顺序插入?

谢谢

  • ArrayList = row0,row1,row2,row3
  • 从表 X 中选择 * = row2,row3,row0,row1

【问题讨论】:

  • 你说的是什么顺序?如果没有ORDER BY 子句,SELECT 语句的结果顺序是不确定的——行可以以任意顺序返回,并且每次执行时顺序可以改变。如果您关心从SELECT 语句返回的订单行,请使用ORDER BY 子句。
  • 是ArrayList的顺序。数据来自 ArrayList 而不是表,所以我不能做“order by”。

标签: oracle insert


【解决方案1】:

除非您定义排序顺序,否则您不能依赖元素的顺序。最好的方法是根据它的序列和顺序创建主键。

或者,您可以尝试使用 oracle 特定的 rownum 伪列: http://docs.oracle.com/cd/B19306_01/server.102/b14200/pseudocolumns009.htm 但恕我直言,这不是你想要的。

编辑

CREATE SEQUENCE mySequence;

PreparedStatement statement = conn.prepareStatement("insert into table XY values (mySequence.nextval, ?, ?)");
statement.setObject(1, myJB.getColumn1);
statement.setObject(2, myJB.getColumn2);
statement.executeUpdate();

然后

select * from XY order by Z asc

其中 Z 是第一列的名称会做你想做的事

【讨论】:

  • 订单已经在 ArrayList 中定义。这是正确的顺序。插入语句已按正确顺序一一处理。但是即使 select * from table X order by rowid desc,选择结果的顺序也是错误的
  • @JustinCave 很好地解释了它。如何存储值并不重要,重要的是如何检索它们。为此,您必须定义排序标准。您不能依赖插入行的顺序。
  • 嗯,这很好。但是用户在该 ArrayList 上看到(这来自数据文件)。有什么技巧可以强制 Oracle 按照我们插入数据的顺序显示数据?
  • 是的,添加新列并从序列中初始化它。我会更新我的回答。
  • 在表中或在 ArrayList 中添加新列?如何将此列作为序列?
猜你喜欢
  • 2019-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多