有効な場合に実行に時間がかかるSQL文(Oracleデータベース用)があります。有効でない場合は、エラーを返してすぐに戻ります。実際のクエリを実行せずにJDBC文のSQL構文を確認するにはどうすればよいですか?
「確認文」ボタンのように、文を(JDBC経由で)実行せずに構文が有効であることを確認したいと思います。ベンダーに依存しない方法がありますか? PreparedStatementとしてクエリを単に定義するという私の最初の考えは、コンパイルやエラーチェックのようなものではないようです。
有効な場合に実行に時間がかかるSQL文(Oracleデータベース用)があります。有効でない場合は、エラーを返してすぐに戻ります。実際のクエリを実行せずにJDBC文のSQL構文を確認するにはどうすればよいですか?
「確認文」ボタンのように、文を(JDBC経由で)実行せずに構文が有効であることを確認したいと思います。ベンダーに依存しない方法がありますか? PreparedStatementとしてクエリを単に定義するという私の最初の考えは、コンパイルやエラーチェックのようなものではないようです。
おそらく、このステートメントの説明計画を発行すると、有用な結果が得られます。
別の思考 - 多分難しい追加するクエリ(およびROWNUM < 1)、または、それはこれが本当の答えよりもハックの詳細ですが、あなたはクエリを実行することができ、高速
計画を説明する方法があります。クエリを「実行中」と同じ構文エラーが発生します –
バインドパラメータの処理方法は? – MRalwasser
クエリに単一のパラメータがあっても、これはうまくいきません。 –
を実行させるために何かを編集することですこれは、クエリが有効な場合TRUE
を返し、それが無効である場合、エラーを発生させる必要があります
SELECT (EXISTS (SELECT 1 FROM dual)
OR
EXISTS (your Query here)
) AS result
FROM dual
:それは常に1行1列を返します。
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;
/
SELECTクエリを扱う場合は、おそらくJDBC PreparedStatement#getMetaDataが機能しますか?
あなたは、構文チェック(download here)を実行するためにOracle's Pro*C precompilerを使用することができます。
これは、生のOracleのSQL文を含むCコードをプリコンパイルすることを意図したツールですが、あなたはSQLの構文チェックを実行するためにそれを「虐待」することができます。
このコードでファイルtest.pcを作成します。
DUAL FROMEXEC SQL SELECT *た1 = 1;
を実行し、このコマンドプリコンパイラ・ツールをインストールした後:行1で
構文エラー、列34、ファイル:
のproc INAME =テストSQLCHECK = SYNTAX
をあなたはこの出力が表示されます。 test.pc: ファイルtest.pcの1行目、34列目のエラー
EXEC SQL SELECT * FROM DUAL WERE 1 = 1;
................................. 1
PCC-S-02201、記号 "1"以下のいずれかを予期している場合:
;
シンボル、と「を有する、」続けるには「1」に置き換えた場合、組合のため、開始、 ため、有する基、接続交差、マイナス。
これをソリューションに統合するのは簡単です。
オンラインセマンティクスチェックを実行して、使用されているすべてのプロシージャとテーブルが特定のスキーマで有効であることを確認することもできます。あなたはSQLCHECK = SEMANTICS USERID = youruserを渡します。
多分、この他の質問に対する答えがあなたを助けるかもしれません:http://stackoverflow.com/questions/141499/any-java-libraries-out-there-that-validate -sql-syntax –