Сравнение числа с varchar2 - PullRequest
0 голосов
/ 26 июня 2018

У меня есть эта функция, и мне нужно сравнить число с varchar.

      CREATE OR REPLACE FUNCTION getOdds(i_odd in varchar2, i_id in number) return number as
begin
declare odd integer;
declare i_perecentage=0;
begin

if i_odd ='SP'
then
return (0);
end if;

odd:=round(to_number((1-i_perecentage/100)*i_odd),2);
  if odd<1 
  then          
 return(i_odd);
 else
 return(round(odd,2));
 end if;

end;
end;
/

PS: я отредактировал функцию и решил проблему со сравнением, теперь у меня есть другая ситуация, которая мне не нравится .. Эта функция возвращает рассчитанный процент i_odd. Проблема заключается в том, что если я передаю 0 в i_percentage в результатах, я получаю результат без десятичных разрядов (например: i_odd = 3.10 и i_percentage = 0, я получаю нечетное = 3, но если я передаю i_odd = 3.10 и i_percentage = 1, я получаю нечетное = 3.10). Почему на i_percentage = 0 я не получаю десятичные разряды ??

Ответы [ 3 ]

0 голосов
/ 26 июня 2018

Причина, по которой вы не можете перехватить исключение invalid_number, заключается в том, что вы объявляете входной параметр как число. Когда вы вызываете вашу функцию, Oracle пытается сначала преобразовать строку в число (и, конечно, не удается, , прежде чем вводить код вообще ).

Если вы измените входной параметр на varchar2, то преобразование в число (неявное в данном случае) будет выполнено внутри функции, и недопустимые числа могут быть перехвачены и обработаны, как вы хотите (здесь я просто возвращаю другую строку для обозначения вопроса):

create or replace function is_odd_even(i_num in varchar2)
return varchar2
is
begin
  -- conversion to number is done here
  if (mod(i_num, 2) = 0) then
    return 'EVEN';
  else
    return 'ODD';
  end if;

exception
  when INVALID_NUMBER or VALUE_ERROR then
    -- do something meaningful
    return 'INV';
end;

Пример использования:

with x as (
  select '1' as val from dual
  union all
  select 'SP' as val from dual
  union all
  select '2' as val from dual
)
select x.val, is_odd_even(x.val)
from x;

Выход:

1   ODD
SP  INV
2   EVEN
0 голосов
/ 29 июня 2018

РЕШЕНИЕ:

CREATE OR REPLACE FUNCTION getOdds(i_odd in varchar2, i_id in number) return varchar2 as

odd varchar2(10);
ret_value number(4); 

begin

if (i_odd ='SP') or i_odd is null then 
return 'SP';
else
  odd :=ROUND( TO_NUMBER( ( 1 - (play_beting.get_odds_percentage(i_id) / 100 ) ) * TO_NUMBER(i_odd) ), 2);  

   IF(odd < 1) THEN  
            ret_value := TO_NUMBER(i_odd);  
          ELSE  
            ret_value := to_char(odd,'9999.00');  
          END IF;  

      END IF;  

      RETURN to_char(ret_value,'9999.00');  

END getOdds;   
0 голосов
/ 26 июня 2018

Если вы хотите проверить поле varchar2 как число в PL / SQL, обычно вы просто пытаетесь преобразовать его в число и перехватить исключение.

CREATE OR REPLACE FUNCTION getOdds(i_odd in varchar2, i_id in number) return number as
    odd number;
BEGIN
    -- if i_odd = 'SP' (or another non-number), this will throw an ORA-01722 
    -- exception which will be caught in the exception block, below
    odd := to_number(i_odd); -- you might want a format mask here

    --... now you can use "odd" as a number

EXCEPTION WHEN INVALID_NUMBER THEN
    return 0;
END;
/

Вы также можете вкладывать блок begin..end в середину вашего кода, чтобы перехватывать исключения, если это работает лучше для вас:

CREATE OR REPLACE FUNCTION getOdds(i_odd in varchar2, i_id in number) return number as
    odd number;
begin

    begin
      odd := to_number(i_odd); -- you might want a format mask here
    exception when INVALID_NUMBER then
      odd := 0;
    end;

    --... now you can use "odd" as a number

end;
/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...