crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Тема закрытаНачать новую тему
> символ ";" вызывает ошибку в запросе, хочу выполнить запрос со вставкой/удалением нескольких строк
FantasyOr
  опции профиля:
сообщение 12.5.2011, 16:38
Сообщение #1


Студент
*

Группа: Участник
Сообщений: 75
Регистрация: 13.8.2010
Пользователь №: 1956

Спасибо сказали: 4 раз(а)




Репутация:   0  


Здравствуйте.
Работаю с oracle, моделью непользуюсь, использую QSqlQuery.

есть желание в одном запросе добавлять/удалять несколько строк

"insert into ADDRESSEES(ADR_ID, FULL_NAME, PRIORITY_CHANNEL, PRIORITY_FORMAT) values( 10, 'ZOI4', 2, 0);
insert into ADDRESSEES(ADR_ID, FULL_NAME, PRIORITY_CHANNEL, PRIORITY_FORMAT) values( 11, 'ZORG', 1, 1);
insert into ADDRESSEES(ADR_ID, FULL_NAME, PRIORITY_CHANNEL, PRIORITY_FORMAT) values( 12, 'MOPS', 1, 0);"

дабы не беспокоить сервер по пустякам много раз.

Этот запрос не выполняется, пишется ошибка "ORA-00911: invalid character Unable to execute statment"
проблема точно в ";", ибо когда оставляю 1 insert, без ";" - запрос выполняется, когда дописываю ";" - появляется эта ошибка.

Может кто боролся с этой ошибкой? подскажите пожалуйста.

//-----------------------------------
bind'ы не предлагать, их все равно приходится по одной записи exec'лить (простите меня за мой французский)

есть:
bool QSqlQuery::execBatch ( BatchExecutionMode mode = ValuesAsRows )
но он как-то странно (нелогично с моей точки зрения) работает.

Пример из документации:
 QSqlQuery q;
q.prepare("insert into myTable values (?, ?)");

QVariantList ints;
ints << 1 << 2 << 3 << 4;
q.addBindValue(ints);

QVariantList names;
names << "Harald" << "Boris" << "Trond" << QVariant(QVariant::String);
q.addBindValue(names);

if (!q.execBatch())
qDebug() << q.lastError();


The example above inserts four new rows into myTable:
1 Harald
2 Boris
3 Trond
4 NULL


т.о. нужно находить данные поколонково, что странно(нелогично с моей точки зрения).
у execBatch есть параметр:
//--------
QSqlQuery::ValuesAsRows - Updates multiple rows. Treats every entry in a QVariantList as a value for updating the next row.
QSqlQuery::ValuesAsColumns - Updates a single row. Treats every entry in a QVariantList as a single value of an array type.
//--------

и все бы хорошо, но напрягает вот что: ValuesAsColumns - Updates a single row...

и как быть...

подскажите пожалуйста.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
RazrFalcon
  опции профиля:
сообщение 12.5.2011, 18:04
Сообщение #2


Zombie Mod
*****

Группа: Участник
Сообщений: 1654
Регистрация: 24.5.2010
Из: Харьков
Пользователь №: 1752

Спасибо сказали: 64 раз(а)




Репутация:   212  


http://www.forum.crossplatform.ru/index.php?showtopic=6832

оно?
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
MoPDoBoPoT
  опции профиля:
сообщение 12.5.2011, 21:29
Сообщение #3


Участник
**

Группа: Участник
Сообщений: 172
Регистрация: 7.5.2009
Из: Москва
Пользователь №: 738

Спасибо сказали: 44 раз(а)




Репутация:   9  


Цитата(RazrFalcon @ 12.5.2011, 19:04) *
проблема точно в ";", ибо когда оставляю 1 insert, без ";" - запрос выполняется, когда дописываю ";" - появляется эта ошибка.

Да, есть такая особенность в Oracle. Не помню точно с чем это связано, по-моему это как раз защита от SQL-инъекций (чтобы нельзя было за один раз выполнять больше одного оператора).
Если не устраивает решение с QSqlQuery::execBatch(), то можно это сделать с помощью неименованного блока PL/SQL:
q.prepare("begin "
          " insert into ADDRESSEES(ADR_ID, FULL_NAME, PRIORITY_CHANNEL, PRIORITY_FORMAT) values( 10, 'ZOI4', 2, 0); "
          " insert into ADDRESSEES(ADR_ID, FULL_NAME, PRIORITY_CHANNEL, PRIORITY_FORMAT) values( 11, 'ZORG', 1, 1); "
          " insert into ADDRESSEES(ADR_ID, FULL_NAME, PRIORITY_CHANNEL, PRIORITY_FORMAT) values( 12, 'MOPS', 1, 0); "
          "end;");
q.exec();

Но, на самом деле, лучше пользоваться биндингом.

Сообщение отредактировал MoPDoBoPoT - 12.5.2011, 21:31
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
FantasyOr
  опции профиля:
сообщение 17.5.2011, 13:54
Сообщение #4


Студент
*

Группа: Участник
Сообщений: 75
Регистрация: 13.8.2010
Пользователь №: 1956

Спасибо сказали: 4 раз(а)




Репутация:   0  


помогло
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Тема закрытаНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 28.11.2024, 20:15