sql >> Database >  >> RDS >> Oracle

Tabel- en kolomnamen ontleden uit SQL/HQL Java

Er zijn meerdere manieren om dit te bereiken met JSqlParser (https://github.com/JSQLParser/JSqlParser):

  1. Je zou TableNamesFinder . kunnen pimpen om ook alle kolommen te doorlopen. Zoals je kon zien in de resultatenlijst, TableNamesFinder doorloopt niet alle exemplaren van Kolommen , omdat het er niet voor nodig is. Dus men moet hier ook de traversal-implementatie voltooien, wat ik niet heb gedaan.

  2. U zou JSqlParser AST - Node-functie kunnen gebruiken om alle kolommen te krijgen. Voor specifieke producties produceert JSqlParser nodes voor een parse tree. Kolom is een van hen.

Om de implementatie te voltooien moet men alle kolommen verzamelen en deze lijst onderscheiden (case, tabel, enz.)

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

Men moet in gedachten houden dat JSqlParser slechts een parser is. Daarom is het niet mogelijk om de tabelnaam van de kolommen te krijgen zonder deze te specificeren zoals in (table.column). Om dit goed te krijgen moet het databaseschema beschikbaar zijn. Dit wordt duidelijk als je kijkt naar:

select a from table1, table2

wat een geldige SQL is.




  1. Configuratietabellen gebruiken om de werkelijke workflow te definiëren

  2. invoerbestand lijkt een dump in tekstformaat te zijn. Gebruik alstublieft psql

  3. 5 manieren om tijdelijke tabellen weer te geven met T-SQL

  4. Rollen en rolattributen beheren in PostgreSQL