Форум: "Базы";
Текущий архив: 2002.07.04;
Скачать: [xml.tar.bz2];
ВнизЕсли 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;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.004 c