Oracle
 sql >> Base de données >  >> RDS >> Oracle

Analyse des noms de table et de colonne à partir de SQL/HQL Java

Il existe plusieurs façons d'y parvenir en utilisant JSqlParser (https://github.com/JSQLParser/JSqlParser):

  1. Vous pourriez pimper TableNamesFinder pour parcourir également toutes les colonnes. Comme vous pouvez le voir dans la liste des résultats, TableNamesFinder ne traverse pas toutes les occurrences de Colonnes , car ce n'est pas nécessaire pour cela. Il faut donc terminer l'implémentation de la traversée ici également, ce que je n'ai pas fait.

  2. Vous pouvez utiliser JSqlParser AST - Fonction de nœud pour obtenir toutes les colonnes. Pour des productions spécifiques, JSqlParser produit des nœuds pour un arbre d'analyse. Colonne est l'un d'eux.

Pour terminer l'implémentation, il faut collecter toutes les colonnes et rendre cette liste distincte (cas, table, etc.)

String sql = "SELECT * FROM  ( ( SELECT TBL.ID AS rRowId, TBL.NAME AS name, TBL.DESCRIPTION as description, TBL.TYPE AS type, TBL1.SHORT_NAME AS shortName  FROM ROLE_TBL TBL WHERE ( TBL.TYPE = 'CORE' OR  TBL1.SHORT_NAME = 'TNG' AND  TBL.IS_DELETED <> 1  ) ) MINUS ( SELECT TBL.ID AS rRowId, TBL.NAME AS name, TBL.DESCRIPTION as description, TBL.TYPE AS type, TBL3.SHORT_NAME AS shortName,TBL3.NAME AS tenantName FROM ROLE_TBL TBL INNER JOIN TYPE_ROLE_TBL TBL1 ON TBL.ID=TBL1.ROLE_FK LEFT OUTER JOIN TNT_TBL TBL3 ON TBL3.ID = TBL.TENANT_FK LEFT OUTER JOIN USER_TBL TBL4 ON TBL4.ID = TBL1.USER_FK WHERE ( TBL4.ID =771100 AND  TBL.IS_DELETED <> 1  ) ) ) ORDER BY name ASC";

    System.out.println("using TableNamesFinder to get column names");
    Statement statement = CCJSqlParserUtil.parse(sql);
    Select selectStatement = (Select) statement;
    TablesNamesFinder tablesNamesFinder = new TablesNamesFinder() {
        @Override
        public void visit(Column tableColumn) {
            System.out.println(tableColumn);
        }
    };
    tablesNamesFinder.getTableList(selectStatement);

    System.out.println("-------------------------------------------");
    System.out.println("using ast nodes to get column names");
    SimpleNode node = (SimpleNode) CCJSqlParserUtil.parseAST(sql);

    node.jjtAccept(new CCJSqlParserDefaultVisitor() {
        @Override
        public Object visit(SimpleNode node, Object data) {
            if (node.getId() == CCJSqlParserTreeConstants.JJTCOLUMN) {
                System.out.println(node.jjtGetValue());
                return super.visit(node, data);
            } else {
                return super.visit(node, data);
            }
        }
    }, null);

Il faut garder à l'esprit que JSqlParser n'est qu'un parseur. Par conséquent, il n'est pas possible d'obtenir le nom de la table des colonnes sans l'avoir spécifié comme dans (table.column). Pour obtenir ce droit, le schéma de la base de données doit être disponible. Cela devient clair si vous regardez :

select a from table1, table2

qui est un SQL valide.