2010-10-06 9 views
6

Chciałbym przetestować, czy dane polecenie SQL jest poprawne pod względem składniowym i semantycznym (tj. Bez błędów składni i bez błędów ortograficznych).Parsowanie SQL za pomocą sterownika JDBC Oracle

Dla większości baz danych Connection.prepareStatement i PreparedStatement.getMetaData zrobiłoby lewę (bez wyjątku == dobre zapytanie). Niestety najnowszy sterownik Oracle analizuje tylko takie zapytania SELECT, ale nie inne zapytania. Starsi kierowcy tego nie robią.

Czy Oracle udostępnia inne narzędzie do analizowania instrukcji SQL?

Odpowiedz

7

Możesz użyć pakietu Oracle DBMS_SQL do przeanalizowania instrukcji przechowywanej w ciągu znaków. Na przykład:

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 

Można owinąć że aż do zapamiętanej funkcji który właśnie wrócił na przykład 1, jeżeli oświadczenie było ważne, 0 jeśli nieważne, jak to:

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; 

Następnie można go używać coś takiego przykładu PL/SQL:

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

Wohooo! Wygląda ładnie, spróbuję jutro :) Dzięki! – Aivar

+0

To naprawdę działa !! jeszcze raz dziękuję :) – Aivar

+2

Ma tę "drobną" wadę, że jeśli spróbujesz DDL (jak utworzyć tabelę) sprawdzoną przez tę funkcję, DDL zostanie wykonany. Na przykład. sql_is_valid ('create table test (id int)'); faktycznie tworzy tabelę Ale można ją ominąć dodając plan wyjaśniający do testowanego ciągu (jeśli użytkownik ma plan_table) –