有効な場合でも実行に時間がかかる SQL ステートメント (Oracle データベース用) があります。有効でない場合は、すぐにエラーが返されます。
たとえば、「ステートメントのチェック」ボタンの後ろなど、ステートメントを実行せずに (JDBC を介して) 構文が有効であることを確認したいと思います。それを行うベンダーに依存しない方法はありますか?単純にクエリを PreparedStatement として定義するという最初の考えでは、コンパイルやエラー チェックはまったく行われないようです。
有効な場合でも実行に時間がかかる SQL ステートメント (Oracle データベース用) があります。有効でない場合は、すぐにエラーが返されます。
たとえば、「ステートメントのチェック」ボタンの後ろなど、ステートメントを実行せずに (JDBC を介して) 構文が有効であることを確認したいと思います。それを行うベンダーに依存しない方法はありますか?単純にクエリを PreparedStatement として定義するという最初の考えでは、コンパイルやエラー チェックはまったく行われないようです。
おそらく、ステートメントの説明計画を発行すると、有用な結果が得られます。
別の考え-しかし、おそらく難しいのは、クエリを編集して追加(およびrownum <1)するか、何かを高速に実行することです。
SELECT クエリを扱っている場合、おそらく JDBC PreparedStatement#getMetaDataが機能するでしょうか?
これは実際の答えというよりはハックですが、常に1つの行と1つの列を返すクエリを実行できます。
SELECT ( EXISTS (SELECT 1 FROM dual)
OR
EXISTS (your Query here)
) AS result
FROM dual
クエリが有効な場合はこれが返さTRUE
れ、無効な場合はエラーが発生します。
DBMS_SQL.PARSE
ステートメントを確認するために使用できます。警告: DML ステートメントを解析するだけですが、create table などの 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;
/