sql >> Databasteknik >  >> RDS >> Oracle

Parameteriserad Oracle SQL-fråga i Java?

Jag tror att problemet är att din datatyp är CHAR(9) och "Waterloo" har bara 8 tecken. Jag antar att detta skulle ge de förväntade resultaten (LIKE och %). Eller lägg till det saknade utrymmet.

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

Det bästa sättet är att använda varchar istället för röding om dina strängar har en flexibel längd. Då skulle PreparedStatement fungera som förväntat.

En lösning skulle vara att använda den Oracle-specifika setFixedCHAR-metoden (men det är bättre att ändra datatypen till varchar om möjligt).

Följande är från Oracles PreparedStatement JavaDoc:

CHAR-data i databasen utfylls till kolumnbredden. Detta leder till en begränsning i att använda metoden setCHAR() för att binda teckendata till WHERE-satsen i en SELECT-sats - teckendatan i WHERE-satsen måste också fyllas i kolumnbredden för att skapa en matchning i SELECT-satsen. Detta är särskilt besvärligt om du inte känner till kolumnbredden.

setFixedCHAR() åtgärdar detta. Denna metod utför en icke-stoppad jämförelse.

Anmärkningar:

  • Kom ihåg att casta ditt förberedda uttalandeobjekt till OraclePreparedStatement för att använda metoden setFixedCHAR().
  • Det finns inget behov av att använda setFixedCHAR() för en INSERT-sats. Databasen fyller alltid automatiskt in data till kolumnbredden när den infogas.

Följande exempel visar skillnaden mellan metoderna setString(), setCHAR() och 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. SQL Server trunkering och 8192 begränsning

  2. Hur ställer du in ett standardvärde för en MySQL Datetime-kolumn?

  3. Hur ansluter man mysql till Basex?

  4. ORA-00942:tabell eller vy finns inte (ColdFusion-applikation)