Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Mengurai nama tabel dan kolom dari SQL/HQL Java

Ada beberapa cara untuk mencapai ini menggunakan JSqlParser (https://github.com/JSQLParser/JSqlParser):

  1. Anda bisa menjadi mucikari TableNamesFinder untuk melintasi semua kolom juga. Seperti yang Anda lihat di daftar hasil, TableNamesFinder tidak melintasi semua kemunculan Kolom , karena tidak perlu untuk itu. Jadi kita harus menyelesaikan implementasi traversal di sini juga, yang tidak saya lakukan.

  2. Anda dapat menggunakan JSqlParser AST - Fitur simpul untuk mendapatkan semua Kolom. Untuk produksi tertentu JSqlParser menghasilkan node untuk pohon parse. Kolom adalah salah satunya.

Untuk menyelesaikan implementasi, seseorang harus mengumpulkan semua kolom dan membuat daftar ini berbeda (kasus, tabel, dll.)

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

Kita harus ingat, bahwa JSqlParser hanyalah sebuah parser. Oleh karena itu tidak mungkin untuk mendapatkan nama tabel kolom tanpa ditentukan seperti di (table.column). Untuk mendapatkan hak ini skema database harus tersedia. Ini menjadi jelas jika Anda melihat:

select a from table1, table2

yang merupakan SQL yang valid.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kesalahan ORA-12514 setelah memulai ulang server

  2. 4 Contoh Blok Anonim PL/SQL

  3. Cara Mempercantik Hasil Kueri Berformat JSON di SQLcl (Oracle)

  4. Perubahan Grup Layanan di R12.2

  5. Dapatkan id sisipan dalam pernyataan yang sama