preparestatement preparedstatement parametros ejemplo consultas consulta con java oracle jdbc sql-like

parametros - preparedstatement java insert



¿No se puede usar una consulta LIKE en un JDBC PreparedStatement? (7)

El código de consulta y consulta:

ps = conn.prepareStatement("select instance_id, ? from eam_measurement where resource_id in (select RESOURCE_ID from eam_res_grp_res_map where resource_group_id = ?) and DSN like ''?'' order by 2"); ps.setString(1,"SUBSTR(DSN,27,16)"); ps.setInt(2,defaultWasGroup); ps.setString(3,"%Module=jvmRuntimeModule:freeMemory%"); rs = ps.executeQuery(); while (rs.next()) { bla blah blah blah ...

Devuelve un ResultSet vacío.

A través de la depuración básica he encontrado que es el tercer enlace que es el problema, es decir,

DSN like ''?''

He intentado todo tipo de variaciones, la más sensata de las cuales parecía estar usando:

DSN like concat(''%'',?,''%'')

pero eso no funciona, ya que me falta el '' en cada lado de la cadena concatenada", así que intento:

DSN like '' concat(''%'',Module=P_STAG_JDBC01:poolSize,''%'') '' order by 2

pero parece que no puedo encontrar una manera de hacer que funcionen.

¿Qué me estoy perdiendo?


Esto debería funcionar:

"/'" + "?" + "/'"


Hay dos problemas con su declaración. Debes entender cómo funcionan las variables de vinculación. La consulta no se procesa sustituyendo los caracteres ? con tus parámetros En cambio, la declaración se compila con marcadores de posición y luego, durante la ejecución, los valores reales de los parámetros se dan a la base de datos.

En otras palabras, analiza la siguiente consulta:

SELECT instance_id, :p1 FROM eam_measurement WHERE resource_id IN (SELECT RESOURCE_ID FROM eam_res_grp_res_map WHERE resource_group_id = :p2) AND DSN LIKE ''?'' ORDER BY 2

Estoy bastante seguro de que el último parámetro se ignorará porque está en una cadena de caracteres delimitada. Incluso si no se ignora, no tiene sentido tener '' caracteres alrededor porque Oracle no enlazará un parámetro en una cadena (me sorprende que no haya provocado ningún error, ¿captas excepciones?).

Ahora si reemplazas tu DNS LIKE ''?'' con DSN LIKE ? y enlazar "%Module=jvmRuntimeModule:freeMemory%" esto tendrá sentido y debería devolver las filas correctas.

Todavía tiene el problema con su primer parámetro, no hará lo que espera, es decir, la consulta que se ejecutará será equivalente a la siguiente consulta:

SELECT instance_id, ''SUBSTR(DSN,27,16)'' FROM ...

que no es para nada el mismo

SELECT instance_id, SUBSTR(DSN,27,16) FROM ...

Sugeriría analizar (= prepareStatement) la siguiente consulta si espera que el SUBSTR sea dinámico:

SELECT instance_id, SUBSTR(DSN,?,?) FROM eam_measurement WHERE resource_id IN (SELECT RESOURCE_ID FROM eam_res_grp_res_map WHERE resource_group_id = ?) AND DSN LIKE ? ORDER BY 2


Omitir el '' alrededor del ? . Sin el '' , ? es un marcador de posición para un parámetro. Con él, es una cadena SQL (es decir, lo mismo que "?" En Java).

Entonces debes concatenar la cadena en el lado de Java; no puede pasar funciones de SQL como parámetros a las consultas; solo valores básicos (como cadena, entero, etc.) porque el controlador JDBC convertirá el parámetro al tipo SQL que la base de datos espera y no puede ejecutar funciones SQL en este paso.


Primero, los marcadores de posición PreparedStatement (esas ? Cosas) son solo para valores de columna , no para nombres de tabla, nombres de columna, funciones / cláusulas SQL, etcétera. Mejor use String#format() lugar. En segundo lugar, ¿ no debería citar los marcadores de posición como ''?'' , solo deformaría la consulta final. Los PreparedStatement ya hacen el trabajo de cotización (y escape) por usted.

Aquí está el SQL fijo:

private static final String SQL = "select instance_id, %s from eam_measurement" + " where resource_id in (select RESOURCE_ID from eam_res_grp_res_map where" + " resource_group_id = ?) and DSN like ? order by 2");

Aquí es cómo usarlo:

String sql = String.format(SQL, "SUBSTR(DSN,27,16)"); // This replaces the %s. preparedStatement = connection.prepareStatement(sql); preparedStatement.setInt(1, defaultWasGroup); preparedStatement.setString(2, "%Module=jvmRuntimeModule:freeMemory%");

Ver también :


Puedes probar:

String beforeAndAfter = "%" + yourVariable + "%";


Si desea usar LIKE en una declaración preparada y también desea usar% caracteres en LIKE;

escribir una declaración preparada como normalmente ".... LIKE? ...." y al asignar el valor del parámetro al uso del signo de interrogación

ps.setString(1, "%" + "your string value" + "%");

Esto funcionará :)


PreparedStatement ps = con.prepareStatement( "select columname from tablename where LOWER(columnname) LIKE LOWER(''"+var+"%'')");

Aquí var es la variable en la que se almacena el valor que se va a buscar ...