powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Обработка BLOBов с помощью UDF
1 сообщений из 1, страница 1 из 1
Обработка BLOBов с помощью UDF
    #32214587
Neophyte
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
При использовании в процедуре параметров BLOB (входной и выходной) после выполнения
при больших N (100-1000) растёт файл базы.( как в IB 6, так и в FireBird 1.0)
Данные в таблице не изменяются
CREATE_BLOB1,OUT_SUM_BLOB- UDF С++, объявленные
DECLARE EXTERNAL FUNCTION CREATE_BLOB1
BLOB SUB_TYPE 0
RETURNS BLOB SUB_TYPE 0
ENTRY_POINT "Create_New_Blob" MODULE_NAME "CppDLL",

DECLARE EXTERNAL FUNCTION ADD_BLOB
BLOB SUB_TYPE 0, BLOB SUB_TYPE 0
RETURNS BLOB SUB_TYPE 0
ENTRY_POINT "Add_Blob" MODULE_NAME "CppDLL"

считывают BLOB и формируют на его основе новый.
А если пытаешься складывать выходной BLOB c помощью UDF и накапливать,
база увеличивается в несколько раз и память кончается!!!
(Входной BLOB-примерно 3500 X 4 байта ,
выходной- в 1 процедуре в 3 раза <,
во 2 процедуре (в 3 раза <)*(N-I)
При применении UDF , в которой выходной параметр-не BLOB база не растет.
Таблица пробная, на 1000 записей , необходимо обрабатывать как минимум в 50 раз >.

Пожалуйста, подскажите, почему? И можно ли от этого избавиться?

1)
CREATE PROCEDURE OUT_BLOB_N (
I INTEGER,
N INTEGER
) RETURNS (
DAT BLOB
) AS
DECLARE VARIABLE B BLOB;
DECLARE VARIABLE B1 BLOB;
BEGIN
FOR
SELECT NEWDATA FROM ELEMENTS
WHERE (EL_ID>=:I)AND(EL_ID<:I+:N)
INTO :B
DO
BEGIN
B1=CREATE_BLOB1(B);
END
DAT=B1;
SUSPEND;
END

2)
CREATE PROCEDURE OUT_SUM_BLOB (
I INTEGER,
N INTEGER
) RETURNS (
DAT BLOB SUB_TYPE 0 SEGMENT SIZE 80
) AS
DECLARE VARIABLE B BLOB;
DECLARE VARIABLE B1 BLOB;
DECLARE VARIABLE S BLOB;
DECLARE VARIABLE S1 BLOB;
DECLARE VARIABLE F INTEGER;
BEGIN
F=0;
FOR
SELECT NEWDATA FROM ELEMENTS
WHERE (EL_ID>=:I)AND(EL_ID<:I+:N)
INTO :B
DO
BEGIN
B1=CREATE_BLOB1(B);
IF(F=0)THEN
BEGIN
/*CREATE_BLOB1-ОБРАБАТЫВАЕТ BLOB B И ВЫВОДИТ BLOB B1 */
S=CREATE_BLOB1(B);
S1=S;
F=F+1;
END
ELSE
BEGIN

/*ADD_BLOB-ОБЪЕДИНЯЕТ BLOB S И B1 и ВЫВОДИТ BLOB S1 */
S1=ADD_BLOB(S,B1);
S=S1;
END /**/
END

DAT=S1;
SUSPEND;
END
...
Рейтинг: 0 / 0
1 сообщений из 1, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Обработка BLOBов с помощью UDF
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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