2010-10-06 15 views
6

Vorrei verificare se l'istruzione SQL fornita è sintatticamente e semanticamente valida (ovvero, nessun errore di sintassi e nessun errore di ortografia di campo).SQL SQL tramite il driver JDBC di Oracle

Per la maggior parte dei database Connection.prepareStatement e PreparedStatement.getMetaData farebbe il trucco (nessuna eccezione == buona query). Sfortunatamente il più recente driver di Oracle analizza solo queste query SELECT, ma non altri tipi di query. I conducenti più anziani non fanno nemmeno questo.

Esiste un'altra funzione fornita da Oracle per l'analisi delle istruzioni SQL?

risposta

7

È possibile utilizzare il pacchetto Oracle DBMS_SQL per analizzare un'istruzione contenuta in una stringa. Ad esempio:

SQL> declare 
    2 c integer; 
    3 l_statement varchar2(4000) := 'insert into mytable (col) values (1,2)'; 
    4 begin 
    5 c := dbms_sql.open_cursor; 
    6 dbms_sql.parse(c,l_statement,dbms_sql.native); 
    7 dbms_sql.close_cursor(c); 
    8 end; 
    9/
declare 
* 
ERROR at line 1: 
ORA-00913: too many values 
ORA-06512: at "SYS.DBMS_SYS_SQL", line 824 
ORA-06512: at "SYS.DBMS_SQL", line 32 
ORA-06512: at line 6 

È possibile avvolgerlo in una funzione memorizzata appena restituita, ad es. 1 se la dichiarazione è stata valida, 0 se non valido, in questo modo:

function sql_is_valid 
    (p_statement varchar2 
) return integer 
is 
    c integer; 
begin 
    c := dbms_sql.open_cursor; 
    dbms_sql.parse(c,p_statement,dbms_sql.native); 
    dbms_sql.close_cursor(c); 
    return 1; 
exception 
    when others then 
    return 0; 
end; 

È quindi possibile utilizzare qualcosa come questo esempio PL/SQL:

:n := sql_is_valid('insert into mytable (col) values (1,2)'); 
+1

Wohooo! Sembra carino, ci proverò domani :) Grazie! – Aivar

+0

Funziona davvero !! grazie ancora :) – Aivar

+2

Ha questo svantaggio "minore" che se si prova un DDL (come creare una tabella) controllato da questa funzione, il DDL viene eseguito. Per esempio. sql_is_valid ('create table test (id int)'); crea effettivamente una tabella ma può essere aggirata aggiungendo piano di spiegazione per la stringa testata (se l'utente ha plan_table) –

Problemi correlati