Oracle
 sql >> база данни >  >> RDS >> Oracle

Синтактичен анализ на имена на таблици и колони от SQL/HQL Java

Има няколко начина да постигнете това с помощта на JSqlParser (https://github.com/JSQLParser/JSqlParser):

  1. Можете да сводните TableNamesFinder за да преминете и всички колони. Както можете да видите в списъка с резултати, TableNamesFinder не преминава през всички срещания на Колони , защото не е необходимо за това. Така че и тук трябва да завършите реализацията на обхода, което не направих.

  2. Можете да използвате JSqlParser AST – функция за възел за да получите всички колони. За специфични продукции JSqlParser произвежда възли за дърво за синтактичен анализ. Колона е един от тях.

За да завършите внедряването, трябва да съберете всички колони и да направите този списък различен (случай, таблица и т.н.)

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

Трябва да се има предвид, че JSqlParser е само анализатор. Следователно не е възможно да се получи името на таблицата с колони, без да е посочено като в (table.column). За да направите това правилно, схемата на базата данни трябва да е налична. Това става ясно, ако погледнете:

select a from table1, table2

което е валиден SQL.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да проверя дали съществува съхранена процедура?

  2. Oracle - Защо водещата нула на число изчезва при преобразуването му в TO_CHAR

  3. Най-лесният метод за тестване на Oracle Stored Procedure

  4. Използване на изглед без първичен ключ с Entity

  5. Има ли някакъв начин пула за връзки на JBoss да се свърже отново с Oracle, когато връзките се развалят?