проанализировать sql запрос в java - PullRequest
0 голосов
/ 05 февраля 2020

Мне нужно решить эту проблему:

  • представьте, что у вас есть файл conf, содержащий один или несколько sql запросов.
  • все sql запросы должны точно возвращаться такое же количество столбцов.

Как только конфигурация загружена и все sql запросы сохранены в строковом массиве, как я могу проанализировать каждый запрос, чтобы узнать количество возвращенных столбцов.

Если синтаксис простой (SELECT a, b, c FROM test WHERE ...), довольно просто разрезать между SELECT и FROM, а затем разделить на «,» и считать. Но этого недостаточно, если есть используемые функции (SELECT a, concat (b, c), d ОТ теста WHERE ...)

Чтобы уточнить, у меня есть такой код:

    ArrayList<String> requests_list = new ArrayList<String>();
    // ...
    // ... loading requests from a file in requests_list
    // ...
    String[] requests_tab = requests_list.toArray(new String[requests_list.size()]);

    int numcols = numberOfColumnsInSqlRequest(requests_tab[0]);
    for(int i=1; i<requests_tab.length; i++){
        int nbcols = numberOfColumnsInSqlRequest(requests_tab[i]);
        if(nbcols != numcols){
            logger.error("all sql requests does not return the same number of columns");
            return false;
        }
    }

Пока у меня есть это:

    private static int numberOfColumnsInSqlRequest(String request){
        String lcrequest = request.toLowerCase();
        String ln = System.getProperty("line.separator");        
        Pattern pattern = Pattern.compile("[\t "+ln+"]from[\t "+ln+"]");
        Matcher matcher = pattern.matcher(lcrequest);
        matcher.find();
        String select = request.substring(0, matcher.start());

        String[] tab = select.split(",");
        return tab.length;
    }

Но я бы хотел улучшить это

Спасибо за вашу помощь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...