Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Phân tích cú pháp tên bảng và cột từ SQL / HQL Java

Có nhiều cách để đạt được điều này bằng cách sử dụng JSqlParser (https://github.com/JSQLParser/JSqlParser):

  1. Bạn có thể tạo ra TableNamesFinder để đi qua tất cả các cột. Như bạn có thể thấy tại danh sách kết quả, TableNamesFinder không đi qua tất cả các lần xuất hiện của Cột , bởi vì nó không cần thiết cho nó. Vì vậy, người ta cũng phải hoàn thành việc triển khai truyền tải ở đây, điều mà tôi đã không làm.

  2. Bạn có thể sử dụng JSqlParser AST - Tính năng nút để lấy tất cả các Cột. Đối với các sản phẩm cụ thể, JSqlParser tạo ra các nút cho một cây phân tích cú pháp. Cột là một trong số họ.

Để hoàn thành việc triển khai, người ta phải thu thập tất cả các cột và làm cho danh sách này trở nên khác biệt (trường hợp, bảng, v.v.)

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

Người ta phải lưu ý rằng JSqlParser chỉ là một trình phân tích cú pháp. Do đó, không thể lấy tên bảng các cột mà không có nó được chỉ định như trong (table.column). Để làm được điều này, lược đồ cơ sở dữ liệu phải có sẵn. Điều này trở nên rõ ràng nếu bạn nhìn vào:

select a from table1, table2

là một SQL hợp lệ.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm thế nào để sử dụng Partition By hoặc Max?

  2. Perl DBI - chạy SQL Script với nhiều câu lệnh

  3. Thu thập hàng loạt vào và thực hiện ngay lập tức trong Oracle

  4. Số Oracle thành số thập phân C #

  5. ORA-28040:Không có ngoại lệ giao thức xác thực phù hợp