2014-10-24 19 views
5

Così ho una funzione che controlla il numero di cancellazioni sono in mia tabella di prenotazione:Chiama la funzione pl/sql in java?

CREATE OR REPLACE FUNCTION total_cancellations 
RETURN number IS 
    t_canc number := 0; 
BEGIN 
    SELECT count(*) into t_canc 
    FROM booking where status = 'CANCELLED'; 
    RETURN t_canc; 
END; 
/

per eseguire la sua in SQL che uso:

set serveroutput on 
DECLARE 
    c number; 
BEGIN 
    c := total_cancellations(); 
    dbms_output.put_line('Total no. of Cancellations: ' || c); 
END; 
/

Il mio risultato è:

anonymous block completed 
Total no. of Cancellations: 1 

La mia domanda è qualcuno può aiutarmi a chiamare la funzione in Java, ho provato ma senza fortuna.

+0

Voglio imparare dai tuoi errori. Si prega di condividere il codice 'Java'. – Tirath

+1

se la funzione è così semplice e non modifica i dati, puoi anche usare un tradizionale 'PreparedStatement' con" 'seleziona total_cancellations() da dual'". – BigMike

risposta

6

Java fornisce CallableStatements per tali scopi.

CallableStatement cstmt = conn.prepareCall("{? = CALL total_cancellations()}"); 
cstmt.registerOutParameter(1, Types.INTEGER); 
cstmt.setInt(2, acctNo); 
cstmt.executeUpdate(); 
int cancel= cstmt.getInt(1); 
System.out.print("Cancellation is "+cancel); 

stamperà lo stesso come si fa in pl/sql. Come da documenti Connection#prepareCall(),

Crea un oggetto CallableStatement per chiamare le stored procedure del database. L'oggetto CallableStatement fornisce metodi per impostare i suoi parametri IN e OUT e metodi per eseguire la chiamata a una stored procedure.

È anche possibile passare i parametri per la funzione. per esempio,

conn.prepareCall("{? = CALL total_cancellations(?)}"); 
cstmt.setInt(2, value); 

passerà i valori alla funzione come parametro di input.

Spero che questo aiuti!

+0

Questo aiuta ed è ciò che sto cercando di fare dove sto cercando di inizializzare il valore corretto.Dove hai acctNo nel setInt non so cosa mettere qui o come inizializzarlo. – SqlNoob

1

preparare una dichiarazione Callable

Ci sono due formati disponibili, la sintassi del blocco familiare utilizzato da Oracle e la sintassi standard ANSI 92. Nel caso del nostro programma di esempio, la sintassi del blocco ha la forma: CallableStatement vStatement = vDatabaseConnection.prepareCall("begin ? := javatest(?, ?); end;");

La sintassi ANSI 92 ha la forma:

CallableStatement vStatement = 
      vDatabaseConnection.prepareCall("{ ? = call javatest(?, ?)}"); 

source

Se si riceve l'errore di seguito , potresti voler usare il primo formato.

total_cancellations non è una procedura o è un errore non definito.

Codice di esempio.

Class.forName("oracle.jdbc.driver.OracleDriver"); 
Connection conn = DriverManager.getConnection("jdbc:oracle:thin:@xx.xxx.xx.xxx:1521:xxx", "user","pass"); 
CallableStatement cstmt = conn.prepareCall("begin ? := TEST_FUNC(?,?); end;"); 
cstmt.registerOutParameter(1, Types.INTEGER); 
cstmt.setString(2, "Test"); 
cstmt.setInt(3, 1001); 
cstmt.execute(); 
int result = cstmt.getInt(1); 
System.out.print("Result: " + result); 
cstmt.close(); 
conn.close();