2016-07-12 17 views
5

私のアプリケーションからOracleテーブル情報を読み込もうとしています。テーブルの説明を取得するには、私は自分のアプリケーションでこのクエリを実行します。ここではPreparedステートメントがSQLの正確な結果を取得しません

SELECT DBMS_METADATA.GET_DDL('TABLE', 'CONTRACT_TABLE' ,'SCHEMA_NAME') FROM DUAL 

は、クエリを実行するコードのブロックです:

 PreparedStatement preparedStatement = null; 
     ResultSet resultSet = null; 

     String sql = "SELECT DBMS_METADATA.GET_DDL('TABLE', 'CONTRACT_TABLE' ,'SCHEMA_NAME') FROM DUAL"; 
     preparedStatement = connection.prepareStatement(sql); 
     resultSet = preparedStatement.executeQuery(); 

     if (resultSet.next()) { 
      Clob clob = resultSet.getClob(1); 
      String str = clob.getSubString(1, (int)clob.length()); 
      return str;    
     } else { 
      throw new DBPlatformException("Object not available [Schema: " 
        + schema + "].[Name: " + objectName + "]!"); 
     } 

私はデータベースに直接SQLを実行すると、私はこの結果を得ます:

CREATE TABLE "SCHEMA_NAME"."CONTRACT_TABLE" 
    ( "CONTRACT_ID" NUMBER, 
    "START_DATE" DATE, 
    "END_DATE" DATE 
    ) PCTFREE 0 PCTUSED 0 INITRANS 1 MAXTRANS 255 
COMPRESS FOR QUERY HIGH NOLOGGING 
    STORAGE(
    BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT) 
    TABLESPACE "TMP_SPACE" 
    PARTITION BY HASH ("CONTRACT_ID") 
(PARTITION "P01" SEGMENT CREATION DEFERRED 
    TABLESPACE "TMP_SPACE" 
COMPRESS FOR QUERY HIGH , 
PARTITION "P02" SEGMENT CREATION DEFERRED 
    TABLESPACE "TMP_SPACE" 
COMPRESS FOR QUERY HIGH , 
PARTITION "P03" SEGMENT CREATION DEFERRED 
    TABLESPACE "TMP_SPACE" 
COMPRESS FOR QUERY HIGH , 
PARTITION "P04" SEGMENT CREATION DEFERRED 
    TABLESPACE "TMP_SPACE" 
COMPRESS FOR QUERY HIGH , 
PARTITION "P05" SEGMENT CREATION DEFERRED 
    TABLESPACE "TMP_SPACE" 
COMPRESS FOR QUERY HIGH) 
    PARALLEL 32 

私は自分のアプリケーションを実行すると、それはこのように結果を返します:

CREATE TABLE "SCHEMA_NAME"."CONTRACT_TABLE" 
    ( "CONTRACT_ID" NUMBER, 
    "START_DATE" DATE, 
    "END_DATE" DATE 
    ) 
    PARTITION BY HASH ("CONTRACT_ID") 
(PARTITION "P01" , 
PARTITION "P02" , 
PARTITION "P03" , 
PARTITION "P04" , 
PARTITION "P05") 

私のアプリケーションが返す結果は、より少ない情報しか持っていません。私はテーブルが平行かどうかを知る必要がありますが、私のアプリケーションは私にその情報を与えることはできません。

私は、クエリの結果が異なる理由と、どのようにして並列情報を取得できるのかを把握しようとしています。

+0

JDBC DDLの制限は多分ですか? – fge

+0

私が間違っている場合は私を訂正してください。私はJDBC上で直接ddl情報を取得していません。 ddl情報を取得するために、私はクエリを実行し、結果を読み取ります。私はJDBCのDDLの制限はこの問題とは関係ないと思います。 – seckinozden

答えて

1

はJavaであなたの文の前に

begin 
    DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'STORAGE',TRUE); 
    DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'TABLESPACE',TRUE); 
    DBMS_METADATA.SET_TRANSFORM_PARAM(DBMS_METADATA.SESSION_TRANSFORM,'SEGMENT_ATTRIBUTES',TRUE); 
end; 
/

を実行して結果が変わるかどうかを確認してください。

+0

@Evgeniy Kさん、ありがとうございます。私はそれを試しましたが、何も変わっていませんでした:( – seckinozden

+0

もう一度@Evgeniy K.あなたの答えは私の問題の解決策です。私のアプリケーション。私はコードのその部分を更新しました。今私は期待どおりの完全なテーブルの説明を取得することができます。 – seckinozden

関連する問題