2012-04-20 1 views
14

有効な場合に実行に時間がかかるSQL文(Oracleデータベース用)があります。有効でない場合は、エラーを返してすぐに戻ります。実際のクエリを実行せずにJDBC文のSQL構文を確認するにはどうすればよいですか?

「確認文」ボタンのように、文を(JDBC経由で)実行せずに構文が有効であることを確認したいと思います。ベンダーに依存しない方法がありますか? PreparedStatementとしてクエリを単に定義するという私の最初の考えは、コンパイルやエラーチェックのようなものではないようです。

+0

多分、この他の質問に対する答えがあなたを助けるかもしれません:http://stackoverflow.com/questions/141499/any-java-libraries-out-there-that-validate -sql-syntax –

答えて

11

おそらく、このステートメントの説明計画を発行すると、有用な結果が得られます。

別の思考 - 多分難しい追加するクエリ(およびROWNUM < 1)、または、それはこれが本当の答えよりもハックの詳細ですが、あなたはクエリを実行することができ、高速

+2

計画を説明する方法があります。クエリを「実行中」と同じ構文エラーが発生します –

+1

バインドパラメータの処理方法は? – MRalwasser

+0

クエリに単一のパラメータがあっても、これはうまくいきません。 –

5

を実行させるために何かを編集することですこれは、クエリが有効な場合TRUEを返し、それが無効である場合、エラーを発生させる必要があります

SELECT (EXISTS (SELECT 1 FROM dual) 
     OR 
     EXISTS (your Query here) 
     ) AS result 
FROM dual 

:それは常に1行1列を返します。

+3

他の選択肢 'select * from(ここで質問する)where 1 = 0' – gordy

+0

gordyさんのコメントは、Oracle以外のdbmsで動作するので、私の投票になります。 – AlainD

+0

@ user1938185はい、「FROM dual」はOracleとMySQL(そしてSQLiteと思います)でのみ動作します。他のSQL ServerとPostgresでは、 'FROM dual'を完全に削除することもできます。 –

2

DBMS_SQL.PARSEを使用して明細書を確認できます。 警告:あなたは値またはブール値を返すと、このようなブロックをラップするストアドプロシージャを作成することができますそれはちょうどDML文を解析しますが、それは、このようなテーブル等を作成するなどのDDL文を実行し、コミットします:

set serveroutput on 
-- Example of good SQL 
declare 
    c integer; 
    s varchar2(50) := 'select * from dual'; 
begin 
    c := dbms_sql.open_cursor; 
    dbms_sql.parse(c,s,1); 
    dbms_sql.close_cursor(c); 
    dbms_output.put_line('SQL Ok'); 
exception 
    when others then 
    dbms_sql.close_cursor(c); 
    dbms_output.put_line('SQL Not Ok'); 
end; 
/

-- Example of bad SQL 
declare 
    c integer; 
    s varchar2(50) := 'select splat from dual'; 
begin 
    c := dbms_sql.open_cursor; 
    dbms_sql.parse(c,s,1); 
    dbms_sql.close_cursor(c); 
    dbms_output.put_line('SQL Ok'); 
exception 
    when others then 
    dbms_sql.close_cursor(c); 
    dbms_output.put_line('SQL Not Ok'); 
end; 
/
0

あなたは、構文チェック(download here)を実行するためにOracle's Pro*C precompilerを使用することができます。

これは、生のOracleのSQL文を含むCコードをプリコンパイルすることを意図したツールですが、あなたはSQLの構文チェックを実行するためにそれを「虐待」することができます。

  1. このコードでファイルtest.pcを作成します。

    DUAL FROM

    EXEC SQL SELECT *た1 = 1;

  2. を実行し、このコマンドプリコンパイラ・ツールをインストールした後:行1で

    構文エラー、列34、ファイル:

    のproc INAME =テストSQLCHECK = SYNTAX

  3. をあなたはこの出力が表示されます。 test.pc: ファイルtest.pcの1行目、34列目のエラー
    EXEC SQL SELECT * FROM DUAL WERE 1 = 1;
    ................................. 1
    PCC-S-02201、記号 "1"以下のいずれかを予期している場合:
    ;
    シンボル、と「を有する、」続けるには「1」に置き換えた場合、組合のため、開始、 ため、有する基、接続交差、マイナス。

これをソリューションに統合するのは簡単です。

オンラインセマンティクスチェックを実行して、使用されているすべてのプロシージャとテーブルが特定のスキーマで有効であることを確認することもできます。あなたはSQLCHECK = SEMANTICS USERID = youruserを渡します。

関連する問題