14

有効な場合でも実行に時間がかかる SQL ステートメント (Oracle データベース用) があります。有効でない場合は、すぐにエラーが返されます。

たとえば、「ステートメントのチェック」ボタンの後ろなど、ステートメントを実行せずに (JDBC を介して) 構文が有効であることを確認したいと思います。それを行うベンダーに依存しない方法はありますか?単純にクエリを PreparedStatement として定義するという最初の考えでは、コンパイルやエラー チェックはまったく行われないようです。

4

5 に答える 5

12

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

別の考え-しかし、おそらく難しいのは、クエリを編集して追加(およびrownum <1)するか、何かを高速に実行することです。

于 2012-04-20T13:25:47.813 に答える
6

SELECT クエリを扱っている場合、おそらく JDBC PreparedStatement#getMetaDataが機能するでしょうか?

于 2012-04-20T15:36:13.903 に答える
5

これは実際の答えというよりはハックですが、常に1つの行と1つの列を返すクエリを実行できます。

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

クエリが有効な場合はこれが返さTRUEれ、無効な場合はエラーが発生します。

于 2012-04-20T14:17:27.840 に答える
2

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;
/
于 2012-04-20T15:21:02.500 に答える