Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2002.07.04;
Скачать: CL | DM;

Вниз

Если BLOB является выходным параметром UDF   Найти похожие ветки 

 
Patrick ©   (2002-06-13 09:11) [0]

Посоветуйте, please, каким образом вызывать UDF в запросе, если BLOB является выходным параметром UDF.

Например:
Исходный текст UDF:

function StrBlob(sz: PChar; SrcBlob: PBlob; var DstBlob :PBlob): PBlob; cdecl; export;
begin
result := SrcBlob;
DstBlob := SrcBlob;
if (not Assigned(SrcBlob)) or
(not Assigned(SrcBlob^.BlobHandle)) then exit;
SrcBlob^.PutSegment(SrcBlob^.BlobHandle, sz, StrLen(sz));
DstBlob := SrcBlob;
result := SrcBlob;
end;

Кстати описывать в Delphi этот фрагмент нужно как процедуру, или как функцию.


Описание UDF:
DECLARE EXTERNAL FUNCTION ADDTOBLOB
CSTRING(32767),
BLOB
RETURNS PARAMETER 2
ENTRY_POINT "StrBlob" MODULE_NAME "FreeUDFLib.dll";

Каким образом вызывать данную функцию в запросе на изменение?

update complect
set note = addtoblob("New String",?????? ) ???????????????
where code = 0

варианты
update complect
set note = addtoblob("New String", note, note )
where code = 0
и
update complect
set note = addtoblob("New String", note)
where code = 0
я убирал третий параметр в исходнике UDF.


 
Digitman ©   (2002-06-13 11:03) [1]

1. UDF всегда должна быть декларирована и реализована во внешней UDF-библиотеке как функция.

2. Вызов UDF из тела SP/триггера/View всегда должен быть оформлен как вызов ф-ции.

3. Если UDF возвращает BLOB, то результат в ISQL-скрипте декларации такой UDF должен быть описан как "returns parameter LAST", где LAST - номер последнего входного параметра в числе прочих вх.параметров объявления UDF. Последним параметром, разумеется, д.б. BLOB-параметр (равно как и в самом тексте декларации и реализации UDF в UDF-модуле).

3. Если UDF возвращает BLOB, то в строчке вызова UDF из тела SP/триггера/View последний паараметр указывать не нужно : IB самостоятельно (неявно) создаст и передаст его в UDF.

Правильно сделать в твоем примере будет так :


function StrBlob(sz: PChar; DstBlob :PBlob): PBlob; cdecl; export;
begin
Result := DstBlob;
if Assigned(DstBlob) and Assigned(DstBlob.BlobHandle)
and and Assigned(DstBlob.PutSegment) then
Result.PutSegment(DstBlob.BlobHandle, sz, StrLen(sz));
end;

DECLARE EXTERNAL FUNCTION ADDTOBLOB
CSTRING(32767),
BLOB
RETURNS PARAMETER 2
ENTRY_POINT "StrBlob" MODULE_NAME "FreeUDFLib.dll";

update complect
set note = ADDTOBLOB("New String") /* только первый вх.параметр указвыается, второй IB создаст и подставит сам */
where code = 0




 
Patrick ©   (2002-06-13 11:14) [2]

Many Thanks!!!



Страницы: 1 вся ветка

Текущий архив: 2002.07.04;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.012 c
14-9970
SleD
2002-06-02 14:41
2002.07.04
Вопрос к участникам Spedia


6-9952
Serega 1
2002-04-25 07:08
2002.07.04
Почему вылазеет ошибка?


14-9965
Феликс
2002-06-02 19:28
2002.07.04
Новые смайлики


14-9961
ev
2002-06-01 14:49
2002.07.04
oberon


1-9847
Rykky
2002-06-20 18:07
2002.07.04
Как на Image’е программно начертить прямоугольник размером 10х12?