2013-12-23 2 views
3

Я пишу инструмент в Java, который отправляет операторы в базу данных, которые позже запускаются. Я использую JDBC для подключения к базе данных. База данных - это Oracle 10g.Использование парсера базы данных Oracle из Java с использованием JDBC

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

Так по существу мой вопрос:

Есть ли способ, с помощью JDBC Я могу сделать вызов парсера базы данных передавая ей оператор SQL и возвратит мне какую-то обратную связь, говоря мне, если она была успешной или любые сообщения об ошибках?

Любая помощь с благодарностью, Большое спасибо.

Edit:

Использование connection.prepareStatement, кажется, не работает, например, это выводит разобранный успешно!

String statement = "WHERE DISTINCT SELECT"; 
    Connection connection; 
    try { 
     connection = this.controller.getDataSource().getConnection(); 
     connection.prepareStatement(statement); 
     connection.close(); 
     mainPanel.setPositiveText("Parsed Successfully!"); 
    } catch (Exception e) { 
     mainPanel.setNegativeText("ERROR: " + e.getMessage()); 
     return; 
    } 

soultion я использовал следующим образом:

String statement = "DECLARE " 
      + "myNumber NUMBER; " 
      + "BEGIN " 
      + "myNumber := SYS.dbms_sql.open_cursor; " 
      + "SYS.DBMS_SQL.PARSE(myNumber, '" + text + "', SYS.DBMS_SQL.NATIVE); " 
      + "END;"; 

    Connection connection; 
    try { 
     connection = this.controller.getDataSource().getConnection(); 
     PreparedStatement preparedStatement = connection.prepareStatement(statement); 
     preparedStatement.execute(); 
     connection.close(); 
     mainPanel.setPositiveText("Parsed Successfully!"); 
    } catch (Exception e) { 
     mainPanel.setNegativeText("ERROR: " + e.getMessage()); 
     System.out.println(e.getMessage()); 
     return; 
    } 
+0

Заявление execQuery или execUpdate методы будут генерировать исключение. –

ответ

7

Я понятия не имею, что именно вы хотите achiveve но, возможно, лет migh пытаются использовать пакет DBMS_SQL и это метод PARSE. Это работает только с операторами DML. Это то, что делает Oracle SQL Developer.

Этот parser может также использоваться для операторов DML. Для PL/SQL это потребует некоторой настройки. Насколько я знаю, никто не потратил достаточно времени, чтобы создать настоящий полностью проверяющий парсер для DDL Oracle.

Here является примером того, как я использую его:

declare 
l_cursor number := dbms_sql.open_cursor; 
l_offset number := -1 ; 
begin 
    begin 
    dbms_sql.parse(l_cursor, :st, dbms_sql.native); 
    exception when others then 
    l_offset := dbms_sql.last_error_position; 
    end; 
dbms_sql.close_cursor(l_cursor); 
    :off := l_offset; 
end; 

Просто выполнить этот блок. Передайте один входной параметр типа VARCHAR2 (String) (макс. 32 КБ) и один выходной параметр NUMBER.

+0

Привет, Иван, dbms_sql.parse, похоже, что мне нужно. Не могли бы вы дать мне небольшой пример его использования, пожалуйста? Я хочу, чтобы любые переменные, временное, в результате выполнения операторов не должно быть ничего останова. –

+0

Can t его использовать с jdbc, я считаю, что нам нужно выполнить execute(). ТАК, это поможет? –

+0

Вы должны выполнить, если с JDBC в качестве анонимного блока PL/SQL. – ibre5041

1

без выполнения запроса, вы не можете получить обратную связь (или ResultSet, об этом. Connection.preparedStatement просто вернуть вам PreparedStatement объект, который является только обработчик.

PreparedStatement.executeQuery() только то, что на самом деле выполняет запрос, нажав на в базе данных

Смежные вопросы