Получить имя таблицы из строкового запроса независимо от операции CRUD - PullRequest
0 голосов
/ 04 октября 2018

У меня есть строка, как показано ниже.Я должен получить все имя таблицы из этого.

 select SEQ_NO,CODE,CD_NAME,CD_TYPE,CD_CITY,CDS_STATUS,CDS_SUBSTATUS,  
 to_char(CDS_LAST_MOD_DATE,'dd/mm/yyyy') as CDS_LAST_MOD_DATE   from  
 company_details left outer join on company_details_status where  
 cd_seq_no=cds_seq_no,CODE=(select CODE from company_details where cd_seq_no='1' )  order by CDS_LAST_MOD_DATE.


Insert into table1 value(?,?)
Insert into table1 (col1,col2) values(?,?)

Как получить имя таблицы для запроса вставки, как указано выше.

1 Ответ

0 голосов
/ 04 октября 2018

Вот краткий код, который намекает на то, как вы можете решить эту проблему.Он использует сопоставление регулярных выражений со следующим шаблоном:

FROM\s+(\S+)|JOIN\s+(\S+)|INSERT\s+INTO\s+(\S+)

Целью здесь является захват имен таблиц всякий раз, когда они встречаются в операторах выбора (после FROM и JOIN) или в операторах вставки (послеINSERT INTO).Обратите внимание, что в паттерне используется чередование с тремя группами захвата.

String query =  "SELECT a.col1, b.col2 FROM tableA a INNER JOIN tableB b ";
       query += "ON a.key = b.key; INSERT INTO tableC (col1) VALUES ('hello')";
String pattern = "FROM\\s+(\\S+)|JOIN\\s+(\\S+)|INSERT\\s+INTO\\s+(\\S+)";

Pattern r = Pattern.compile(pattern, Pattern.CASE_INSENSITIVE);
Matcher m = r.matcher(query);
while (m.find()) {
    String match = m.group(1) != null ? m.group(1) :
        (m.group(2) != null ? m.group(2) : m.group(3));
    System.out.println(match);
}

tableA
tableB
tableC

Демонстрация

Очевидно, что существует множество краевых случаев, которые я мог пропустить,В общем, для полного решения вам, возможно, придется написать реальный анализатор SQL.Для простых запросов выбора и вставки это может быть хорошей отправной точкой.

...