Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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
14-52363
RealRascal
2003-11-23 10:01
2003.12.16
Автоформат кода


14-52404
mari
2003-11-21 10:50
2003.12.16
не могу войти в чат


1-52176
Don
2003-12-03 13:56
2003.12.16
Как изменить вид кнопки ?


7-52429
JB
2003-10-10 12:03
2003.12.16
Чтение с консоли результата выполнения программы DOS


3-52079
_юзер_
2003-11-24 17:10
2003.12.16
и UPPER





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский