2012-05-29 9 views
5

La prima volta che si utilizza Oracle, normalmente si utilizza SQLServer e si è verificato un problema curioso. Mi stavo strappando i capelli con questo problema, e provando cose a caso e uno è successo a lavorare.Come creare booleani e accedervi con java/oracle stored proc

Quindi, in origine, avevo solo due parametri e tutto ha funzionato correttamente. Ho quindi desiderato aggiungere un valore booleano per consentire più percorsi nel mio stored proc. Lo provo nel mio ambiente db, e non ci sono errori e recupero i dati che mi aspetto. Aggiungo quindi le poche righe nel mio codice java per estrarre questi dati, e improvvisamente ottengo l'errore "wrong number or types of parameters".

Dopo aver provato diverse cose, ho semplicemente cambiato il tipo in Oracle da Boolean a Int, lasciando il codice java ancora come "setBoolean(3, true)" e tutto funziona.

Quindi le mie domande sono:

1) che cosa sono io mando con questa setBoolean() sul lato Java, e ciò che è sempre di Oracle?

2) cosa si aspettava prima quando era di tipo "Boolean, e perché non è compatibile con setBoolean()?"

3) Devo usare Oracle type int con java setBoolean(), o qualche altra combinazione come Oracle Varchar e setString(), quando si va alla velocità?

Java:

String jobquery = "{call PKG_TEST.GET_PLAN_DATA(?,?,?)}"; 
      CallableStatement callStmt = con.prepareCall(jobquery); 

      callStmt.setString(1,"15105"); 
      callStmt.setString(2, ""); 
      callStmt.setBoolean(3, true); 

Oracle SP (precedente):

PROCEDURE GET_PLAN_DATA(
     NAME_N_IN IN VARCHAR2, 
     TYPE_C_IN IN VARCHAR2 DEFAULT NULL, 
     ONLY_RESTRICTIONS_IN IN BOOLEAN DEFAULT FALSE) 

Oracle cambiato a:

PROCEDURE GET_PLAN_DATA(
      NAME_N_IN IN VARCHAR2, 
      TYPE_C_IN IN VARCHAR2 DEFAULT NULL, 
      ONLY_RESTRICTIONS_IN IN INT DEFAULT 0) 
+0

Si potrebbe voler leggere questo: https://forums.oracle.com/forums/thread.jspa?threadID=611049 –

risposta

2

1) che cosa sto inviando con questo setBoolean() dal lato java e cosa sta ottenendo Oracle?

Dal Java docs:

Sets the designated parameter to the given Java boolean value. The driver converts this to an SQL BIT value when it sends it to the database.

Quindi il valore Boolean viene convertito in un valore BIT.

2) quello che è stato lo aspettava prima, quando era di tipo Boolean, e perché questo non è compatibile con setBoolean()?"

Come detto, lo converte in un valore BIT, così è stato mi aspettavo la stessa cosa, prima esisteva anche una variabile Boolean per oracle, ma come hai detto, Dopo aver provato diverse cose, ho semplicemente cambiato il tipo in Oracle da Boolean a Int, lasciando il codice java ancora come "setBoolean (3, true) "e tutto funziona, la ragione è che oracle non ha più la variabile booleana. Perchè? Leggi this per una discussione approfondita sul problema.

3) Devo usare Oracle type int con java setBoolean(), o qualche altra combinazione come Oracle Varchar e setString(), quando si va alla velocità?

Direi varchar e setString(). Motivo, setString() metodo converts in un varchar. Quindi, si risparmia tempo rispetto a setBoolean() e int, dove si passa da Boolean a BIT a int.


EDIT

Solo una cosa la copia incollato da uno dei link di cui sopra per chiarire la questione più:

Ciao Tom, ho una domanda per quanto riguarda tipo di dati booleano.

Di seguito è riportato l'SP, scritto dal nostro cliente e abbiamo bisogno di integrarlo con la nostra applicazione.

PROCEDURE sp_xxxx_map (
       ic_opt_number  IN VARCHAR2, 
       in_cast_number IN NUMBER, 
       in_tyre_amount   IN NUMBER, 
       ob_is_valid    OUT BOOLEAN, 
       ob_is_obgr_obgt_valid OUT BOOLEAN, 

--------------- alcuni più parametri ....

integrando quanto sopra, tutto bene, tranne id parametro booleano OUT. Penso (correggimi se sbaglio) non esiste un tipo di dati SQL in java (classi JDBC) per intercettare i parametri "ob_is_valid", "ob_is_obgr_obgt_valid". Come fare per risolvere questo problema. Un'idea è: Posso scrivere un altro SP (ad esempio SP1), che chiamerà il precedente SP e convertirà i tipi booleai in CHAR come "Y" per vero e "N" per falso. Infine lascio che l'applicazione chiami SP1 appena creato.

Followup 5 Febbraio 2003 - 09:00 Central fuso orario:

solo preparare ed eseguire:

declare 
    b1 boolean; 
    b2 boolean; 
    n1 number := 0; 
    n2 number := 0; 
begin 
    sp_xxxx_map(?, ?, ?, b1, b2); 
    if (b1) then n1 := 1; end if; 
    if (b2) then n2 := 1; end if; 
    ? := n1; 
    ? := n2; 
end; 

dalla app JDBC.

+0

Sono confuso sulla tua risposta al n. 2: "Come detto, lo converte in un Valore BIT, quindi si aspettava la stessa cosa. " Se il driver lo converte in un valore BIT SQL, che cosa si aspetta un valore BOOLEAN Oracle? S/N o "vero"/"falso"? Per elaborare, cosa potrei inviare al mio callStmt.set per lasciare la variabile Oracle come booleano, e funziona ancora? – JWiley

+0

@ KazekageGaara- Oracle ** ha ** un tipo di dati booleano ma solo per PLSQL e non SQL –

+0

@ A.B. Le domande sono specifiche per SQL, quindi la risposta era alla luce dello stesso. –

Problemi correlati