2010-11-22 28 views
14
  1. In base ai documenti java di PreparedStatement.setNull: "Nota: è necessario specificare il tipo SQL del parametro". Qual è la ragione per cui il metodo richiede il tipo SQL della colonna?Perché PreparedStatement.setNull richiede sqlType?

  2. Ho notato che il passaggio di java.sql.Types.VARCHAR funziona anche con colonne non varchar. Esistono scenari in cui VARCHAR non è adatto (determinati tipi di colonna o determinati provider di DB)?

Grazie.

risposta

10

Secondo la documentazione java di PreparedStatement.setNull: "Nota: È necessario specificare il parametro di tipo SQL ". Qual è la ragione per cui il metodo richiede il tipo SQL della colonna ?

Per la massima compatibilità; secondo le specifiche, ci sono alcuni database che non consentono l'invio di NULL non tipizzato all'origine dati sottostante.

ho notato che passando java.sql.Types.VARCHAR funziona anche per colonne non varchar. Esistono scenari in cui VARCHAR non sarà adatto a (determinati tipi di colonna o determinati provider DB)?

Non penso che quel tipo di comportamento sia realmente parte delle specifiche o se lo è, allora sono sicuro che c'è una sorta di coercizione implicita che si sta verificando. In ogni caso, fare affidamento su un tipo di comportamento che potrebbe interrompersi quando il datastore sottostante cambia non è raccomandato. Perché non specificare solo il tipo corretto?

+0

1. Io ancora non capisco perché devo dichiarare il tipo. Per quanto ne so il comando UPDATE con SET MY_COLUMN = NULL funzionerà su ogni tipo di colonna, quindi perché non è abbastanza? – MosheElisha

+0

2. Ho un metodo che ottiene una stringa SQL e una collezione e richiama PreparedStatement.setObject/setNull per ogni oggetto. Se voglio che il tipo corretto venga passato a setNull ho bisogno di passare il tipo di ogni oggetto e creare un brutto if. Se il driver del database può gestire setObject, a mio avviso, dovrebbe gestire setNull e controllare anche internamente. – MosheElisha

+1

@user: Riguardo a 1; Come ho già detto, JDBC è un tentativo di standardizzare l'interazione con un database, ma ogni implementazione di database là fuori ha il suo modo di fare le cose. Ad esempio, ho sentito che Oracle si lamenta se non viene fornito un tipo corretto quando si imposta NULL. Quindi JDBC richiede di specificare il tipo, se l'implementazione JDBC sottostante lo passa al database è un'altra cosa. Non può essere aiutato se un particolare protocollo del protocollo del database decide che i tipi devono essere passati quando si impostano i valori NULL, quindi non c'è motivo di ragionare su questo. –

1

Quando si tratta di Oracle sarebbe altamente sconsigliato usare varchar2 nei confronti di altri tipi di dati. Ciò potrebbe ingannare l'ottimizzatore e potresti ottenere un piano di esecuzione errato. Ad esempio, il filtraggio su una colonna della data utilizzando un datatipo di data/ora nel bind, Oracle potrebbe finire per leggere tutte le righe che convertono tutte le date in data e ora, quindi filtrare le righe desiderate. Se si dispone di un indice nella colonna della data, potrebbe persino peggiorare (se Oracle ha scelto di usarlo) - eseguire letture singole sui blocchi di Oracle.

--Lasse

Problemi correlati