Liaison d'une variable null dans un PreparedStatement
Je jure que ce travail, mais il n'est pas dans ce cas. Je suis en train de match col1, col2 et col3, même si l'un ou plusieurs d'entre eux est nulle. Je sais que dans certaines langues, j'ai dû recourir à des périphrases comme ((? is null AND col1 is null) OR col1 = ?)
. C'est qu'ici?
PreparedStatement selStmt = getConn().prepareStatement(
"SELECT * " +
"FROM tbl1 " +
"WHERE col1 = ? AND col2 = ? and col3 = ?");
try
{
int col = 1;
setInt(selStmt, col++, col1);
setInt(selStmt, col++, col2);
setInt(selStmt, col++, col3);
ResultSet rs = selStmt.executeQuery();
try
{
while (rs.next())
{
//process row
}
}
finally
{
rs.close();
}
}
finally
{
selStmt.close();
}
//Does the equivalient of stmt.setInt(col, i) but preserves nullness.
protected static void setInt(PreparedStatement stmt, int col, Integer i)
throws SQLException
{
if (i == null)
stmt.setNull(col, java.sql.Types.INTEGER);
else
stmt.setInt(col, i);
}
source d'informationauteur Paul Tomblin
Vous devez vous connecter pour publier un commentaire.
Cela peut dépendre du pilote JDBC, mais pour la plupart, oui, vous devez utiliser la plus étendue formulaire vous montrer ci-dessus.
JDBC préparé les instructions sont généralement relativement mince wrappers autour d'un natif de la mise en œuvre d'une requête paramétrée, c'est à dire, la requête ? en place de paramètres sont transmis à la requête du compilateur et de l'compilé, si, plus tard, lorsque vous appelez stmt.executeQuery(), la déclaration ne peut pas être ajuster à partir d'un
column = ?
àcolumn IS NULL
. Ce n'est pas pour autant une limitation de JDBC comme il la sémantique de valeur NULL en SQL. Pour SQLx = NULL
est pas défini commex <> NULL
.Cela dit, certains pilotes JDBC peut violer la notion de
NULL
-ité en SQL et permettre setNull() pour transformer la déclaration de= ?
àIS NULL
ce serait très non-standard de comportement (bien qu'il peut être facilement accompli par écrit une sorte de requête pré-traitement de la méthode).La base de données que vous utilisez?
Mais au moins avec Oracle, égalité et inégalité) jamais de matchs NULS, vous avez écrit n'EST PAS NULL.
Généralement quelque chose étant égale à la valeur NULL est toujours faux (même NULL,
SELECT * FROM tbl WHERE NULL=NULL;
sera un ensemble vide), de sorte que vous n'avez probablement besoin de le faire le long chemin si vous voulez accepter la nulle de l'égalité comme çaJe sais que c'est trop tard peut-être, mais juste pour le plaisir de il un hack pour Oracle, qui me semble de travail:
SQL:
Et dans le code où vous ne l'jdbc appeler quelque chose comme ceci: