powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Параметр UDF BY DESCRIPTOR
5 сообщений из 5, страница 1 из 1
Параметр UDF BY DESCRIPTOR
    #38967089
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет всем.

Попытаемся присвоить полю типа INTEGER текстовое значение:
Код: plsql
1.
2.
3.
update SOME_TABLE
   set ID = 'This is simple string value'
 where ID = 1;


Возникает ошибка:
Код: pascal
1.
2.
Statement failed, SQLSTATE = 22018
conversion error from string "This is simple string value"



Есть UDF вида:
Код: plsql
1.
2.
3.
4.
DECLARE EXTERNAL FUNCTION INT_UDF
    INTEGER BY DESCRIPTOR
RETURNS INTEGER BY VALUE
ENTRY_POINT 'IntUdf' MODULE_NAME 'ModuleName.dll';


Структура описания параметра:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
8.
9.
type
  TDSC = packed record
    dsc_dtype    : byte;
    dsc_scale    : shortint;
    dsc_length   : word;
    dsc_sub_type : smallint;
    dsc_flags    : word;
    dsc_address  : pointer;
  end;


Теперь передадим в UDF текстовое значение:
Код: plsql
1.
2.
select INT_UDF( 'This is simple string value' )
  from RDB$DATABASE;


Никаких ошибок не возникает. При этом структура описания параметра заполнена следующим образом:
Код: pascal
1.
2.
3.
4.
5.
6.
dsc_dtype    = 1   // тип CHAR
dsc_scale    = 0
dsc_length   = 27
dsc_sub_type = 52  // CHARACTER SET ID
dsc_flags    = 0
dsc_address  - содержит pAnsiChar 'This is simple string value'


Несколько изменим вызов UDF:
Код: plsql
1.
2.
select INT_UDF( CAST( 'This is simple string value' AS VARCHAR(32) ) )
  from RDB$DATABASE;


Структура описания параметра при таком вызове:
Код: pascal
1.
2.
3.
4.
5.
6.
7.
dsc_dtype    = 2   // тип VARCHAR
dsc_scale    = 0
dsc_length   = 34  // размер CAST 32 + 2
dsc_sub_type = 52  // CHARACTER SET ID
dsc_flags    = 0
dsc_address  - первые 2 байта содержат длину 27
dsc_address  + 2 - содержит pAnsiChar 'This is simple string value'



Вопрос: это так и должно быть, что при вызове UDF для параметров BY DESCRIPTOR передаваемый тип никак не контролируется?

С уважением, Polesov.
...
Рейтинг: 0 / 0
Параметр UDF BY DESCRIPTOR
    #38967091
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Polesovэто так и должно быть, что при вызове UDF для параметров BY DESCRIPTOR
передаваемый тип никак не контролируется?
Да, он чисто фикция. Мог бы вообще отсутствовать, но парсер не позволяет.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Параметр UDF BY DESCRIPTOR
    #38967094
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov, спасибо за ответ.

Если уж надо, то тип можно контролировать в самой UDF.

С уважением, Polesov.
...
Рейтинг: 0 / 0
Параметр UDF BY DESCRIPTOR
    #38967152
-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
-
Гость
PolesovЕсли уж надо, то тип можно контролировать в самой UDF
Проверить тип и кинуть исключение не получится, FB упадёт.
...
Рейтинг: 0 / 0
Параметр UDF BY DESCRIPTOR
    #38967184
Polesov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет.

Ну, можно написать UDF, возвращающую фактический тип параметра, по результату которой возбуждать EXCEPTION в теле хранимой процедуры. Причем, значение параметра NULL игнорировать независимо от типа, т.к. NULL совместим со всеми типами.

С уважением, Polesov.
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Параметр UDF BY DESCRIPTOR
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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