Регулярное выражение для разделения кода SQL на несколько пакетовJAVA

Программисты JAVA общаются здесь
Anonymous
Регулярное выражение для разделения кода SQL на несколько пакетов

Сообщение Anonymous »

У нас есть программа на Java, которая используется для передачи произвольного кода SQL на SQL-серверы через JDBC.
В более старых версиях входной SQL-код просто разделялся на символ ;. отправка одной части за раз с использованием ReadedStatement JDBC.
Это было слишком простодушно - что, если ; встречается внутри строкового литерала? -- поэтому новый код попытался передать весь SQL-код на сервер в one ReadyStatement.
Это сработало для большей части наших существующих SQL-файлов. , за исключением тех, которые создают хранимые процедуры и выполняют их:

Код: Выделить всё

INSERT INTO #MEOW VALUES('foo', 1);
INSERT INTO #MEOW VALUES('bar', 2);
CREATE PROCEDURE #MEOW_sp
AS
BEGIN
SELECT BAR, FOO INTO #WOOF FROM #MEOW
END;
INSERT INTO #MEOW VALUES('boo', 11);
exec #MEOW_sp;
Согласно документации SQL Server, CREATE PROCEDURE должен быть единственным оператором в пакете.
Итак, нам все еще нужно разделить SQL-объекты, но мне бы хотелось более сложное разделение границ, чем ;. Каким будет шаблон, который разделит приведенный выше код SQL на три части:
  • Одна с двумя INSERT.
  • Один с CREATE PROCEDURE.
  • Один с третьим INSERT и exec.
Думаю, придется использовать регулярное выражение с упреждением, что-то вроде (?=(((CREATE|ALTER)\\s+PROCEDURE[^;] +;*))) -- но это не работает...

Подробнее здесь: https://stackoverflow.com/questions/790 ... le-batches

Вернуться в «JAVA»