Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Sparametryzowane zapytanie Oracle SQL w Javie?

Myślę, że problem polega na tym, że twój typ danych to CHAR(9), a „Waterloo” ma tylko 8 znaków. Zakładam, że zwróci to oczekiwane wyniki (LIKE i %). Lub dodaj brakujące miejsce.

String sql = "SELECT STUDENT FROM SCHOOL WHERE SCHOOL LIKE ? ";
PreparedStatement prepStmt = conn.prepareStatement(sql);
prepStmt.setString(1, "Waterloo%");
ResultSet rs = prepStmt.executeQuery();

Najlepszym sposobem byłoby użycie varchar zamiast char, jeśli Twoje ciągi mają elastyczną długość. Wtedy PreparedStatement działał zgodnie z oczekiwaniami.

Obejściem byłoby użycie specyficznej dla Oracle metody setFixedCHAR (ale lepiej zmienić typ danych na varchar, jeśli to możliwe).

Poniżej znajduje się dokument JavaDoc PreparedStatement firmy Oracle:

Dane CHAR w bazie danych są dopełniane do szerokości kolumny. Prowadzi to do ograniczenia używania metody setCHAR() do wiązania danych znakowych z klauzulą ​​WHERE instrukcji SELECT — dane znakowe w klauzuli WHERE muszą być również dopełnione do szerokości kolumny, aby uzyskać dopasowanie w instrukcji SELECT. Jest to szczególnie kłopotliwe, jeśli nie znasz szerokości kolumny.

setFixedCHAR() rozwiązuje ten problem. Ta metoda wykonuje porównanie bez wypełnienia.

Uwagi:

  • Pamiętaj, aby rzutować obiekt przygotowanej instrukcji na OraclePreparedStatement, aby użyć metody setFixedCHAR().
  • Nie ma potrzeby używania setFixedCHAR() dla instrukcji INSERT. Baza danych zawsze automatycznie dopasowuje dane do szerokości kolumny podczas ich wstawiania.

Poniższy przykład ilustruje różnicę między metodami setString(), setCHAR() i setFixedCHAR().

// Schema is : create table my_table (col1 char(10));
//             insert into my_table values ('JDBC');
PreparedStatement pstmt = conn.prepareStatement
("select count() from my_table where col1 = ?");
ResultSet rs;

pstmt.setString (1, "JDBC");  // Set the Bind Value
rs = pstmt.executeQuery();    // This does not match any row
// ... do something with rs
CHAR ch = new CHAR("JDBC      ", null);
((OraclePreparedStatement)pstmt).setCHAR(1, ch); // Pad it to 10 bytes
rs = pstmt.executeQuery();     // This matches one row
// ... do something with rs
((OraclePreparedStatement)pstmt).setFixedCHAR(1, "JDBC");
rs = pstmt.executeQuery();     // This matches one row
// ... do something with rs



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wprowadzenie do zmiennych PL/SQL w bazie danych Oracle

  2. Jak utworzyć wiele połączeń schematów za pomocą Javy?

  3. Różnica między dwiema nieuporządkowanymi, wykreślonymi listami (Oracle)

  4. TRUNC(liczba) Funkcja w Oracle

  5. Jak podzielić interwał między dwiema datami na szczegóły według miesiąca?