4

ユーザーが後でバッチ処理するために任意のSQLクエリを入力するWebアプリケーションがあります。実際に実行せずに、クエリの構文を検証したいと思います。一部のクエリには時間がかかるため、実行したくありません。これを行うために、Oracleのdbms_sql.parseを使用しています。

ただし、結果セットの列の数とタイプを知る必要がある状況になりました。実際にクエリを実行せずにこれを行う方法はありますか?つまり、Oracleにクエリを解析させ、クエリが実際に実行されたときに返される結果のデータ型/名前を教えてもらうにはどうすればよいでしょうか。私はOracle10gを使用しており、これはJava 1.5 /Servlet2.4アプリケーションです。

編集:クエリを入力するユーザーは、すでにデータベースのユーザーです。彼らはデータベースのクレデンシャルで私のアプリを認証し、クエリはそれらのクレデンシャルを使用して実行されます。したがって、sqlplusに接続するだけでは実行できなかったクエリを入力することはできません。

4

2 に答える 2

7

構文を検証して結果セットのメタデータを取得するための SQL クエリを準備できるはずです。クエリを準備しても実行しないでください。

import java.sql.*;
. . .
Connection conn;
. . .
PreparedStatement ps = conn.prepareStatement("SELECT * FROM foo");
ResultSetMetadata rsmd = ps.getMetaData();
int numberOfColumns = rsmd.getColumnCount();

次に、結果セットの各列に関するメタデータを取得できます。

于 2008-10-02T17:11:25.287 に答える
4

厳密に pl/sql を使用してこれを行いたい場合は、次のようにすることができます。

DECLARE 
  lv_stat varchar2(100) := 'select blah blah blah';
  lv_cur INTEGER;
  lv_col_cnt INTEGER;
  lv_desc DBMS_SQL.desc_tab;
BEGIN
  DBMS_SQL.parse(lv_cur,lv_stat,DBMS_SQL.NATIVE);
  DBMS_SQL.describe_columns(lv_cur,lv_col_cnt,lv_desc);
  FOR ndx in lv_desc.FIRST .. lv_desc.LAST LOOP
    DBMS_OUTPUT.PUT_LINE(lv_desc(ndx).col_name ||' '||lv_desc(ndx).col_type);
  END LOOP;
END;

DBMS_SQL.desc_tab には、列について知っておく必要のあるほとんどすべての情報が含まれています。

于 2009-01-16T12:53:07.740 に答える