Oracle
 sql >> डेटाबेस >  >> RDS >> Oracle

एसक्यूएल/एचक्यूएल जावा से पार्सिंग टेबल और कॉलम नाम

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. ORA-01861:शाब्दिक प्रारूप स्ट्रिंग से मेल नहीं खाता

  2. Oracle डाटाबेस क्लाइंट स्टेप बाय स्टेप स्थापित करें

  3. SQL डेवलपर 4.1.3 जारी किया गया

  4. यूआईडी - ओरेकल में वर्तमान सत्र की आईडी लौटाएं

  5. Oracle में पुनरावर्ती क्वेरी