2016-07-12 18 views
5

Ich versuche, die Oracle-Tabelleninformationen aus meiner Anwendung zu lesen. Um die Tabellenbeschreibung zu erhalten, führe ich diese Abfrage auf meiner Anwendung:Prepared Statement ruft nicht das genaue Ergebnis des SQL

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

Hier ist der Code-Block, die Abfrage ausführt:

 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 + "]!"); 
     } 

Wenn ich die SQL direkt auf der Datenbank ausgeführt bekomme ich dieses Ergebnis :

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 

Wenn ich meine Anwendung ausführen, gibt es das Ergebnis wie folgt aus:

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") 

Das Ergebnis, das meine Anwendung zurückgibt, enthält weniger Informationen. Ich muss wissen, ob Tabelle parallel ist oder nicht, aber meine Anwendung kann mir diese Information nicht geben.

Ich versuche herauszufinden, warum die Ergebnisse der Abfrage unterscheidet und wie kann ich parallele Informationen abrufen.

+0

JDBC DDL Einschränkungen, vielleicht? – fge

+0

Korrigieren Sie mich Wenn ich falsch liege. Ich bekomme keine ddl Informationen direkt über JDBC. Um die ddl-Informationen zu erhalten, führe ich eine Abfrage aus und lese das Ergebnis. Ich glaube nicht, dass JDBC DDL-Einschränkungen etwas mit diesem Problem zu tun haben. – seckinozden

Antwort

1

Versuchen

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; 
/

bevor Sie Anweisung in Java ausführen und wenn die Ergebnisse ändern sehen.

+0

Danke für die Antwort @Evgeniy K. Ich habe es versucht, aber nichts geändert :( – seckinozden

+0

Hallo nochmal @Evgeniy K. Ihre Antwort ist die Lösung für mein Problem. Ich finde, dass es einen Code gibt, der die Sitzungsparameter während der Ausführung von Meine Anwendung. Ich habe diesen Teil des Codes aktualisiert. Jetzt kann ich die vollständige Beschreibung der Tabelle erhalten, wie ich es erwartet habe. Danke für Ihre Hilfe :) – seckinozden