首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java PreparedStatement 查詢 Oracle 無結果:setString 與數據類型不匹配

     編輯:程式設計綜合問答

典型錯誤代碼


String sql = "SELECT * FROM users WHERE id = ?";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, userId); // userId 為 String 變量
ResultSet rs = ps.executeQuery();
// rs.next() 為 false

根本原因

表字段 id 為 NUMBER 或 INTEGER 類型,調用 setString 會導致隱式類型轉換,Oracle 可能因格式不匹配(如前導零、科學記數法)導致索引失效或無法匹配。

修正方案

  1. 根據字段類型選擇 setter:
    
      // id 為 NUMBER
      ps.setLong(1, Long.parseLong(userId));
      // 或
      ps.setInt(1, Integer.parseInt(userId));
      
  2. 統一使用 setObject 讓驅動推斷(需確保參數對象類型正確):
    
      ps.setObject(1, Long.valueOf(userId));
      
  3. 檢查 SQL 語句:確認表名、字段名大小寫(Oracle 默認大寫),無多餘空格。

調試技巧

  • 開啟 SQL 追蹤:ps.toString() 或使用 p6spy/log4jdbc 打印實際執行 SQL 與參數值。
  • 在 SQL*Plus/Developer 中直接執行帶具體值的 SQL 驗證是否有結果。
  • 檢查事務隔離級別與提交狀態,未提交的插入在其他事務不可見。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved