Где мой недопустимый персонаж (ORA-00911)

Я пытаюсь вставить CLOB s в базу данных (см. Соответствующий вопрос ). Я не могу понять, что случилось. У меня есть список около 85 clobs, которые я хочу вставить в таблицу. Даже при вставке только первого clob я получаю ORA-00911: invalid character . Я не могу понять, как получить утверждение из PreparedStatement до его выполнения, поэтому я не могу быть на 100% уверенным, что это правильно, но если я правильно понял, тогда он должен выглядеть примерно так:

 insert all into domo_queries values ('select substr(to_char(max_data),1,4) as year, substr(to_char(max_data),5,6) as month, max_data from dss_fin_user.acq_dashboard_src_load_success where source = ''CHQ PeopleSoft FS''') select * from dual; 

В конечном счете, это insert all оператор будет иметь много into ‘s, поэтому я просто не делаю регулярную инструкцию insert . Я не вижу там недействительного персонажа, не так ли? (О, и этот код выше отлично работает, когда я запускаю его в своем инструменте разработчика sql .) И я, если я удалю полуколонку в PreparedStatement , он выдает команду ORA-00933: SQL command not properly ended ошибку.

В любом случае, вот мой код для выполнения запроса (и значения переменных для приведенного выше примера).

 public ResultSet executeQuery(String connection, String query, QueryParameter... params) throws DataException, SQLException { // query at this point = "insert all //into domo_queries values (?) //select * from dual;" Connection conn = ConnectionPool.getInstance().get(connection); PreparedStatement pstmt = conn.prepareStatement(query); for (int i = 1; i <= params.length; i++) { QueryParameter param = params[i - 1]; switch (param.getType()) { //The type in the example is QueryParameter.CLOB case QueryParameter.CLOB: Clob clob = CLOB.createTemporary(conn, false, oracle.sql.CLOB.DURATION_SESSION); clob.setString(i, "'" + param.getValue() + "'"); //the value of param.getValue() at this point is: /* * select * substr(to_char(max_data),1,4) as year, * substr(to_char(max_data),5,6) as month, * max_data * from dss_fin_user.acq_dashboard_src_load_success * where source = ''CHQ PeopleSoft FS'' */ pstmt.setClob(i, clob); break; case QueryParameter.STRING: pstmt.setString(i, "'" + param.getValue() + "'"); break; } } ResultSet rs = pstmt.executeQuery(); //Obviously, this is where the error is thrown conn.commit(); ConnectionPool.getInstance().release(conn); return rs; } 

Есть ли что-то, что я просто не хватает большого времени?

Если вы используете строковый литерал точно так, как вы показали нам, проблема следующая ; символ в конце. Вы не можете включить это в строку запроса в вызовах JDBC.

Когда вы вставляете только одну строку, регулярный INSERT должен быть прекрасным даже при вставке нескольких строк. Использование пакетного утверждения, вероятно, более эффективно. Не нужно INSERT ALL . Кроме того, вам не нужен временный clob и все такое. Вы можете упростить свой метод примерно так (при условии, что я правильно понял параметры):

 String query1 = "select substr(to_char(max_data),1,4) as year, " + "substr(to_char(max_data),5,6) as month, max_data " + "from dss_fin_user.acq_dashboard_src_load_success " + "where source = 'CHQ PeopleSoft FS'"; String query2 = "....."; String sql = "insert into domo_queries (clob_column) values (?)"; PreparedStatement pstmt = con.prepareStatement(sql); StringReader reader = new StringReader(query1); pstmt.setCharacterStream(1, reader, query1.length()); pstmt.addBatch(); reader = new StringReader(query2); pstmt.setCharacterStream(1, reader, query2.length()); pstmt.addBatch(); pstmt.executeBatch(); con.commit(); 

Из верхней части моей головы вы можете попытаться использовать оператор «q» для строкового литерала

что-то вроде

 insert all into domo_queries values (q'[select substr(to_char(max_data),1,4) as year, substr(to_char(max_data),5,6) as month, max_data from dss_fin_user.acq_dashboard_src_load_success where source = 'CHQ PeopleSoft FS']') select * from dual; 

Обратите внимание, что одиночные кавычки вашего предиката не экранируются, а строка находится между q ‘[…]’.

Interesting Posts

Создание прокрутки мыши в неактивных окнах?

Сохранение данных и изменение ориентации

Есть ли способ выполнить установку Windows 7, если вы не можете запустить / загрузить Windows 7?

Разница двух массивов с использованием Perl

Как написать сценарий bash, который принимает необязательные входные аргументы?

«Запустить> Остановить на исключении Objective-C» в Xcode 4?

Локально объявленные переменные не могут быть проверены

Кэш вывода для пользователя

Как установить значения по умолчанию в ActiveRecord?

Попробуйте использовать Window.FEATURE_CUSTOM_TITLE, но получило исключение: вы не можете комбинировать собственные заголовки с другими функциями названия.

Есть ли законный способ получить Windows 7 DVD?

Linux: как спящий режим после периода сна

Что такое хороший компилятор-компилятор / синтаксический анализатор C #?

Остановить jQuery .load от кеширования

Как имитировать событие Touch в Android?

Давайте будем гением компьютера.