当前位置: 首页 > 知识库问答 >
问题:

"ORA-01858:在java类中编写查询时,在需要数字的地方找到了非数字字符"

谭敏学
2023-03-14

我有一个网络应用程序,其中3输入从用户和点击搜索按钮后显示结果。这三个输入是;id(不唯一)、开始日期和结束日期。我希望能够在这些情况下得到结果:如果用户输入

  1. 仅限id

在我的anager.java,我有一个SQL字符串如下;

final String SQL_STU = " select " 
                + " t.name,"
                + " t.surname, " 
                + " t.lecture," 
                + " from studenttable t " 
                + " where t.school = 'CHC' " 

                + " and t.id = case when '" + studentInfo.getID() + "'" +" is null then t.id else '" + studentInfo.getID() + "' end "

                + " and t.enrolldate >= case when '" + studentInfo.getStartDate() + "' is null then t.enrolldate else to_date('" 
                +  studentInfo.getStartDate() + "', 'DD.MM.YYYY HH24:MI:SS') end " 

                + " and t.graduationdate >= case when '" + studentInfo.getEndDate() + "' is null then t.graduationdate else to_date('" 
                +  studentInfo.getEndDate() + "', 'DD.MM.YYYY HH24:MI:SS') end " ; 

我将执行此查询并将结果放入结果集中。

我对这段代码有几个问题;例如,当我注释掉这一部分时:

            + " and t.enrolldate >= case when '" + studentInfo.getStartDate() + "' is null then t.enrolldate else to_date('" 
            +  studentInfo.getStartDate() + "', 'DD.MM.YYYY HH24:MI:SS') end " 

            + " and t.graduationdate >= case when '" + studentInfo.getEndDate() + "' is null then t.graduationdate else to_date('" 
            +  studentInfo.getEndDate() + "', 'DD.MM.YYYY HH24:MI:SS') end " ; 

它可以正常工作,但当我将所有输入设为null(id、date1、date2)时,它什么也不显示。既然没有特定的id,它不应该显示所有的结果吗?(用户将无法提交3个空字段,但我很好奇为什么它不能像我提到的那样工作?)

另一件事是,当我执行整个代码(包括to_date部分)时,它会在标题中给出错误。但它不会给任何错误,当我这样执行:

  final String SQL_STU = " select " 
                    + " t.name,"
                    + " t.surname, " 
                    + " t.lecture," 
                    + " from studenttable t " 
                    + " where t.school = 'CHC' " 

                    + " and t.enrolldate >= case when '" + studentInfo.getStartDate() + "' is null then t.enrolldate else to_date('" 
                    +  studentInfo.getStartDate() + "', 'DD.MM.YYYY HH24:MI:SS') end " ;

总之,我无法按照我想要的方式编写查询。我没有那么丰富的查询经验。如果你知道更好的方法,你也可以建议,因为我已经走到了死胡同。我也尝试了一些与NVL,但我不能使它也工作。

笔记:

  • ID、StartDate和EndDate是my StudentInfo中的类型字符串。java类
  • id是varchar类型,dates是数据库表中的date类型。(PL/SQL)

共有1个答案

何灼光
2023-03-14

对你的问题最好的回答是使用准备好的陈述:

String sql = "SELECT t.name, t.surname, t.lecture ";
sql += "FROM studenttable t ";
sql += "WHERE t.school = 'CHC' AND " 
sql += "t.id = COALESCE(?, t.id) AND ";
sql += "t.entrolldate >= COALESCE(?, t.enrolldate) AND ";
sql += "t.graduationdate >= COALESCE(?, t.graduationdate)";

PreparedStatement ps = conn.prepareStatement(sql);
ps.setInt(1, studentInfo.getID());
ps.setDate(2, studentInfo.getStartDate());
ps.setDate(3, studentInfo.getEndDate());
ResultSet rs = ps.executeQuery();

while (rs.next()) {
    // process a row
}

首选使用语句的原因是,它使您无需手动将Java日期(和其他类型)变量封送到Oracle SQL语句中。相反,上面的代码让JDBC驱动程序担心如何将Java日期变量转换为实际SQL代码中的正确格式。此外,语句允许您以最小的连接编写SQL查询,这减少了出错和键入的机会。

注意,根据Java代码中实际返回getStartDate()getEndDate()方法,可能需要调用除PreparedStatement#setDate之外的setter。

 类似资料:
  • 问题内容: 要求 : 通用查询/函数,用于检查表的varchar列中提供的值是否实际上是数字,并且精度不超过允许的精度。 可用值: 表名称,列名称,允许的精度,允许的比例 一般建议是创建一个函数并使用to_number()来验证值,但是不会验证允许的长度(精度标度)。 我的解决方案: 使用Regexp验证号码 验证左部分的长度(十进制前)(我不知道它的实际名称是什么),因为对于小数位数,oracl

  • 问题内容: 我有一个从1到100(包括两端)的数字数组。数组的大小为100。将数字随机添加到数组中,但是数组中有一个随机的空插槽。找到该插槽的最快方法是什么,应该在插槽中放入多少?最好使用Java解决方案。 问题答案: 你可以在O(n)中执行此操作。遍历数组并计算所有数字的总和。现在,从1到N的自然数之和可以表示为。在你的情况下,N = 100。 从中减去数组的总和,其中N = 100。 那是丢失

  • 问题内容: 实际上,几周前有人问我自己,而我确切地知道如何使用SP或UDF来执行此操作,但是我想知道是否有没有这些方法的快速简便的方法。我假设有,但我找不到。 我需要说明的一点是,尽管我们知道允许使用哪些字符(az,AZ,0-9),但我们 不想指定 不允许使用的字符(#@!$等…)。另外,我们希望拉出 包含 非法字符的行,以便可以将其列出给用户修复(由于我们无法控制输入过程,因此此时无法执行任何操

  • 我试图从str2参数创建一个新的索引数组,但是得到了这个错误:“array required,but string found。”我正在学习Java,只会轻松地用JavaScript写作。有人能解释一下这个错误信息是什么意思吗?

  • 问题内容: 因此,我试图在用户输入的字符串中查找所有大写字母,但始终出现此运行时错误: 我觉得很愚蠢,但我无法弄清楚,Oracle甚至在有关java.lang.StringIndexOutOfBoundsException的页面上谈论了charAt。 这是我的代码,用于查找大写字母并打印它们: 我非常感谢您的任何投入和/或帮助。 问题答案: 应该 请记住,数组索引从零开始。 字符串长度返回 字符串

  • 我有下面的句子 预期输出:(不考虑订单) 使用以下代码进行了尝试: 得到以下输出: 我想得到作为键和