sql >> Databasteknik >  >> RDS >> Oracle

Analysera tabell- och kolumnnamn från SQL/HQL Java

Det finns flera sätt att uppnå detta med JSqlParser (https://github.com/JSQLParser/JSqlParser):

  1. Du kan pimpa TableNamesFinder för att korsa alla kolumner också. Som du kunde se på resultatlistan, TableNamesFinder går inte igenom alla förekomster av kolumner , eftersom det inte är nödvändigt för det. Så man måste slutföra genomgångsimplementeringen här också, vilket jag inte gjorde.

  2. Du kan använda JSqlParser AST - Node-funktion för att få alla kolumner. För specifika produktioner producerar JSqlParser noder för ett analysträd. Kolumn är en av dem.

För att slutföra implementeringen måste man samla alla kolumner och göra denna lista distinkt (case, tabell, 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);

Man måste ha i åtanke att JSqlParser bara är en parser. Därför är det inte möjligt att få kolumnernas tabellnamn utan att ha det specificerat som i (tabell.kolumn). För att få detta rätt måste databasschemat vara tillgängligt. Detta blir tydligt om du tittar på:

select a from table1, table2

som är en giltig SQL.




  1. Skapa dynamiskt kolumner sql

  2. Få summan av MySQL-kolumnen i PHP

  3. Finjustering av Oracle DG40DBC

  4. Hur man byter namn på en databas i MySQL