sql >> Database teknologi >  >> RDS >> Oracle

Parameteriseret Oracle SQL-forespørgsel i Java?

Jeg tror, ​​problemet er, at din datatype er CHAR(9) og "Waterloo" kun har 8 tegn. Jeg antager, at dette ville returnere de forventede resultater (LIKE og %). Eller tilføj det manglende mellemrum.

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

Den bedste måde ville være at bruge varchar i stedet for char, hvis dine strenge har en fleksibel længde. Så ville PreparedStatement fungere som forventet.

En løsning ville være at bruge den Oracle-specifikke setFixedCHAR-metode (men det er bedre at ændre datatypen til varchar, hvis det er muligt).

Følgende er fra Oracles PreparedStatement JavaDoc:

CHAR-data i databasen er polstret til kolonnebredden. Dette fører til en begrænsning i at bruge setCHAR()-metoden til at binde tegndata til WHERE-udtrykket i en SELECT-sætning - tegndataene i WHERE-udtrykket skal også udfyldes til kolonnebredden for at skabe et match i SELECT-sætningen. Dette er især besværligt, hvis du ikke kender søjlebredden.

setFixedCHAR() afhjælper dette. Denne metode udfører en ikke-polstret sammenligning.

Bemærkninger:

  • Husk at caste dit forberedte sætningsobjekt til OraclePreparedStatement for at bruge setFixedCHAR()-metoden.
  • Der er ingen grund til at bruge setFixedCHAR() til en INSERT-sætning. Databasen udfylder altid automatisk dataene til kolonnebredden, når den indsætter dem.

Det følgende eksempel viser forskellen mellem metoderne setString(), setCHAR() og 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. Hvordan kalder jeg en Oracle-lagret procedure fra et Excel VBA-script?

  2. INDLÆS DATAINFIL på fjernmaskine

  3. Fejl under opkald til java fra PL/SQL

  4. Ringer til Python fra Oracle