Форум: "Базы";
Текущий архив: 2003.12.16;
Скачать: [xml.tar.bz2];
ВнизКак передать в процедуру CLOB параметр для ODAC 4.10 Найти похожие ветки
← →
SVha (2003-11-21 13:08) [0]Уважаемые господа, товарищи, коллеги :)), подскажите пожалуйста.
Нужно передать CLOB параметр в процедуру или функцию Oracle 9i.
Доступ к БД через ODAC 4.10 – Delphi 7.
Использую TOraStoredProc. – необходимо передать в качестве параметра длинную строку, больше чем varchar2.
Пробовал передавать через поток:
var
s: string
strm : TMemoryStream;
begin
s := ‘1,2,3’;
Try
strm:= TMemoryStream.Create;
strm.Write(pchar(s)^, Length(s));
OraStoredProc.ParamByName("param").AsCLOBLocator.LoadFromStream(strm);
OraStoredProc.Execute;
Finally
strm.Free;
End;
End;
И напрямую:
OraStoredProc.ParamByName("parm").Value:= "1,2,3";
OraStoredProc.Execute;
Результат один и тотже :
«ORA – 22275 Неверно задан указатель на LOB.»Временно проблему удалось обойти, закидываю CLOB в таблицу, а потом вызываю процедуру, но уже без параметра. Но это не красиво.
Если кто знает как закинуть в процедурку большой объект напишите пожалуйста.
← →
Reindeer Moss Eater (2003-11-21 13:10) [1]необходимо передать в качестве параметра длинную строку, больше чем varchar2.
Какая длина?
← →
Sandman25 (2003-11-21 13:10) [2]OraStoredProc.ParamByName("parm").LoadFromStream ?
← →
SVha (2003-11-21 14:09) [3]Длинна может быть разной но например 100 000 символов
OraStoredProc.ParamByName("parm").LoadFromStream - тоже не работает.
SQL запрос такой -
begin
UP_TEST(:parm);
end;
Что примечательно, в демка ODAC с CLOB полями работают, через RETURNING...
Но его нельзя использовать при вызове процедур...
Короче здесь какаято засада... может адрес не корректно передаеться...
← →
Sandman25 (2003-11-21 17:14) [4]Я работаю через dbExpress, параметр хранимой примерно такой же, как у Вас, как я понял. В Informix он задается как "References text", что означает что он является именно указателем на clob. Так вот - для его установки не приходится делать ничего необычного, кроме
MemStream := TMemoryStream.Create;
with MemStream do
try
meDescrLong.Lines.SaveToStream(MemStream);
Params[3].LoadFromStream(MemStream, ftMemo);
finally
Free;
end;
Может, Вы некорректно в Stream записываете?
← →
Reindeer Moss Eater (2003-11-22 20:54) [5]Все дело в специфике типа данных.
Переменные типа CLOB (как и lob,nclob,bfile) содержат не сами данные больших объектов, а всего лишь локаторы на эти объекты.
Сами объекты хранятся в БД (lob,clob,nclob) или в виде внешних файлов(bfile).
Поэтому, для того что бы передать серверу данные типа clob необходимо сначала на сервере проинициализировать переменную clob (связать ее с дисковой областью данных сервера) и передать клиентскому приложению (готовый к записи локатор)
Вот пример процедуры делающей вставку текстового файла в таблицу с полем CLOB
procedure test_clob(clob_in in out clob) is
loc_lob clob := empty_clob();
begin
-- Вставляем в таблицу проинициализированный пустой clob
insert into test_table(id,lob_column) values(1,loc_lob);
/* Теперь локатор связан с конкретным местом на диске.
Нужно перечитать его значение чтобы присвоить параметру
нашей процедуры */
select lob_col into clob_in from test_lob where id = 1;
-- Запись вставлена и в поле lob_column содержится переданный текстовый файл
end;
либо с использоваением RETURNING (что бы избежать перезапроса)
procedure test_clob(clob_in in out clob) is
begin
insert into test_table(lob_column)
values(empty_clob())
returning lob_column into clob_in;
end;
Ну и в приложении:
OraStoredProc.ParamByName("param").AsOraCLOB.LoadFromFile("TextFileName.txt");
OraStoredProc.Execute;
← →
SVha (2003-11-24 10:55) [6]To Reindeer Moss Eater ©
Спасибо, мне кажется что Ваш ответ для меня многое прояснил.
To Sandman25 ©
В потоке я параметр передаю правильно, так как мне удается записать его в таблицу, в CLOB поле.
В общем, получается, что я и в процедуру то правильно CLOB поле передаю, а ошибка уже на сервере возникает.
Так как переданный CLOB я не в таблицу вставляю, а присваиваю переменной, с которой в дальнейшем работаю. Вот тут то видимо и возникают все проблемы, так как RETURNING ту не использовать.
Ладно, буду разбираться дальше.
В общем, есть обходной вариант, записывать CLOB в таблицу а потом с ним уже работать.
Спасибо большое за ответы :)
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2003.12.16;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.007 c