Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Параметр UDF BY DESCRIPTOR / 5 сообщений из 5, страница 1 из 1
23.05.2015, 19:48
    #38967089
Polesov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Параметр UDF BY DESCRIPTOR
Привет всем.

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

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

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

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

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


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