0
votes

Comment puis-je obtenir les clés primaires à partir de tables logiques dans DB2?

Je travaille donc sur AS400 , DB2 System . J'ai écrit une méthode qui me fournit les clés primaires de chaque table physique . Mais sur certaines tables, les clés primaires ne sont définies que sur la table logique . Là, ma méthode ne fonctionne pas.

@Override
    public ArrayList<Field> getPKS(String lib) {
        ArrayList<Field> pkList = new ArrayList<>();
        try (Connection connection = DriverManager.getConnection("jdbc:as400://" + ConnectionData.SYSTEM + ";naming=system;libraries=*" + lib + ";",
                ConnectionData.USER, ConnectionData.PASSWORD);
                            
                ResultSet rs = connection.getMetaData().getPrimaryKeys(null, connection.getSchema(), "LSAVSLA")){
                while (rs.next()) {
                    pkList.add(new Field(rs.getString("COLUMN_NAME")));
                }
           
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return pkList;
    
    }

Pour une table physique, cela fonctionne, mais pour une table logique, ce n'est pas le cas. Avez-vous une idée de la façon d'obtenir les clés primaires de la table logique .


0 commentaires

3 Réponses :


0
votes

Les fichiers logiques ne contiennent pas de données. Ils contiennent une description des enregistrements trouvés dans un ou plusieurs fichiers physiques. Un fichier logique est une vue ou une représentation d'un ou plusieurs fichiers physiques

dit le manuel . De même pour une vue dans un SGBDR conventionnel, vous ne pouvez pas définir une clé primaire pour un fichier logique.


0 commentaires

0
votes

Donc, fondamentalement, ce que vous avez, ce sont des fichiers physiques (ou des tables SQL) définis sans clé primaire et des fichiers logiques ou (index SQL) définis avec une clé unique.

Sur IBM i, un fichier logique peut agir en tant qu'index SQL et SQL View ou les deux à la fois. Comme le mentionne Mustaccio, il n'y a pas de données réelles dans l'objet.

Le mieux est d'interroger la vue de catalogue SYSTABLEINDEXS à la recherche d'une clé primaire ou d'index uniques sur une table donnée.

Vous pouvez également jeter un œil à la méthode getIndexes () .


0 commentaires

0
votes

J'ai trouvé une solution en sélectionnant le champ "DBKFLD" dans "QSYS.QADBKATR"
La requête SQL:
SELECT DBKFLD FROM QSYS.QADBKATR WHERE DBKLIB = "Votre lib" AND DBKFIL = "Votre table"

Le code Java:

Statement statement = connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_READ_ONLY);
ResultSet resultSetQuery = statement.executeQuery("select DBKFLD from QSYS.QADBKATR where DBKLIB = '" + lib + "' and DBKFIL = '" + tablename + "'")) {
    
    ResultSetMetaData metadata = resultSetQuery.getMetaData();
                    int columnCount = metadata.getColumnCount();
        
                    while (resultSetQuery.next()) {
        
                        
                        for (int i = 1; i <= columnCount; i++) {
        
                            String pk = resultSetQuery.getString(i);
                            pk = pk.replaceAll("\\s+", "");
        
                            pkList.add(new Feld(pk));
        
                        }
                        
                    }
        
                    return pkList;


0 commentaires