Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2004.11.07;
Скачать: [xml.tar.bz2];

Вниз

VARCHAR(15000) ???   Найти похожие ветки 

 
GanibalLector ©   (2004-10-08 00:44) [0]

Насколько это опасно???
З.Ы. Это не поле в таблице,это выходой параметр в ХП.

З.З.Ы. Просто меня уморило делать UDF для преобразования в BLOB.


 
kaif ©   (2004-10-08 01:43) [1]

Да вроде спокойно можно такие вещи делать. Подумаешь! В конце-концов это всего 15К. Прикинь, что это jpeg-файл. Стал бы ты спрашивать про то, может ли быть такой большой jpeg? Какой же он большой? Совсем даже небольшой. Я не удивлюсь, если и 30K спокойно заработает. Это же не поле таблицы, на которое хочется индекс повесить?
 Возьмем какую-нибудь UDF. Например:

DECLARE EXTERNAL FUNCTION RTRIM CSTRING(32767)
RETURNS CSTRING(32767) FREE_IT
ENTRY_POINT "IB_UDF_rtrim" MODULE_NAME "ib_udf";

 Как видим, народ не скупится на длину параметра. А нафик такой длинный параметр? Откуда-то ведь предполагается в него данные-то передавать... Значит правда написана, что VARCHAR может иметь такие длины. Я бы просто на тормоз попробовал - и все дела. Единственная опасность - тормоз получить. Если тормоза не заметил бы - вообще даже думать бы не стал про какие-то там "опасности". Не мегабайт и не гигабайт. Вшивых 15K. Так что, ИМХО, нормально. Однако вот как-то нужно все же гарантировать, чтобы за длину не выскочить. Иначе неприятности будут.
Я обычно ограничиваю длины (если они могут выскочить, например, после конкатенации в ХП). Использую strlen, чтобы длину измерить и substr, чтобы обрезать, если выскочила:

DECLARE EXTERNAL FUNCTION substr
CSTRING(32767), SMALLINT, SMALLINT
RETURNS CSTRING(32767) FREE_IT
ENTRY_POINT "IB_UDF_substr" MODULE_NAME "ib_udf";

DECLARE EXTERNAL FUNCTION strlen
CSTRING(32767)
RETURNS INTEGER BY VALUE
ENTRY_POINT "IB_UDF_strlen" MODULE_NAME "ib_udf";

Правда я редко работаю с длинами больше 1K.


 
GanibalLector ©   (2004-10-08 01:51) [2]

2 kaif
Кстати,по поводу UDF.Откуда они были взяты???
З.Ы. Естественно интересует *.drp от ib_udf.dll


 
Digitman ©   (2004-10-08 09:04) [3]


> Просто меня уморило делать UDF для преобразования в BLOB


значит, ты чего-то недопонимаешь ..
никаких сложностей в этом нет

function InternalGetBlobSegment(Blob: PBlob; Buffer: Pointer; BufSize: ULong): ULong;
var
TotalBytesRead: Integer;
begin
  TotalBytesRead := 0;
  if Assigned(Blob) then with Blob^ do
    if Assigned(BlobHandle) and Assigned(GetSegment)
    and Boolean(GetSegment(BlobHandle, Buffer, Min(BufSize, MaxSegmentLength), TotalBytesRead)) then
      Result:= TotalBytesRead
    else
      Result:= 0;
end;

function InternalGetBlob(Blob: PBlob; Buffer: Pointer; Size: Integer): ULong;
var
  BytesRead: Integer;
begin
  Result:= 0;
  if Assigned(Blob) then with Blob^ do
    if Assigned(BlobHandle) and Assigned(GetSegment) then
       while (Size > 0) do
       begin
         BytesRead := InternalGetBlobSegment(Blob, PChar(Buffer) + Result, Size);
         if BytesRead = 0 then
           Break;
         Inc(Result, BytesRead);
         Dec(Size, BytesRead);
       end;
end;

function InternalPutBlob(Blob: PBlob; Buffer: Pointer; Size: Integer): ULong;
var
 BytesToWrite: Integer;
begin
  Result:= 0;
  if Assigned(Blob) then with Blob^ do
    if Assigned(BlobHandle) and Assigned(PutSegment) then while (Size > 0) do begin
      BytesToWrite:= Min(DefaultBlobSegmentSize, Size);
      PutSegment(BlobHandle, PChar(Buffer) + Result, BytesToWrite);
      Dec(Size, BytesToWrite);
      Inc(Result, BytesToWrite);
    end;
end;

function StringToBlob(Value: PChar; Blob: PBlob): PBlob; cdecl;
begin
 Result:= Blob;
 if Assigned(Result) and Assigned(Value) then
   with Result^ do
   try
     if Assigned(BlobHandle) and Assigned(PutSegment) then
       InternalPutBlob(Result, Value, StrLen(Value) + 1)
     else
       Result:= nil;
   except
     Result:= nil;
   end;
end;

function BlobToString(Blob: PBlob): PChar; cdecl; //free_it
var
 bytes_read: Longint;
begin
 Result:= nil;
 if Assigned(Blob) then
   with Blob^ do
   try
     if Assigned(BlobHandle) and (TotalSize > 0) and Assigned(GetSegment) then
       begin
         Result := ib_util_malloc(TotalSize + 1);
         bytes_read := InternalGetBlob(Blob, Result, TotalSize);
         Result[bytes_read] := #0;
       end;
   except
     Result:= nil;
   end;
end;

declare external function StringToBlob
cstring(32767), blob
returns parameter 2

declare external function BlobToString
blob
returns cstring(32767) free_it


 
Johnmen ©   (2004-10-08 09:34) [4]

>сделал выходным параметром varchar(15000) и наступило СЧАСТЬЕ.

Так я и намекал, что это проще. До 32000.


 
GanibalLector ©   (2004-10-08 09:39) [5]

2 Digitman ©   (08.10.04 09:04) [3]
Дело в том,что написал см. http://delphimaster.net/view/3-1097164914/ .Работает так
BL= BlobCat(некоторое поле,еще один BLOB)
когда делаю так:
BL= BlobCat(некоторое поле,BL) то  в BLOBe сохраняется только последнее значения "некоторого поля"

Ну да ладно,ща я подключу Вашу...посмотрю.Спасибо как всегда.

2 Johnmen ©   (08.10.04 09:34) [4]
>Так я и намекал, что это проще. До 32000.
Где это Вы намекали???Вроде постов Ваших не было.


 
Johnmen ©   (2004-10-08 09:45) [6]

>Где это Вы намекали???Вроде постов Ваших не было.

Вот там, на что ты дал ссылку...:)


 
GanibalLector ©   (2004-10-08 09:51) [7]

2 Johnmen ©
Вот там, на что ты дал ссылку...:)
То,похоже не на намек,а на вопрос.Без обид


 
Johnmen ©   (2004-10-08 10:04) [8]

>GanibalLector ©   (08.10.04 09:51) [7]

В любом встречном вопросе есть доля намека. А в этом особенно. Ведь ты же, наверно, задумался, а чёй то он (т.е. я) задаёт такой (не очень в тему) вопрос ?



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

Форум: "Базы";
Текущий архив: 2004.11.07;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.046 c
14-1098088437
Aldor_
2004-10-18 12:33
2004.11.07
Народ, у кого есть Matlab/Mathcad или т.п., вычислите, пожалуйста


14-1098293957
M@D
2004-10-20 21:39
2004.11.07
D8


1-1098280050
zorik
2004-10-20 17:47
2004.11.07
Maximized window


1-1098686822
Last
2004-10-25 10:47
2004.11.07
Как задавить нажатие клавиши Enter?


3-1097306996
Алексей
2004-10-09 11:29
2004.11.07
Удаление записи





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский