Newsgroup: it.comp.java
Titolo: [ORACLE] Sapere il tipo del parametro

Salve a tutti,
sto rifacendo una classe java che esegue query su DB, a partire da una
stringa e da un vettore di parametri che poi referenzio
posizionalmente.
La classe vuole automatizzare il processo di Prepared Statement e
sembra funzionare abbastanza bene.
Ho pero' un problema. Nel caso in cui l'oggetto passato sia null, per
poterlo impostare, il metodo prepared statement.setnNull(int, int) si
aspetta un int per la posizione ed un int per il tipo SQL.
Il problema e' che pero' se l'oggetto e' null, non posso sapere con
instanceof il tipo dell'oggetto. percui e' il DB a dovermi dire di che
tipo si tratti.
Ho provato svariate strade, tra le quali
  setNull(posizione, java.sql.Types.NULL);  // Tipo Non Valido
  setObject(posizione, null);               // Idem
  // Feature non implementata! (La oracle, ma vi rendete conto?)
  setNull(posizione,
      statement.getParameterMetaData().getParameterType(posizione));
Ecco un esempio: (DataContainer e' un'arraylist di HashMap e sysLog e'
il logger di log4j) Al momento uso un accrocchio per farlo girare,
imposto il parametro come varchar.
Connection con;
public void execSQLStatement( String sql, Vector params )
    throws SQLException {
  sysLog.info("\n"+sql);
  try {
    PreparedStatement psQuery = con.prepareStatement(sql);
    for( int i = 0; i<params.size(); i++){
      Object o = params.get(i);
      if (o instanceof java.lang.String){
        psQuery.setString(i+1, (String)o);
      } else if (o instanceof java.lang.Integer){
        psQuery.setInt(i+1, ((Integer)o).intValue());
      } else if (o instanceof java.lang.Double){
        psQuery.setDouble(i+1, ((Double)o).doubleValue());
      } else if (o instanceof java.util.Date){
        psQuery.setDate(i+1,
DateUtil.dateToSqlDate((java.util.Date)o));
      } else if (o instanceof java.sql.Date){
        psQuery.setDate(i+1, (java.sql.Date)o);
      } else if (o==null){
        psQuery.setNull(i+1,java.sql.Types.VARCHAR);
      } else {
        psQuery.setString(i+1, o.toString());
      }
    }
    int result = psQuery.executeUpdate();
    sysLog.info("Statement Result:"+result);
  } catch (Exception e) {
    sysLog.error("execSQLStatement: Query Execution FAULT", e);
  }
}
Accetto qualsiasi consiglio. Se non ci fosse soluzione, pensavo di
creare un contenitore di parametri, che prevedesse il loro nome e tipo.
Spero che qualcuno mi sappia aiutare, Saluti, 
Davide

 creare un contenitore di parametri, che prevedesse il loro nome e tipo.
Potresti passare, in params, invece che dei null dei riferimenti a
oggetti:
class NULL {
public static final DATE=new Date();
public static final INT=new Integer(Integer.MAX_INT);
...
}
e poi confrontare params con NULL.DATE, ...
--
Marco

il problema, facendo in questo modo, non mi si risolve, perche' non
sempre conosco che tipo di oggetto ho e se questo e' null, a runtime.
Sapendolo a priori potrei anche mapparmi gli int corrispondenti
direttamente nella classe. In realta' a me serve risolverla Oracle
Oriented..
Comunque, per ora, il metodo che ho postato prima, funziona sia con
tipi String, che Integer, che Date. A quanto pare ad Oracle non importa
che tipo null si trova davanti, l'importante e' che sia un tipo che
riconosce.
Boo. Certo non e' una soluzione pulita........

Io non ho capito molto bene cosa ti serve, pero' nella mia (scarsa)
conoscenza di Oracol ;-) e' presente questa scrittura
INSERT INTO...
Values
variabile INDICATOR variabile_indicatore;
dove se la variabile indicatore e' minore di zero Oracle piazza da se' un
bel null. Non avendoci capito UBM magari sto sproloquiando, pero' forse ti
puo' servire...
-- 
---
Francesco Galli / Cinghiale Mannaro
Personal: 
http://cinghialemannaro.splinder.com
TMS project: 
http://tms.inera.it

Booo..
Sinceramente e' la prima volta che sento parlare di quella sintassi...
Io conosco invece la seguente:
INSERT INTO TABELLA VALUES ( ?,?,?,?,.....,?)
poi, parametro per parametro, li referenzio posizionalmente, a partire
dall'indice 1 e se non lo passo, solleva un'eccezione, con testo
"parametro mancante nell'indice 'x' ".
Percui non ho i parametri per nome. Almeno, non so come
referenziarli... mi interesserebbe pero' saperne di piu'.... Sai dove
trovo documentazione su quella gestione a cui fai riferimento? O magari
qualche pezzetto di codice???
Grazie,
Davide.

Questo e' un pezzettino di codice in pro-c:
EXEC SQL
insert into foto
(
ID,
FOTO,
DESCR,
NOME_FILE
)
values
(
:id_foto,
:foto,
:descrizione INDICATOR :descrizione_ind,
:file_name
);
dove :descrizione e' in realtà un char* e descrizione_ind uno short. Poco
piu' in su c'e' un controllo: se descrizione e' vuoto allora assegno a
descrizione_ind un valore negativo.
Penso che ti possa far comodo anche in java, ma non chiedermi di piu': non
sono assolutamente un grande esperto di oracle (anzi, lo odio) :-)


 );
[CUT]
D'accordo la sintassi, ma come referenzi la variabile? Anche in Delphi
c'e' una roba simile, ma non sono riuscito a riprodurla in java.
In delphi (pascal) si scrive:
nomeQuery.parameters.paramByName("foto").text = 'Nome della
fotografia';
Ma in java ho
PreparedStatement stmt = connection.getPreparedStatement(
    "La mia query col parametro indicato come ? ");
stmt.setString(1, "valore del parametro"); // 1 e' la posizione del
parametro.
Tu come fai???

 ha scritto nel messaggio
news:1119862147.7...@z14g2000cwz.googlegroups.com...
