Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 ORA-01013: user requested cancel of current operation  [new]
aidynchik
Member

Откуда:
Сообщений: 447
Всем доброго дня! Имеется приложение Delphi 7, компоненты DOA и Oracle 11g.
Стоит задача передать файл CLOB в базу, там его распарсить и закинуть в таблицу.
Парсингом занимается хранимая процедура.
Кинул компонент TOracleQuery(spLoad), TOracleEvent(evNext) и TcxProgressBar(pBar).
У spLoad включил свойство Threaded = True. Передаю в spLoad CLOB и делаю
       spLoad.Execute;  
       while spLoad.ThreadIsRunning do begin
         Application.ProcessMessages;
         Sleep(10)
       end;


а на событие evNext наращиваю TcxProgressBar.
Так вот, если записей мало (3к-10к), то все работает отлично. Если записей свыше 100 тысяч, то во время обработки выходит ошибка:
"ORA-01013, user requested cancel of current operation". Почему?

В документашке DOA написано "Any executing query can be aborted by calling the TOracleSession.BreakExecution method.
This causes an "ORA-01013, user requested cancel of current operation"
exception for the currently executing query in that session."
Но я же этого не делаю... Куда копать?
28 сен 17, 13:17    [20828904]     Ответить | Цитировать Сообщить модератору
 Re: ORA-01013: user requested cancel of current operation  [new]
DarkMaster
Member

Откуда: Donetsk,Ukraine
Сообщений: 5630
aidynchik,

А срабатывание какого-нить таймаута такой эффект может вызвать? С Ораклом последний раз сражался лет 5 назад, но почему-то именно это в голову пришло..
28 сен 17, 16:14    [20829474]     Ответить | Цитировать Сообщить модератору
 Re: ORA-01013: user requested cancel of current operation  [new]
mbb
Member

Откуда:
Сообщений: 15
aidynchik, чисто для "разведки" делал так:

procedure TForm1.Button1Click(Sender: TObject);
//insert into my_xml values(3, :PFX,  XMLType(:XML, nls_charset_id('CL8MSWIN1251')))
// Структура my_xml
//|Поле      |Тип       |Длина  |Точность  |Null        |Default  |Комментарии  
//|SID       |NUMBER    |22     |          |Not null !  |         |             
//|FILE_XML  |VARCHAR2  |15     |          |Y           |         |             
//|XT        |XMLTYPE   |2000   |          |Y           |         |             

var LOB: TLOBLocator;
  Buffer: array[0..4095] of char;
  f: file;
  numRead: Integer;
begin
  if not OpenDialog.Execute then Exit;
  if not os.Connected then os.Connected := True;

  with oq do
  begin

    LOB := TLOBLocator.CreateTemporary(os, otBLOB, True);
    AssignFile(f, OpenDialog.FileName);
    Reset(f, 1);
    repeat
      BlockRead(f, Buffer, SizeOf(Buffer), numRead);
      LOB.Write(Buffer, numRead);
    until (NumRead = 0) or (SizeOf(Buffer) <> NumRead);
    CloseFile(f);

    SetComplexVariable('XML', LOB);
    SetVariable('PFX', ExtractFileName(OpenDialog.FileName));
    Execute;
    LOB.Free;

  end;

  os.Connected := False;

end;


С файлами большого объёма - они целиком не влезают в переменную, отсылаемую на сервер. Но у меня "ругался" Oracle на невалидность XML - он же был обрезан, но связь вроде не рвалась. В отдельной нити не пробовал.
Этой процедурой загружал довольно большие xml-файлы, выбирал из них данные. Небольшие файлики грузились беспроблемно и без всяких буферов и LobLocator.
28 сен 17, 16:44    [20829600]     Ответить | Цитировать Сообщить модератору
 Re: ORA-01013: user requested cancel of current operation  [new]
aidynchik
Member

Откуда:
Сообщений: 447
DarkMaster,

да в том-то и дело, что никаких таймаутов вроде бы нет... Если выключить Threaded = True, то все грузится без проблем
29 сен 17, 06:12    [20830654]     Ответить | Цитировать Сообщить модератору
 Re: ORA-01013: user requested cancel of current operation  [new]
aidynchik
Member

Откуда:
Сообщений: 447
Проблема решена - нужно было просто новую сессию создать, а не цепляться к уже существующей
29 сен 17, 08:13    [20830730]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить