utiliza uso teclado signos signo para niños los interrogación interrogacion importancia exclamación exclamacion ejemplos dialogo con como java sql jdbc prepared-statement

java - uso - signos de interrogacion y exclamacion para niños



¿Cómo evito un literal de interrogación(''?'') En una declaración preparada de JDBC (5)

¿Lo intentaste? Creo que los signos de interrogación citados están bien. solo se deben reemplazar los signos de interrogación "vacíos" en la declaración preparada

Me gustaría crear un JDBC PreparedStatement como:

SELECT URL,LOCATE ( ''?'', URL ) pos FROM Links WHERE pageId=? ORDER BY pos ASC

Donde el primero ? es un literal y el 2do ? es un parámetro Podría usar CHAR(63) en lugar del ''?'' pero creo que la llamada de función adicional ralentizaría la ejecución de SQL. ¿Hay alguna forma de escapar ese 1er ? ?

Editar:

El siguiente código prueba la afirmación de dkatzel de que el ? el carácter en una cadena no se considera un marcador:

public class Test { public static void main(String[] args) throws SQLException { Connection conn = DriverManager.getConnection("jdbc:h2:mem:test"); Statement stmt = conn.createStatement(); stmt.executeUpdate("CREATE TABLE Links(URL VARCHAR(255) PRIMARY KEY,pageId BIGINT)"); stmt.executeUpdate("INSERT INTO Links(URL,pageId) VALUES(''http://foo.bar?baz'',1)"); stmt.executeUpdate("INSERT INTO Links(URL,pageId) VALUES(''http://foo.bar/baz'',1)"); stmt.close(); PreparedStatement ps = conn .prepareStatement("SELECT URL,LOCATE ( ''?'', URL ) pos FROM Links WHERE pageId=? ORDER BY pos ASC"); ps.setLong(1, 1); ResultSet rs = ps.executeQuery(); while (rs.next()) { System.out.println(rs.getString(1) + ":" + rs.getInt(2)); } rs.close(); ps.close(); conn.close(); } }

La salida:

http://foo.bar/baz:0 http://foo.bar?baz:15

Parece que dkatzel es correcto. Busqué en la especificación de JDBC y no pude encontrar ninguna mención que el ? El marcador de parámetro se ignorará si está entre comillas, pero las pocas implementaciones de los analizadores de PreparedStatement que encontré ( MySql , c-JDBC , H2 ) parecen excluir el texto dentro de comillas simples de la consideración como marcadores de parámetros.


Si no funciona con su controlador JDBC, ¿podría vincularlo como una String ? ,

ps.setString(1, "?");


El significado de ? se especifica en la especificación SQL, y la especificación JDBC difiere a la especificación SQL para esto.

Un controlador no (y no debería) interpretar un signo de interrogación en un literal como marcador de posición de parámetro, ya que un signo de interrogación dentro de un literal de cadena es simplemente un carácter dentro del literal de cadena. Para obtener más información, consulte el capítulo 5 de SQL: 2011 Foundation (ISO-9075-2: 2011).

Entonces escaparse no es necesario (ni posible).


He utilizado CHR (63) en mi consulta y eso me ayudó a resolver mi problema.

Esto es lo que hice, por ejemplo: select q''[<div id=[''|"]TRD_%%GEN%%[''|"].*]'' || chr(63) || q''[</div>]'' from dual; select q''[<div id=[''|"]TRD_%%GEN%%[''|"].*]'' || chr(63) || q''[</div>]'' from dual;

Esto ayudó a obtener la cadena como: <div id=[''|"]TRD_%%GEN%%[''|"].*?</div>

Luego utilicé esta consulta dentro de la declaración de inserción y ejecuté PreparedStatement. Funcionó perfectamente bien.

La función CHR es una función incorporada y se puede usar de forma similar a otras funciones de Oracle. Puede usar esto si sabe que la consulta no se repetirá muchas veces.


Dependiendo del controlador JDBC que esté utilizando, puede escapar al agregar otro signo de interrogación, por ejemplo, si está usando PostgreSQL

https://jdbc.postgresql.org/documentation/head/statement.html

En JDBC, el signo de interrogación ( ? ) Es el marcador de posición para los parámetros posicionales de un Estado Preparado. Sin embargo, hay una serie de operadores PostgreSQL que contienen un signo de interrogación. Para evitar que dichos signos de interrogación en una declaración SQL se interpreten como parámetros posicionales, use dos signos de interrogación ( ?? ) como secuencia de escape. También puede usar esta secuencia de escape en un Statement, pero eso no es obligatorio. Específicamente, solo en un extracto se puede usar un único ( ? ) Como operador.