Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Может ли INT-параметр иметь дробную часть? - Увы...  [new]
Elic
Member

Откуда: 1984. Следующие на оккупацию финно-угром
Сообщений: 23719
declare
  numberVar number := 2/3;
  numberVar2 number(20,10) := 4/3;
  procedure Test(Label varchar2, Value int)
  is
    LocalVar int := Value;
  begin
    dbms_output.put_line(Label || '         : ' || Value);
    dbms_output.put_line(Label || ' assigned: ' || LocalVar);
  end Test;
begin
  Test('|                 const', 1/3);
  Test('|            number var', numberVar);
  Test('|constrained number var', numberVar2);
end;
/
7.3.4, 9.2.0.8
|                 const         : .3333333333333333333333333333333333333333
|                 const assigned: 0
|            number var         : .6666666666666666666666666666666666666667
|            number var assigned: 1
|constrained number var         : 1.3333333333
|constrained number var assigned: 1
10.2.0.4, 10.2.0.3
alter session set plsql_optimize_level=0;

|                 const         : .3333333333333333333333333333333333333333
|                 const assigned: .3333333333333333333333333333333333333333
|            number var         : .6666666666666666666666666666666666666667
|            number var assigned: .6666666666666666666666666666666666666667
|constrained number var         : 1.3333333333
|constrained number var assigned: 1.3333333333
Подтипы одного и того же типа => передача фактического параметра по ссылке = преобразование округлением не выполняется. А теперь и присвоение оптимизировано.

Рушатся все мои устои ...
1 дек 09, 18:52    [8004782]     Ответить | Цитировать Сообщить модератору
 Re: Может ли INT-параметр иметь дробную часть? - Увы...  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 15178
Elic
Подтипы одного и того же типа => передача фактического параметра по ссылке = преобразование округлением не выполняется.

Мне кажется, что поведение параметра связано скорее с
declare
  procedure p(p number(38,0)) is
  begin
    null;
  end;
begin
  null;
end;
 
ORA-06550: line 3, column 23:
PLS-00103: Encountered the symbol "(" when expecting one of the following:

   := . ) , @ % default character
The symbol ":=" was substituted for "(" to continue.
чем с оптимизацией.
А вот то, что сломали присваивание - действительно печально :(
1 дек 09, 19:16    [8004843]     Ответить | Цитировать Сообщить модератору
 Re: Может ли INT-параметр иметь дробную часть? - Увы...  [new]
Timm
Member

Откуда: Moscow, Ё-burg
Сообщений: 3729
В 11.2.0.1 не починили.
1 дек 09, 21:36    [8005201]     Ответить | Цитировать Сообщить модератору
 Re: Может ли INT-параметр иметь дробную часть? - Увы...  [new]
Relic Hunter
Member

Откуда: AB
Сообщений: 4332
Я всегда подспудно использовал PLS_INTEGER в PL/SQL. Проблема не проявляется.

Oracle® Database PL/SQL User's Guide and Reference 10g Release 2 (10.2)
Use PLS_INTEGER for Integer Arithmetic

When you need to declare a local integer variable, use the datatype PLS_INTEGER, which is the most efficient integer type. PLS_INTEGER values require less storage than INTEGER or NUMBER values, and PLS_INTEGER operations use hardware arithmetic. Note that the BINARY_INTEGER datatype is identical to PLS_INTEGER.

The datatype NUMBER and its subtypes are represented in a special internal format, designed for portability and arbitrary scale and precision, not performance. Even the subtype INTEGER is treated as a floating-point number with nothing after the decimal point. Operations on NUMBER or INTEGER variables require calls to library routines.

Avoid constrained subtypes such as INTEGER, NATURAL, NATURALN, POSITIVE, POSITIVEN, and SIGNTYPE in performance-critical code. Variables of these types require extra checking at run time, each time they are used in a calculation.
1 дек 09, 22:04    [8005247]     Ответить | Цитировать Сообщить модератору
 Re: Может ли INT-параметр иметь дробную часть? - Увы...  [new]
Elic
Member

Откуда: 1984. Следующие на оккупацию финно-угром
Сообщений: 23719
Relic Hunter
Я всегда подспудно использовал PLS_INTEGER в PL/SQL. Проблема не проявляется.
Hint:
Elic
Подтипы одного и того же типа
Да диапазон значений PLS_INTEGER-а "маловат".
2 дек 09, 10:09    [8006287]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить
 
Лучший учебный центр Microsoft!
Новейшие курсы Microsoft SQL Server 2014!
Статус Academy Oracle. Очень привлекательные цены на курсы Oracle!
Курсы MySQL. Много групп в сентябре!