【问题标题】:Select statement written using statement.executeQuery can't select values having - (dash)使用 statement.executeQuery 编写的选择语句无法选择具有 - (破折号)的值
【发布时间】:2018-11-21 23:53:59
【问题描述】:

我有一个 Oracle 数据库表 MyTable,其中有一列 XYZ,数据类型为 varchar2(40 Byte)

该表中还有一行具有XYZ 列的值,例如'12345678-1234'

当我使用Oracle SQL 客户端并运行select 语句:select * from MyTable where XYZ='12345678-1234'; 时,它返回一个 记录。

但是当我使用 java 执行相同的选择语句时(如下所示),它返回 no 行。

Connection con = DriverManager.getConnection(url,user,pass);//I have proper parameters here
Statement stmt = con.createStatement();  
String query= "select * from MyTable where XYZ='12345678-1234'";
ResultSet rs = stmt.executeQuery(query);
if (rs.next()){
 System.out.println(rs.getString("XYZ")); 
}else {
 System.out.println("No Value")); 
}

这里总是打印​​ No Value

编辑: 当我在表格行中使用不带破折号的值时(例如:'12345678'),那么以上两者都会给出相同的结果 - 一行。

请指出我在这里遗漏的内容。

【问题讨论】:

  • @MichaelPeacock:他已经提到查询正在返回 Oracle SQL 客户端上的行。
  • 他说它在oracle客户端上返回数据。 “Select * from MyTable”是否返回数据?如果您的 Oracle 客户端和 Java 客户端之间的查询是相同的,那么很可能两者之间的连接信息不同。
  • @MichaelPeacock:我同意你的看法; OP 需要验证连接信息没有不同。
  • 连接信息相同。我检查了很多次。请参阅编辑。
  • 您可能需要转义破折号字符。尝试类似: select * from MyTable where XYZ='12345678\-1234' escape '\'

标签: java sql jdbc oracle11g


【解决方案1】:

你应该使用PreparedStatement

PreparedStatement stmt = con.prepareStatement("select * from MyTable where XYZ = ?");
preparedStatement.setString(1, "12345678-1234");
ResultSet rs = preparedStatement.executeQuery();

【讨论】:

  • 我会试试这个然后回来。谢谢!
【解决方案2】:

这不是我发现的 java 代码的问题。

COMMIT 是罪魁祸首。

我同时从 Oracle Sql 客户端和 Java 访问数据库,这导致了上述问题。

然后我在 Oracle Sql 客户端中执行的每条语句之后都使用了 Commit;然后问题就消失了。

如果有人想为此添加一些技术细节,那么我们非常欢迎!

【讨论】:

  • 如果您在 SQL 客户端中添加了数据,那么只有在您提交数据时它才会对其他会话可见。这就是事务的作用。
  • 那是我忽略的部分.. Transactionss....谢谢@MarkRotteveel
猜你喜欢
  • 2015-12-08
  • 2020-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多