2010-11-22 15 views
14
  1. De acuerdo con los documentos de java de PreparedStatement.setNull: "Nota: debe especificar el tipo de SQL del parámetro". ¿Cuál es la razón por la cual el método requiere el tipo SQL de la columna?¿Por qué PreparedStatement.setNull requiere sqlType?

  2. Me di cuenta de que pasar java.sql.Types.VARCHAR también funciona para columnas no varchar. ¿Hay escenarios en los que VARCHAR no sea adecuado (ciertos tipos de columnas o ciertos proveedores de DB)?

Thanks.

Respuesta

10

De acuerdo con los documentos de Java PreparedStatement.setNull: "Nota: debe especificar el parámetro de tipo SQL ". ¿Cuál es la razón por la cual el método requiere el tipo SQL de la columna ?

Para una compatibilidad máxima; según la especificación, hay algunas bases de datos que no permiten enviar NULL sin tipo a la fuente de datos subyacente.

me di cuenta de que la aprobación de java.sql.Types.VARCHAR también trabaja para columnas no varchar. ¿Hay escenarios de en los cuales VARCHAR no sea adecuado (ciertos tipos de columna o ciertos proveedores de DB)?

No creo que ese tipo de comportamiento realmente sea parte de la especificación o si lo es, entonces estoy seguro de que hay algún tipo de coerción implícita sucediendo allí. En cualquier caso, no se recomienda confiar en ese tipo de comportamiento que podría romperse cuando cambie el almacén de datos subyacente. ¿Por qué no simplemente especificar el tipo correcto?

+0

1. Todavía no entiendo por qué tengo que declarar el tipo. Por lo que sé, el comando ACTUALIZAR con SET MY_COLUMN = NULL funcionará en cada tipo de columna, entonces ¿por qué no es suficiente? – MosheElisha

+0

2. Tengo un método que obtiene una cadena SQL y una Colección e invoca PreparedStatement.setObject/setNull para cada objeto. Si quiero que se pase el tipo correcto a setNull, necesito pasar el tipo de cada objeto y crear un feo if. Si el controlador de base de datos puede manejar setObject, en mi opinión, debería manejar setNull y también verificar internamente. – MosheElisha

+1

@user: Con respecto a 1; como ya he mencionado, JDBC es un intento de estandarizar la interacción con una base de datos, pero cada implementación de base de datos tiene su propia forma de hacer las cosas. Por ejemplo, he oído que Oracle se queja si no se proporciona un tipo apropiado al establecer NULL. Por lo tanto, JDBC requiere que especifique el tipo, si la implementación subyacente de JDBC lo pasa a la base de datos es otra cosa. No se puede evitar si un protocolo de cable de base de datos en particular decide que se pasen los tipos al establecer valores NULL, por lo que no tiene sentido razonar con eso. –

1

Cuando se trata de Oracle sería muy prudente utilizar varchar2 hacia otros tipos de datos. Esto podría engañar al optimizador y podría obtener un mal plan de ejecución. Por ejemplo, al filtrar en una columna de fecha utilizando un tipo de datos de marca de tiempo en su enlace, Oracle podría terminar leyendo todas sus filas convirtiendo todas las fechas en marcas de tiempo y luego filtrando las filas deseadas. Si tiene un índice en la columna de fecha, podría incluso empeorar (si Oracle eligió usarlo), haciendo lecturas únicas en sus bloques de Oracle.

--Lasse

Cuestiones relacionadas