Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Parsowanie nazw tabel i kolumn z SQL/HQL Java

Istnieje wiele sposobów na osiągnięcie tego za pomocą JSqlParser (https://github.com/JSQLParser/JSqlParser):

  1. Możesz podrasować TableNamesFinder aby przejść przez wszystkie kolumny. Jak widać na liście wyników, TableNamesFinder nie przemierza wszystkich wystąpień kolumn , bo nie jest to konieczne. Dlatego też tutaj trzeba dokończyć implementację przechodzenia, czego ja nie zrobiłem.

  2. Możesz użyć JSqlParser AST - funkcja węzła aby uzyskać wszystkie kolumny. Dla określonych produkcji JSqlParser tworzy węzły dla drzewa analizy. Kolumna jest jednym z nich.

Aby zakończyć implementację, należy zebrać wszystkie kolumny i wyróżnić tę listę (przypadek, tabela itp.)

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

Trzeba mieć na uwadze, że JSqlParser jest tylko parserem. Dlatego nie jest możliwe uzyskanie nazwy tabeli kolumn bez podania jej jak w (tabela.kolumna). Aby to zrobić, schemat bazy danych musi być dostępny. Staje się to jasne, jeśli spojrzysz na:

select a from table1, table2

który jest prawidłowym 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. PL/SQL:jak monitować użytkownika o wprowadzenie danych w procedurze?

  2. Funkcja MOD() w Oracle

  3. zwróć zbiór wyników z funkcji

  4. Oracle, jak wyeksportować zapytanie do pliku tekstowego/csv

  5. Konwertuj uniksowy znacznik czasu na wartość daty w Oracle