Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
即使我的结果集不是空的,我也不会得到输出。使用JAVA和oracledb_Java_Jdbc_Oracle11g_Runtime Error_Resultset - Fatal编程技术网

即使我的结果集不是空的,我也不会得到输出。使用JAVA和oracledb

即使我的结果集不是空的,我也不会得到输出。使用JAVA和oracledb,java,jdbc,oracle11g,runtime-error,resultset,Java,Jdbc,Oracle11g,Runtime Error,Resultset,数据库的日期格式相同。查询在Oracle数据库中运行良好。在java中,结果集不是空的。我想不出这个问题的可能原因。请帮忙 try { Class.forName(driverClass); Connection cn=null; cn=DriverManager.getConnection(url,username,password); Scanner sc=new Scanner(System.i

数据库的日期格式相同。查询在Oracle数据库中运行良好。在java中,结果集不是空的。我想不出这个问题的可能原因。请帮忙

try {
            Class.forName(driverClass);
            Connection cn=null;
            cn=DriverManager.getConnection(url,username,password);
            Scanner sc=new Scanner(System.in);
            
            
            System.out.print("Enter Ship date in yyyy-mon-dd format: ");
            String str=sc.next();  
            System.out.println(str);

            //select PO_NUMBER from PURCHASE_ORDER where SHIPDATE=TO_DATE('2021-JAN-25','YYYY-MON- 
            DD');
            String sql = "select PO_NUMBER from PURCHASE_ORDER where 
            SHIPDATE=TO_DATE('"+str+"','YYYY-MON-DD')";
            System.out.println("Query exec");
            Statement stmt = cn.createStatement();
            ResultSet rs = stmt.executeQuery(sql);
            if(rs.next())
                System.out.println("Purchase Order Shipped on "+ str+" are: ");
            else
                System.out.println("empty rs");
            while(rs.next()) {
                System.out.println(rs.getInt(1));                   
            }
            cn.close();
            
        } catch (ClassNotFoundException | SQLException e) {
            e.printStackTrace();
        }

 OUTPUT : Enter Ship date in yyyy-mon-dd format: 2021-JAN-25
 2021-JAN-25
 Query exec
 Purchase Order Shipped on 2021-JAN-25 are: 

当前的
while
循环丢弃第一行(可能是唯一一行)。我能看到的最简单的解决方案是在
if
中将其更改为
do while
。大概

if(rs.next()) {
    System.out.println("Purchase Order Shipped on " + str + " are: ");
    do {
        System.out.println(rs.getInt(1));                   
    } while(rs.next());
} else {
    System.out.println("empty rs");
}
这是正确的。这个答案为您提供了一些推荐做法

  • 如果是参数化查询,请使用而不是
    语句
    ,以防止出现错误
  • 使用以使资源自动关闭
  • 使用
    e.printStackTrace()
    是不好的做法,因为堆栈跟踪对最终用户没有用处一般规则是:如果您的方法无法处理异常(即无法从异常状态恢复),则不应捕获异常,并应使用方法签名声明
    抛出
    。这将确保调用方法有机会以所需的方式处理异常
  • 根据的文档,它将光标从当前位置向前移动一行。
    ResultSet
    光标最初位于第一行之前;对方法next的第一次调用使第一行成为当前行第二次调用使第二行成为当前行,依此类推。
    • 这意味着,在调用
      ResultSet#next
      之后,在再次调用
      ResultSet#next
      之前,您必须从
      ResultSet#中获取值,而在第一次调用
      ResultSet#next
      时,
      ResultSet
      从数据库中获取的值则丢失了该值,正在浪费
    • 要么按照Elliott Frisch建议的方式处理,要么按照下面代码中显示的另一种方式处理
  • 根据这些建议,您的代码应如下所示:

    Scanner sc = new Scanner(System.in);
    System.out.print("Enter Ship date in yyyy-mon-dd format: ");
    String str = sc.next();  
    
    String query = "select PO_NUMBER from PURCHASE_ORDER where SHIPDATE = TO_DATE(?, 'YYYY-MON-DD')";
    
    try (Connection cn = DriverManager.getConnection(url,username,password);
         PreparedStatement stmt = cn.prepareStatement(query)) {
    
        stmt.setString(1, str); 
        ResultSet rs = stmt.executeQuery(query);
    
        if(rs.next()) {
            System.out.println("Purchase Order Shipped on "+ str+" are: ");
            System.out.println(rs.getInt(1));  
            while(rs.next()) {
                System.out.println(rs.getInt(1));                         
            }
        } else {
            System.out.println("empty rs");
        }
    }