Получить имя таблицы из строкового запроса независимо от операции CRUD
У меня есть строка, как показано ниже. Я должен получить все имя таблицы из этого.
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 ответ
Вот краткий код, который намекает на то, как вы можете подойти к этой проблеме. Он использует регулярное выражение со следующим шаблоном:
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. Для простых запросов выбора и вставки это может быть хорошей отправной точкой.