Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 ORA-64219: invalid LOB locator encountered  [new]
Леонов Юрий
Member

Откуда: Украина, Харьков
Сообщений: 498
Доброго дня!

Есть процедура записи содержимого файла в базу. Первоначально проект разрабатывался на DOA-шных компонентах и там все работает отлично. Но реалии заставили юзать ODAC и тут вылезла указанная ошибка.
Вот кусок кода, который делает запись:
procedure LoadFilePO;
var
  LLob: TOraLob;
begin
  ...
      try
        LLob := TOraLob.Create(DefSession.OCISvcCtx);
        LLob.CreateTemporary(ltBlob);
        LLob.LoadFromFile(FFilePathList[I]);
        try
          FPkMop.InsertBlob_1164(lbFiles.Items[I], LFileKey, LLob);
          DefSession.Commit;
          ...
        except
          on E: Exception do
          begin
            DefSession.Rollback;
            ...
            Continue;
          end;
        end;
      finally
        FreeAndNil(LLob);
      end;
end;

...
procedure TPkMop.GetStoreProc;
begin
  // попытаться найти способ очистки компонентя
  StoredProc.Session := Session;
  StoredProc.StoredProcName := '';
  StoredProc.Prepared;
end;

procedure TPkMop.InsertBlob_1164(const PFileName: string; const PFKey: Double;
  const PBlob: TOraLob);
begin
  GetStoreProc;
  StoredProc.StoredProcName := 'FGV0.MOP.INSERT_BLOB_1164';
  StoredProc.Prepare;
  StoredProc.ParamByName('P_FULLNAME').AsString := PFileName;
  StoredProc.ParamByName('P_FKEY').AsFloat := PFKey;
  StoredProc.ParamByName('P_BLOB').AsOraBlob := PBlob;
  StoredProc.Execute;
end;

Поискал решение в инете, нашел что-то похожее на Devart-овском форуме . Но вариант
procedure TPkMop.InsertBlob_1164(const PFileName: string; const PFKey: Double;
  const PBlob: TOraLob);
begin
  GetStoreProc;
  StoredProc.StoredProcName := 'FGV0.MOP.INSERT_BLOB_1164';
  StoredProc.Prepare;
  StoredProc.ParamByName('P_FULLNAME').AsString := PFileName;
  StoredProc.ParamByName('P_FKEY').AsFloat := PFKey;
  StoredProc.ParamByName('P_BLOB').AsOraBlob.AsBytes := PBlob.AsBytes;
  StoredProc.Execute;
end;

выдает ошибку "ORA-01400: cannot insert NULL into ("FGV0"."FGV_BLOB"."BLOB_FILE")"

Использую прямой доступ к базе, версия 12
4 мар 19, 19:03    [21824768]     Ответить | Цитировать Сообщить модератору
 Re: ORA-64219: invalid LOB locator encountered  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 47384

Ты создаёшь LOB в DefSession, а вызываешь процедуру с ним в Session. Уверен, что они
совпадают?

Posted via ActualForum NNTP Server 1.5

4 мар 19, 19:23    [21824779]     Ответить | Цитировать Сообщить модератору
 Re: ORA-64219: invalid LOB locator encountered  [new]
devart
Member

Откуда: www.devart.com
Сообщений: 1132
Леонов Юрий,

ниже приведен пример работы с BOLB полями в процедуре

CREATE TABLE SCOTT.T_BLOB(
  F_ID   NUMBER,
  F_BLOB BLOB NOT NULL,
  CONSTRAINT PK_T_BLOB PRIMARY KEY (F_ID));
/
CREATE OR REPLACE PROCEDURE SP_INSERT_BLOB(A_ID IN NUMBER, A_BLOB OUT BLOB)
  IS
  BEGIN
    INSERT INTO T_BLOB VALUES(A_ID, EMPTY_BLOB())
                RETURNING F_BLOB INTO A_BLOB;
  END;
/


program Project201;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  SysUtils, Windows, DB, Ora, OraError;

var
  OS: TOraSession;
  OSP: TOraStoredProc;
  Arr: TBytes;
  i: integer;
begin
  try
    OS := TOraSession.Create(nil);
    try
      OS.ConnectString := 'server=localhost;sid=orcl;direct=true;user=****;password=*****';
      OS.Connect;
      OSP := TOraStoredProc.Create(nil);
      try
        OSP.Connection := OS;
        OSP.StoredProcName := 'SP_INSERT_BLOB';
        OSP.Prepare;
        OSP.ParamByName('A_ID').AsInteger := GetTickCount;
        SetLength(arr, 10);
        for i := 0 to 9 do
          Arr[i] := i;
        OSP.ParamByName('A_BLOB').ParamType := ptInput;
        OSP.ParamByName('A_BLOB').DataType := ftOraBlob;
        OSP.ParamByName('A_BLOB').AsOraBlob.AsBytes := Arr;
        try
          OSP.Execute;
          Writeln('OK');
        except
          on E: EOraError do
            Writeln(IntToStr(E.ErrorCode) + ': ' + E.Message);
        end;
      finally
        OSP.Free;
      end;
    finally
      OS.Free;
    end;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  Readln;
end.
5 мар 19, 09:12    [21825043]     Ответить | Цитировать Сообщить модератору
 Re: ORA-64219: invalid LOB locator encountered  [new]
Леонов Юрий
Member

Откуда: Украина, Харьков
Сообщений: 498
Dimitry Sibiryakov
Ты создаёшь LOB в DefSession, а вызываешь процедуру с ним в Session. Уверен, что они
совпадают?

это одна и та же сессия, куски из разных модулей взяты
5 мар 19, 10:02    [21825092]     Ответить | Цитировать Сообщить модератору
 Re: ORA-64219: invalid LOB locator encountered  [new]
Леонов Юрий
Member

Откуда: Украина, Харьков
Сообщений: 498
devart,

Процедуру в базе трогать нет смысла, она работала на других компонентах.
А читать файл произвольной длины в массив байтов не улыбается. Зачем вам тогда тип TOraLob?
5 мар 19, 10:09    [21825101]     Ответить | Цитировать Сообщить модератору
 Re: ORA-64219: invalid LOB locator encountered  [new]
Леонов Юрий
Member

Откуда: Украина, Харьков
Сообщений: 498
devart
        ...
        OSP.Prepare;
        ...
        OSP.ParamByName('A_BLOB').ParamType := ptInput;
        OSP.ParamByName('A_BLOB').DataType := ftOraBlob;
        ...

Разве Prepare не определяет автоматом тип данных и тип параметра?
5 мар 19, 10:12    [21825107]     Ответить | Цитировать Сообщить модератору
 Re: ORA-64219: invalid LOB locator encountered  [new]
devart
Member

Откуда: www.devart.com
Сообщений: 1132
Леонов Юрий,

Приведите DDL процедуры
5 мар 19, 10:45    [21825141]     Ответить | Цитировать Сообщить модератору
 Re: ORA-64219: invalid LOB locator encountered  [new]
Леонов Юрий
Member

Откуда: Украина, Харьков
Сообщений: 498
devart
Леонов Юрий,

Приведите DDL процедуры


procedure insert_blob(
  p_fullname varchar2,   -- ім'я файлу (можливо із повним іменем директорії)
  p_fkey     number,     -- ключ файлу
  p_blob     blob
) is
  l_blobid number;
begin
  SELECT f.blob_ref INTO l_blobid FROM fgv_file f where f.fkey = p_fkey;
  INSERT INTO fgv_blob( blob_id, blob_file, full_name, inp_time )
  VALUES( l_blobid, p_blob, p_fullname, sysdate );
end insert_blob;
5 мар 19, 11:00    [21825149]     Ответить | Цитировать Сообщить модератору
 Re: ORA-64219: invalid LOB locator encountered  [new]
devart
Member

Откуда: www.devart.com
Сообщений: 1132
Леонов Юрий,

Если в процедуре не используется EMPTY_BLOB, то Вам необходимо включить опцию TemporaryLobUpdate,

P.S. массив байт взят для примера

...
      OSP := TOraStoredProc.Create(nil);
      try
        OSP.Connection := OS;
        OSP.StoredProcName := 'SP_INSERT_BLOB';
        OSP.Prepare;
        OSP.Options.TemporaryLobUpdate := true;
        OSP.ParamByName('A_ID').AsInteger := GetTickCount;
        SetLength(arr, 10);
        for i := 0 to 9 do
          Arr[i] := i;
        OSP.ParamByName('A_BLOB').AsOraBlob.AsBytes := arr;
        try
          OSP.Execute;
        except
          on E: EOraError do
            Writeln(IntToStr(E.ErrorCode) + ': ' + E.Message);
        end;
      finally
        OSP.Free;
      end;
...
5 мар 19, 11:09    [21825159]     Ответить | Цитировать Сообщить модератору
 Re: ORA-64219: invalid LOB locator encountered  [new]
Леонов Юрий
Member

Откуда: Украина, Харьков
Сообщений: 498
devart
...
        OSP.ParamByName('A_BLOB').AsOraBlob.AsBytes := arr;
...

Обязательно такое приведение делать (AsOraBlob.AsBytes) или же можно передать TOraLob?
5 мар 19, 11:22    [21825171]     Ответить | Цитировать Сообщить модератору
 Re: ORA-64219: invalid LOB locator encountered  [new]
Леонов Юрий
Member

Откуда: Украина, Харьков
Сообщений: 498
Сделал так
StoredProc.ParamByName('P_BLOB').AsOraBlob.AsBytes := PBlob.AsBytes;

ошибка осталась как в заголовке поста
5 мар 19, 11:29    [21825175]     Ответить | Цитировать Сообщить модератору
 Re: ORA-64219: invalid LOB locator encountered  [new]
devart
Member

Откуда: www.devart.com
Сообщений: 1132
Леонов Юрий,

Приведение AsBytes необязательно, Вы можете передавать TOraLob, использовать StoredProc.ParamByName('A_BLOB').AsOraBlob.LoadFromFile и т.д.

Ошибка ORA-64219 указывает на некорректный Lob locator. При использовании одного и того же соединения ошибка не возникает.


program Project201;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  SysUtils, Windows, DB, Ora, OraError, OraClasses;

var
  Session: TOraSession;
  StoredProc: TOraStoredProc;

procedure GetStoreProc;
begin
  StoredProc.Session := Session;
  StoredProc.StoredProcName := '';
  StoredProc.Prepared;
end;

procedure InsertBlob_1164(PBlob: TOraLob);
begin
  GetStoreProc;
  StoredProc.StoredProcName := 'SP_INSERT_BLOB';
  StoredProc.Prepare;
  StoredProc.ParamByName('A_ID').AsInteger := GetTickCount;
  StoredProc.ParamByName('A_BLOB').AsOraBlob.LoadFromFile := PBlob;
  StoredProc.Execute;
end;

procedure LoadFilePO;
var
  LLob: TOraLob;
begin
  try
    LLob := TOraLob.Create(Session.OCISvcCtx);
    LLob.CreateTemporary(ltBlob);
    LLob.LoadFromFile(FileName);
    try
      InsertBlob_1164(LLob);
      DefSession.Commit;
    except
      on E: Exception do begin
        DefSession.Rollback;
      end;
    end;
  finally
    FreeAndNil(LLob);
  end;
end;


begin
  try
    Session := TOraSession.Create(nil);
    try
      Session.ConnectString := 'server=oracle12c.local;sid=orclpdb.local;direct=true;user=****;password=****';
      Session.Connect;
      StoredProc := TOraStoredProc.Create(nil);
      LoadFilePO;
    finally
      Session.Free;
    end;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  readln;
end.
5 мар 19, 12:36    [21825251]     Ответить | Цитировать Сообщить модератору
 Re: ORA-64219: invalid LOB locator encountered  [new]
Леонов Юрий
Member

Откуда: Украина, Харьков
Сообщений: 498
devart
Леонов Юрий,
Ошибка ORA-64219 указывает на некорректный Lob locator. При использовании одного и того же соединения ошибка не возникает.

То есть, Lob locator создается в одной сессии, а процедура вызывается в другой? Я правильно понял?
5 мар 19, 16:50    [21825585]     Ответить | Цитировать Сообщить модератору
 Re: ORA-64219: invalid LOB locator encountered  [new]
Леонов Юрий
Member

Откуда: Украина, Харьков
Сообщений: 498
сделал так:
procedure TPkMop.InsertBlob_1164(const PFileName: string; const PFKey: Double;
  const PFileBlob: string);
begin
  GetStoreProc;
  StoredProc.StoredProcName := 'FGV0.MOP.INSERT_BLOB_1164';
  StoredProc.Prepare;
  StoredProc.Options.TemporaryLobUpdate := True;
  StoredProc.ParamByName('P_FULLNAME').AsString := PFileName;
  StoredProc.ParamByName('P_FKEY').AsFloat := PFKey;
  StoredProc.ParamByName('P_BLOB').AsOraBlob.LoadFromFile(PFileBlob); //тут передаю имя файла
  StoredProc.Execute;
  StoredProc.Options.TemporaryLobUpdate := False;
end;


Ошибка та же.
То есть я уже не использую TOraLob, но от ошибки я не избавляюсь

Если же убираю из кода
StoredProc.Options.TemporaryLobUpdate := True;

то ошибка другая - ORA-01400: cannot insert NULL into ("FGV0"."FGV_BLOB"."BLOB_FILE")
5 мар 19, 17:05    [21825599]     Ответить | Цитировать Сообщить модератору
 Re: ORA-64219: invalid LOB locator encountered  [new]
devart
Member

Откуда: www.devart.com
Сообщений: 1132
Леонов Юрий,

Приведенный консольный пример выдает ошибки?
5 мар 19, 17:12    [21825605]     Ответить | Цитировать Сообщить модератору
 Re: ORA-64219: invalid LOB locator encountered  [new]
Леонов Юрий
Member

Откуда: Украина, Харьков
Сообщений: 498
devart,

Да, не знает кто такой FileName и бьет ошибку при компиляции на строке
StoredProc.ParamByName('A_BLOB').AsOraBlob.LoadFromFile := PBlob;
Project1.dpr(27): E2035 Not enough actual parameters

Тут вот что интересно. У меня DefSession - это общая сессия для всех моих форм, пользовательский объект.
И у вас есть точно такой же объект (модуль Ora.pas). Видно они как-то конфликтуют между собой.
5 мар 19, 17:44    [21825642]     Ответить | Цитировать Сообщить модератору
 Re: ORA-64219: invalid LOB locator encountered  [new]
devart
Member

Откуда: www.devart.com
Сообщений: 1132
Леонов Юрий,

укажите имя любого существующего файла

program Project201;

{$APPTYPE CONSOLE}

{$R *.res}

uses
SysUtils, Windows, DB, Ora, OraError, OraClasses;

var
Session: TOraSession;
StoredProc: TOraStoredProc;

procedure GetStoreProc;
begin
StoredProc.Session := Session;
StoredProc.StoredProcName := '';
StoredProc.Prepared;
end;

procedure InsertBlob_1164(PBlob: TOraLob);
begin
GetStoreProc;
StoredProc.StoredProcName := 'SP_INSERT_BLOB';
StoredProc.Prepare;
StoredProc.ParamByName('A_ID').AsInteger := GetTickCount;
StoredProc.ParamByName('A_BLOB').AsOraBlob := PBlob;
StoredProc.Execute;
end;

procedure LoadFilePO;
var
LLob: TOraLob;
begin
try
LLob := TOraLob.Create(Session.OCISvcCtx);
LLob.CreateTemporary(ltBlob);
LLob.LoadFromFile({УКАЗАТЬ ЛЮБОЕ ИМЯ ФАЙЛА С ПОЛНЫМ ПУТЕМ});
try
InsertBlob_1164(LLob);
DefSession.Commit;
except
on E: Exception do begin
DefSession.Rollback;
end;
end;
finally
FreeAndNil(LLob);
end;
end;


begin
try
Session := TOraSession.Create(nil);
try
Session.ConnectString := 'server=oracle12c.local;sid=orclpdb.local;direct=true;user=****;password=****';
Session.Connect;
StoredProc := TOraStoredProc.Create(nil);
LoadFilePO;
finally
Session.Free;
end;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
readln;
end.
5 мар 19, 17:48    [21825647]     Ответить | Цитировать Сообщить модератору
 Re: ORA-64219: invalid LOB locator encountered  [new]
Леонов Юрий
Member

Откуда: Украина, Харьков
Сообщений: 498
devart,

program Project1;

{$APPTYPE CONSOLE}

{$R *.res}

uses
  SysUtils, Windows, DB, Ora, OraError, OraClasses;

var
  Session: TOraSession;
  StoredProc: TOraStoredProc;

procedure GetStoreProc;
begin
  StoredProc.Session := Session;
  StoredProc.StoredProcName := '';
  StoredProc.Prepared;
end;

procedure CreateFile_1164(const PFileName: string; var PFKey: Double);
begin
  GetStoreProc;
  StoredProc.StoredProcName := 'CREATE_FILE_1164';
  StoredProc.Prepare;
  StoredProc.ParamByName('P_FULLNAME').AsString := PFileName;
  StoredProc.ParamByName('P_FKEY').AsFloat := PFKey;
  StoredProc.Execute;
  PFKey := StoredProc.ParamByName('P_FKEY').Value;
end;

procedure InsertBlob_1164(PFKey: Double; PBlob: TOraLob);
begin
  GetStoreProc;
  StoredProc.StoredProcName := 'INSERT_BLOB_1164';
  StoredProc.Prepare;
  StoredProc.ParamByName('P_FULLNAME').AsString := 'PO.csv';
  StoredProc.ParamByName('P_FKEY').AsFloat := PFKey;
  StoredProc.ParamByName('P_BLOB').AsOraBlob := PBlob;
  StoredProc.Execute;
end;

procedure LoadFilePO;
var
  LLob: TOraLob;
  LFileKey: Double;
begin
  try
    CreateFile_1164('PO.csv', LFileKey);
    Session.Commit;
    LLob := TOraLob.Create(Session.OCISvcCtx);
    LLob.CreateTemporary(ltBlob);
    LLob.LoadFromFile('c:\Program Files (x86)\Argus\MOP\Imports\PO.csv');
    try
      InsertBlob_1164(LFileKey, LLob);
      Session.Commit;
    except
      on E: Exception do begin
        Session.Rollback;
      end;
    end;
  finally
    FreeAndNil(LLob);
  end;
end;

begin
  try
    Session := TOraSession.Create(nil);
    try
      Session.ConnectString := 'Direct=True;Host=***.***.***.***;SID=******;User ID=******;Password=******';
      Session.Connect;
      StoredProc := TOraStoredProc.Create(nil);
      LoadFilePO;
    finally
      Session.Free;
    end;
  except
    on E: Exception do
      Writeln(E.ClassName, ': ', E.Message);
  end;
  readln;
end.


Выполняю с подключением к базе 11g - все нормально. Выполняю подключение к 12с - ошибка. Клиент стоит на машине только 11-й, в идеале не должно стоять ни одного.
6 мар 19, 12:03    [21826088]     Ответить | Цитировать Сообщить модератору
 Re: ORA-64219: invalid LOB locator encountered  [new]
devart
Member

Откуда: www.devart.com
Сообщений: 1132
Леонов Юрий,

уточните версию ODAC, похожая ситуация при работе с LOB полями в Oracle 12 и 18 была исправлена в версии ODAC 10.2.7.

P.S. Если у Вас версия ODAC ниже, пожалуйста обновите наши компоненты до последней версии
6 мар 19, 12:15    [21826103]     Ответить | Цитировать Сообщить модератору
 Re: ORA-64219: invalid LOB locator encountered  [new]
Леонов Юрий
Member

Откуда: Украина, Харьков
Сообщений: 498
devart,

да, версия 10.1.5
6 мар 19, 12:33    [21826125]     Ответить | Цитировать Сообщить модератору
 Re: ORA-64219: invalid LOB locator encountered  [new]
devart
Member

Откуда: www.devart.com
Сообщений: 1132
Леонов Юрий,

обновите до последней версии и проверьте это поведение
6 мар 19, 12:35    [21826131]     Ответить | Цитировать Сообщить модератору
 Re: ORA-64219: invalid LOB locator encountered  [new]
Леонов Юрий
Member

Откуда: Украина, Харьков
Сообщений: 498
devart
Леонов Юрий,

обновите до последней версии и проверьте это поведение


Последняя это уже 10.3.9 насколько я понял?
6 мар 19, 13:00    [21826169]     Ответить | Цитировать Сообщить модератору
 Re: ORA-64219: invalid LOB locator encountered  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 47384

devart
похожая ситуация при работе с LOB полями в Oracle 12 и 18

И в чём там была проблема? Что-то изменилось в LOB-функциях в этих версиях Оракула?

Posted via ActualForum NNTP Server 1.5

6 мар 19, 13:06    [21826179]     Ответить | Цитировать Сообщить модератору
 Re: ORA-64219: invalid LOB locator encountered  [new]
devart
Member

Откуда: www.devart.com
Сообщений: 1132
Леонов Юрий
devart
Леонов Юрий,
обновите до последней версии и проверьте это поведение

Последняя это уже 10.3.9 насколько я понял?

да, верно
Dimitry Sibiryakov
devart
похожая ситуация при работе с LOB полями в Oracle 12 и 18

И в чём там была проблема? Что-то изменилось в LOB-функциях в этих версиях Оракула?

в функциях ничего не изменилось, а вот формат пакетов в протоколе немного поменялся.
6 мар 19, 13:53    [21826271]     Ответить | Цитировать Сообщить модератору
 Re: ORA-64219: invalid LOB locator encountered  [new]
Леонов Юрий
Member

Откуда: Украина, Харьков
Сообщений: 498
devart,

установил новую версию, ошибка осталась
6 мар 19, 17:43    [21826613]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Delphi Ответить