DOA и курсор

avershilo
Дата: 21.11.2007 10:05:19
Использую компонент TOracleQuery. Нужно передать в Oracle курсор. Подскажите как это сделать.

aQuery := TOracleQuery.Create(Nil);
  Try
    aQuery.Session := aSession;
    aQuery.ReadBuffer := 1;
    aQuery.DeclareVariable('B', otCursor);
    aQuery.SetComplexVariable('B', Self);
    aQuery.SQL.Add('Begin Arg_Order_Utl.testStartCrs (:B); End;');
    aQuery.Execute;
В качестве Self - тоже TOracleQuery.
При такой реализации вылетает ошибка на Oracle

Ошибка:
   ORA-01001: invalid cursor
avershilo
Дата: 21.11.2007 10:18:34
Полная реализация
constructor TOrder.Create(aOwner: TObject; aSession: TOracleSession; aType: String);
Var
  aQuery: TOracleQuery;
begin
  Inherited Create(Nil);
  FOwner := aOwner;
  Session := aSession;

  // Èíèöèàëèçèðóåì ïåðâîíà÷àëüíûé íàáîð
  aQuery := TOracleQuery.Create(Nil);
  Try
    aQuery.Session := aSession;
    aQuery.ReadBuffer := 1;
    aQuery.DeclareVariable('Cur', otCursor);
    aQuery.SetComplexVariable('Cur', Self);
    aQuery.SQL.Add('Begin :Cur := Arg_Order_Utl.testStartCrs; End;');
    aQuery.Execute;
  Finally
    FreeAndNil(aQuery);
  End;
  Self.Execute;

  aQuery := TOracleQuery.Create(Nil);
  Try
    aQuery.Session := aSession;
    aQuery.ReadBuffer := 1;
    aQuery.DeclareVariable('B', otCursor);
    aQuery.SetComplexVariable('B', Self);
    aQuery.SQL.Add('Begin Arg_Order_Utl.testCrs (:B); End;');
    aQuery.Execute;
  Finally
    FreeAndNil(aQuery);
  End;
......
Альт
Дата: 21.11.2007 10:18:54
Ну и правильно вылетает... на курсор нужно заводить отдельный квери...
зы: а проще работать с датасетом... просто объявил переменную типа курсор и открывай датасет спокойно
avershilo
Дата: 21.11.2007 10:59:17
У меня этот набор будет туда-сюда летать... Уходит на оракл с одними значениями, а возвращается с другими....
OracleX
Дата: 21.11.2007 12:32:13
Self.Execute;

нужно делать до

aQuery.SetComplexVariable('Cur', Self);
OracleX
Дата: 21.11.2007 13:26:16
Пардон, предыдуший пост - лажа.

Довольно навороченный у Вас код, без отладчика тяжело точно сказать.
Self.Execute выполняется нормально? Сколько записей возвращает?

Объявление Arg_Order_Utl.testCrs покажите.

В ODAC подобное работает, где-то Вы близки к правильному результату.
marky4
Дата: 29.11.2007 14:32:59
Добрый день!
У меня вопрос на эту тему. Реализую такой же метод (с двумя Query). При запуске первого -виснет форма. Query.Threated не помогает.. выдает ошибку - 'ORA-24338: идентификатор команды не выполнен'. Как избавится от зависаний формы??
OracleX
Дата: 29.11.2007 15:24:50
Упростите Ваш код до тестового примера,
затем на этом примере поясните, где выдается ошибка.
marky4
Дата: 29.11.2007 15:48:15
OracleX
Упростите Ваш код до тестового примера,
затем на этом примере поясните, где выдается ошибка.


о, спасибо! стал упрощать код -нашел в чем было дело :))