powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / обработка экцепшенов с помощью when ... do
9 сообщений из 9, страница 1 из 1
обработка экцепшенов с помощью when ... do
    #38522345
SEYD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый вечер,

есть вот такая ХП:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
SET TERM ^ ;

create or alter procedure JOURNAL_USERINFO_PARAM_CAST (
    PARAM_VALUE varchar(256),
    TYPECAST smallint)
returns (
    PARAM_VALUE_CASTED varchar(256))
as
declare variable VALUE_INT bigint;
declare variable VALUE_FLOAT double precision;
declare variable VALUE_CHAR varchar(256);
begin
  begin
    if (typecast in (0, 3, 4, 5)) then value_int = cast(param_value as bigint);
    else if (typecast in (1, 6, 7, 8)) then value_float = cast(param_value as double precision);
    else value_char = param_value;

    select
      case :typecast
        when 0 then :value_int
        --при отображении чисел float убираем в конце лишние ноли, но оставляем минимум 2 знака после запятой (типа копейки)
        when 1 then iif(position('.',trim(trailing '0' from :value_float))>char_length(trim(trailing '0' from :value_float))-3, rpad(trim(trailing '0' from :value_float),2+position('.',trim(trailing '0' from :value_float)),'0'),trim(trailing '0' from :value_float))
        when 2 then :value_char
        when 3 then :value_int
        when 4 then :value_int
        when 5 then iif(:value_int=0, 'Изначально', cast('30.12.1899' as date)+:value_int)
        when 6 then iif(:value_float=0, 'Изначально', cast('30.12.1899 0:00' as timestamp)+:value_float)
        when 7 then iif(:value_float*24>10, cast(trunc(:value_float*24, 0) as integer), lpad(cast(trunc(:value_float*24, 0) as integer), 2, '0')) || ':' || lpad(mod(trunc(:value_float*24*60, 0), 60), 2,'0') || ':' || lpad(mod(trunc(:value_float*24*60*60, 0), 60), 2, '0')
        when 8 then iif(:value_float>10, cast(trunc(:value_float, 0) as integer), lpad(cast(trunc(:value_float, 0) as integer), 2, '0')) || ':' || lpad(mod(trunc(:value_float*60, 0), 60), 2,'0') || ':' || lpad(mod(trunc(:value_float*60*60, 0), 60), 2, '0')
      end
      from rdb$database
      into :param_value_casted;

    when sqlcode -413 do param_value_casted = '[value cast: conversion error] sqlcode='||sqlcode;
    when sqlcode -802 do param_value_casted = '[value cast: string truncation error] sqlcode='||sqlcode;
    when any do param_value_casted = '[value cast: unknown error] sqlcode='||sqlcode;
  end

  suspend;
end^

SET TERM ; ^



ести в качестве параметров передать:
PARAM_VALUE: Любой текст
TYPECAST: 0

то будет экцепшн "conversion error from string" с sqlcode=-413, но срабатывает when any и говорит, что sqlcode=0. При этом если when any закомментить, то срабатывает when sqlcode -413 c соответствующим сообщением.

что не так? почему when any повторно реагирует на экцепшн?
...
Рейтинг: 0 / 0
обработка экцепшенов с помощью when ... do
    #38522376
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SEYDпочему when any повторно реагирует на экцепшн?
а где-то написано, что не должен? Тынц
...
Рейтинг: 0 / 0
обработка экцепшенов с помощью when ... do
    #38522384
SEYD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
dimitrа где-то написано, что не должен?

как мне кажется это не логично...

ок, тогда почему при втором срабатывании sqlcode равен 0, а не -413? Какой в этом кроется смысл?
...
Рейтинг: 0 / 0
обработка экцепшенов с помощью when ... do
    #38522404
dimitr
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SEYDкак мне кажется это не логично...
не буду спорить, но такова данность

SEYDтогда почему при втором срабатывании sqlcode равен 0, а не -413?
не знаю, может и баг
...
Рейтинг: 0 / 0
обработка экцепшенов с помощью when ... do
    #38523885
SEYD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SEYDок, тогда почему при втором срабатывании sqlcode равен 0, а не -413? Какой в этом кроется смысл?

ну так что, кто знает ответ и как сделать правильно?
...
Рейтинг: 0 / 0
обработка экцепшенов с помощью when ... do
    #38523901
SEYD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
кстати, если вдруг: fb 2.5.2.26540 32-bit
...
Рейтинг: 0 / 0
обработка экцепшенов с помощью when ... do
    #38524198
Dmitry Kurbsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Например,
Код: sql
1.
2.
3.
4.
5.
6.
when того
  begin
    сего;
    suspend;
    exit;
  end
...
Рейтинг: 0 / 0
обработка экцепшенов с помощью when ... do
    #38524274
SEYD
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dmitry Kurbsky,
это понятно, меня больше интересует:

SEYDтогда почему при втором срабатывании sqlcode равен 0, а не -413? Какой в этом кроется смысл?
...
Рейтинг: 0 / 0
обработка экцепшенов с помощью when ... do
    #38524361
hvlad
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SEYD,

спроси у борланда
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / обработка экцепшенов с помощью when ... do
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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