2010-10-06 74 views
6

我想測試給定的SQL語句是否在語法上和語義上有效(即沒有語法錯誤並且沒有字段拼寫錯誤)。通過Oracle JDBC驅動程序解析SQL

對於大多數數據庫Connection.prepareStatementPreparedStatement.getMetaData會做的伎倆(沒有例外==好的查詢)。不幸的是,Oracle的最新驅動程序只解析這樣的SELECT查詢,而不是其他類型的查詢。老司機甚至不這樣做。

是否有Oracle提供的用於解析SQL語句的其他工具?

回答

7

您可以使用Oracle DBMS_SQL包來解析保存在字符串中的語句。例如:

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 

您可以將它包裝到剛剛返回的存儲函數中,例如, 1,如果該聲明是有效的,0,如果無效,就像這樣:

​​

然後,您可以使用它是這樣的PL/SQL例子:

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

Wohooo!看起來不錯,明天會試一試:)謝謝! – Aivar 2010-10-06 15:18:29

+0

它真的有效!再次感謝:) – Aivar 2010-10-08 08:37:57

+2

它有這個「小」的缺點,如果你嘗試使用這個函數檢查DDL(如創建表),DDL得到執行。例如。 sql_is_valid('create table test(id int)'); 實際上創建了一張表 但是可以通過爲您的測試字符串添加解釋計劃來繞過它(如果您的用戶有plan_table) – 2015-03-20 08:29:32