powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Delphi [игнор отключен] [закрыт для гостей] / ORA-64219: invalid LOB locator encountered
25 сообщений из 29, страница 1 из 2
ORA-64219: invalid LOB locator encountered
    #39782210
Леонов Юрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго дня!

Есть процедура записи содержимого файла в базу. Первоначально проект разрабатывался на DOA-шных компонентах и там все работает отлично. Но реалии заставили юзать ODAC и тут вылезла указанная ошибка.
Вот кусок кода, который делает запись:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
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-овском форуме . Но вариант
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
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
...
Рейтинг: 0 / 0
ORA-64219: invalid LOB locator encountered
    #39782216
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ты создаёшь LOB в DefSession, а вызываешь процедуру с ним в Session. Уверен, что они
совпадают?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
ORA-64219: invalid LOB locator encountered
    #39782338
Фотография devart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Леонов Юрий,

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

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
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;
/



Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
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.
...
Рейтинг: 0 / 0
ORA-64219: invalid LOB locator encountered
    #39782360
Леонов Юрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovТы создаёшь LOB в DefSession, а вызываешь процедуру с ним в Session. Уверен, что они
совпадают?

это одна и та же сессия, куски из разных модулей взяты
...
Рейтинг: 0 / 0
ORA-64219: invalid LOB locator encountered
    #39782363
Леонов Юрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
devart,

Процедуру в базе трогать нет смысла, она работала на других компонентах.
А читать файл произвольной длины в массив байтов не улыбается. Зачем вам тогда тип TOraLob?
...
Рейтинг: 0 / 0
ORA-64219: invalid LOB locator encountered
    #39782366
Леонов Юрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
devart
Код: pascal
1.
2.
3.
4.
5.
6.
        ...
        OSP.Prepare;
        ...
        OSP.ParamByName('A_BLOB').ParamType := ptInput;
        OSP.ParamByName('A_BLOB').DataType := ftOraBlob;
        ...


Разве Prepare не определяет автоматом тип данных и тип параметра?
...
Рейтинг: 0 / 0
ORA-64219: invalid LOB locator encountered
    #39782382
Фотография devart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Леонов Юрий,

Приведите DDL процедуры
...
Рейтинг: 0 / 0
ORA-64219: invalid LOB locator encountered
    #39782385
Леонов Юрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
devartЛеонов Юрий,

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

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
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;
...
Рейтинг: 0 / 0
ORA-64219: invalid LOB locator encountered
    #39782391
Фотография devart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Леонов Юрий,

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

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

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
...
      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;
...
...
Рейтинг: 0 / 0
ORA-64219: invalid LOB locator encountered
    #39782398
Леонов Юрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
devart
Код: pascal
1.
2.
3.
...
        OSP.ParamByName('A_BLOB').AsOraBlob.AsBytes := arr;
...


Обязательно такое приведение делать (AsOraBlob.AsBytes) или же можно передать TOraLob?
...
Рейтинг: 0 / 0
ORA-64219: invalid LOB locator encountered
    #39782402
Леонов Юрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделал так
Код: pascal
1.
StoredProc.ParamByName('P_BLOB').AsOraBlob.AsBytes := PBlob.AsBytes;


ошибка осталась как в заголовке поста
...
Рейтинг: 0 / 0
ORA-64219: invalid LOB locator encountered
    #39782437
Фотография devart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Леонов Юрий,

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

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


Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
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.
...
Рейтинг: 0 / 0
ORA-64219: invalid LOB locator encountered
    #39782614
Леонов Юрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
devartЛеонов Юрий,
Ошибка ORA-64219 указывает на некорректный Lob locator. При использовании одного и того же соединения ошибка не возникает.

То есть, Lob locator создается в одной сессии, а процедура вызывается в другой? Я правильно понял?
...
Рейтинг: 0 / 0
ORA-64219: invalid LOB locator encountered
    #39782622
Леонов Юрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
сделал так:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
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, но от ошибки я не избавляюсь

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


то ошибка другая - ORA-01400: cannot insert NULL into ("FGV0"."FGV_BLOB"."BLOB_FILE")
...
Рейтинг: 0 / 0
ORA-64219: invalid LOB locator encountered
    #39782625
Фотография devart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Леонов Юрий,

Приведенный консольный пример выдает ошибки?
...
Рейтинг: 0 / 0
ORA-64219: invalid LOB locator encountered
    #39782645
Леонов Юрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
devart,

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


Тут вот что интересно. У меня DefSession - это общая сессия для всех моих форм, пользовательский объект.
И у вас есть точно такой же объект (модуль Ora.pas). Видно они как-то конфликтуют между собой.
...
Рейтинг: 0 / 0
ORA-64219: invalid LOB locator encountered
    #39782649
Фотография devart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Леонов Юрий,

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

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.
...
Рейтинг: 0 / 0
ORA-64219: invalid LOB locator encountered
    #39782863
Леонов Юрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
devart,

Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
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-й, в идеале не должно стоять ни одного.
...
Рейтинг: 0 / 0
ORA-64219: invalid LOB locator encountered
    #39782877
Фотография devart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Леонов Юрий,

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

P.S. Если у Вас версия ODAC ниже, пожалуйста обновите наши компоненты до последней версии
...
Рейтинг: 0 / 0
ORA-64219: invalid LOB locator encountered
    #39782892
Леонов Юрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
devart,

да, версия 10.1.5
...
Рейтинг: 0 / 0
ORA-64219: invalid LOB locator encountered
    #39782898
Фотография devart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Леонов Юрий,

обновите до последней версии и проверьте это поведение
...
Рейтинг: 0 / 0
ORA-64219: invalid LOB locator encountered
    #39782926
Леонов Юрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
devartЛеонов Юрий,

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

Последняя это уже 10.3.9 насколько я понял?
...
Рейтинг: 0 / 0
ORA-64219: invalid LOB locator encountered
    #39782933
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
devartпохожая ситуация при работе с LOB полями в Oracle 12 и 18

И в чём там была проблема? Что-то изменилось в LOB-функциях в этих версиях Оракула?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
ORA-64219: invalid LOB locator encountered
    #39782978
Фотография devart
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Леонов ЮрийdevartЛеонов Юрий,
обновите до последней версии и проверьте это поведение
Последняя это уже 10.3.9 насколько я понял?
да, верно
Dimitry Sibiryakovdevartпохожая ситуация при работе с LOB полями в Oracle 12 и 18

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

в функциях ничего не изменилось, а вот формат пакетов в протоколе немного поменялся.
...
Рейтинг: 0 / 0
ORA-64219: invalid LOB locator encountered
    #39783152
Леонов Юрий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
devart,

установил новую версию, ошибка осталась
...
Рейтинг: 0 / 0
25 сообщений из 29, страница 1 из 2
Форумы / Delphi [игнор отключен] [закрыт для гостей] / ORA-64219: invalid LOB locator encountered
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]