Какой самый простой способ анализа многострочных операторов SQL в Java? - PullRequest
0 голосов
/ 27 октября 2009

Я довольно новичок в Java, но я ищу код Java, который может принимать многострочные операторы SQL, например, что-то вроде этого из простого файла:

CREATE OR REPLACE TRIGGER REQ.TR_INPT_STAY_DETAI_SQ_BI
  BEFORE INSERT ON REQ.INPT_STAY_DETAIL
  FOR EACH ROW
BEGIN
  SELECT REQ.SQ_INPT_DETAIL.nextval INTO :new.INPT_STAY_DETAIL_PID from DUAL;
END;

И преобразуйте эти многострочные операторы в однострочные SQL-операторы, подобные этим (возможно, обернутые в это отображение), чтобы они выполнялись как один оператор JDBC для базы данных Oracle:

CREATE OR REPLACE TRIGGER REQ.TR_INPT_STAY_DETAI_SQ_BI BEFORE INSERT ON REQ.INPT_STAY_DETAIL FOR EACH ROW BEGIN SELECT REQ.SQ_INPT_DETAIL.nextval INTO :new.INPT_STAY_DETAIL_PID from DUAL; END;

Я пытался сделать это с несколькими BufferedReaders и / или с помощью метода mark (), но я не могу заставить его работать.

Проблема, похоже, заключается в точке с запятой как в конце длинного выражения, так и в конце END; заявление.

Ваши мысли о простейшем способе сделать это?


Я думаю, что добился определенного прогресса, но если в том же входном файле SQL также есть более простые команды SQL, например:

DROP TABLE TABLE.NAME_HERE;

Они потерпят неудачу при моем первом условии здесь:

if ( !thisLine.startsWith("END;") && !thisLine.equals("/") ) {
    sqlBuf.append(thisLine).append(" ");
    statementReady = false;
}
else if (thisLine.startsWith("END;")) {
    sqlBuf.append(thisLine).append(" ");
    statementReady = true;
}
else if (thisLine.equals("/")) {
    statementReady = true;
}
else { }

Я проверяю переменную statemendReady позже, перед тем как запустить .execute.

Ответы [ 4 ]

3 голосов
/ 27 октября 2009

Просто прочитайте в каждой строке и добавьте их с помощью StringBuilder, но не добавляйте ни одной строки, содержащей End;, так как она вам не понадобится для запроса.

Вы также должны игнорировать Go, если файл имеет это.

Тогда вы можете просто превратить StringBuilder в String, и он у вас есть.

Просто не забудьте поставить пробел между каждой строкой.

Подробнее о чтении нескольких строк из файла вы можете посмотреть на: http://www.roseindia.net/java/beginners/java-read-file-line-by-line.shtml

Важная часть:

StringBuilder buf = new StringBuilder();
while ((strLine = br.readLine()) != null)   {
       if (!strLine.startsWith("End"))
          buf.append(strLine).append(" ");
    }
0 голосов
/ 08 января 2012

Синтаксис оператора SQL SQL довольно сложен, вы не можете легко получить оператор SQL или хранимую процедуру PLSQL из файла сценария с помощью этого алгоритма сопоставления строк. Вам нужен полностью работающий SQL Parser, который может правильно анализировать весь SQL-скрипт. Вот статья показывает, как это сделать с помощью general sql parser .

0 голосов
/ 27 октября 2009

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

(инструменты Unix, такие как sed, могут сделать это очень просто)

В остальном Джеймс прав (просто бей меня к этому).

0 голосов
/ 27 октября 2009

Одним из подходов может быть использование ANTLR. Он имеет Oracle SQL Gragram , который, безусловно, поможет во многих случаях, связанных с синтаксисом SQL.

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