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

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 28960
SQL> exec x := 1 2
BEGIN x := 1 2; END;

             *
ERROR at line 1:
ORA-06550: line 1, column 14:
PLS-00103: Encountered the symbol "2" when expecting one of the following:
* & = - + ; < / > at in is mod remainder not rem
<an exponent (**)> <> or != or ~= >= <= <> and or like LIKE2_
LIKE4_ LIKEC_ between || multiset member SUBMULTISET_
The symbol "*" was substituted for "2" to continue.
SQL> exec dbms_output.put_line(132 mod 10); dbms_output.put_line(132 rem 10); dbms_output.put_line(132 remainder 10)
2
2
2

PL/SQL procedure successfully completed.
Именно недокументированный оператор, а не функция :)
24 ноя 09, 19:31    [7973113]     Ответить | Цитировать Сообщить модератору
 Re: PL/SQL-оператор MOD, или внимательно читая PLS-00103  [new]
xymbo
Member

Откуда: Донской --> Москва
Сообщений: 2561
Elic,

Фича . Забыл про мод, так есть и другое. :)
24 ноя 09, 19:45    [7973149]     Ответить | Цитировать Сообщить модератору
 Re: PL/SQL-оператор MOD, или внимательно читая PLS-00103  [new]
-2-
Member

Откуда:
Сообщений: 14646
Elic,

развивая тему...
MOD, REMAINDER, REM есть в "Table D-2 PL/SQL Keywords", но отсутствует в "Table D-1 PL/SQL Reserved Words" (11g pl/sql reference). И позволяет объявить в pl/sql переменную mod, но на ее использование ругается:
19:52:17 SQL> declare
19:56:33   2     mod number := 1;
19:56:40   3  begin
19:56:44   4     dbms_output.put_line('mod='||mod);
19:57:01   5  end;
19:57:03   6  /
   dbms_output.put_line('mod='||mod);
                                   *
ERROR at line 4:
ORA-06550: line 4, column 36:
PLS-00103: Encountered the symbol ")" when expecting one of the following:
(


Elapsed: 00:00:00.01
24 ноя 09, 20:02    [7973182]     Ответить | Цитировать Сообщить модератору
 Re: PL/SQL-оператор MOD, или внимательно читая PLS-00103  [new]
wildwind
Member

Откуда: Москва
Сообщений: 1298
Elic,

Баннер забыл :). 10g+
24 ноя 09, 20:06    [7973185]     Ответить | Цитировать Сообщить модератору
 Re: PL/SQL-оператор MOD, или внимательно читая PLS-00103  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 17322
2Elic: забавно :)

2-2-:
-2-
позволяет объявить в pl/sql переменную mod, но на ее использование ругается

Но если очень хочется, то можно:
SQL> declare
  2     mod number := 1;
  3  begin
  4     dbms_output.put_line('mod='||"MOD");
  5  end;
  6  /
 
PL/SQL procedure successfully completed
SQL> begin
  2  <<ext>>
  3  declare
  4     mod number := 1;
  5  begin
  6     dbms_output.put_line('mod='||ext.mod);
  7  end;end;
  8  /
 
PL/SQL procedure successfully completed
24 ноя 09, 20:17    [7973209]     Ответить | Цитировать Сообщить модератору
 Re: PL/SQL-оператор MOD, или внимательно читая PLS-00103  [new]
wildwind
Member

Откуда: Москва
Сообщений: 1298
xymbo
Забыл про мод, так есть и другое. :)

Не совсем.
declare
  procedure compare(p1 number, p2 number) is
  begin 
    dbms_output.put(rpad( '('||p1||', '||p2||'): ', 16));
    dbms_output.put(rpad( ' mod: '||p1 mod p2 , 16));
    dbms_output.put(rpad( ' rem: '||p1 rem p2 , 16));
    dbms_output.put(rpad( ' remainder: '||p1 remainder p2 , 16));
    dbms_output.new_line;
  end;
begin
  compare(10, 3);
  compare(-10, 3);
  compare(10.5, 3);
  compare(-10.5, 3);
  compare(10.6, 3);
  compare(-10.6, 3);
  compare(10.9, 3.9);
end;
/

(10, 3):         mod: 1          rem: 1          remainder: 1
(-10, 3):        mod: -1         rem: -1         remainder: -1
(10,5, 3):       mod: 1,5        rem: 1,5        remainder: -1,5
(-10,5, 3):      mod: -1,5       rem: -1,5       remainder: 1,5
(10,6, 3):       mod: 1,6        rem: 1,6        remainder: -1,4
(-10,6, 3):      mod: -1,6       rem: -1,6       remainder: 1,4
(10,9, 3,9):     mod: 3,1        rem: 3,1        remainder: -,8
24 ноя 09, 20:24    [7973227]     Ответить | Цитировать Сообщить модератору
 Re: PL/SQL-оператор MOD, или внимательно читая PLS-00103  [new]
wildwind
Member

Откуда: Москва
Сообщений: 1298
wildwind,

Похоже аналог SQL-ной функции
The MOD function is similar to REMAINDER except that it uses FLOOR in its formula, whereas REMAINDER uses ROUND.
24 ноя 09, 20:32    [7973249]     Ответить | Цитировать Сообщить модератору
 Re: PL/SQL-оператор MOD, или внимательно читая PLS-00103  [new]
-2-
Member

Откуда:
Сообщений: 14646
andrey_anonymous
Но если очень хочется, то можно
В кавычках можно и зарезервированные слова использовать в качестве идентификаторов. Вопрос не в том, что можно, а в некоторой некорректности документации:
D PL/SQL Reserved Words and Keywords
Both reserved words and keywords have special syntactic meaning to PL/SQL. The difference between reserved words and keywords is that you cannot use reserved words as identifiers. You can use keywords as as identifiers, but it is not recommended.
Функции относятся к просто keywords, и без проблем декларируются в качестве переменных, но в выражениях локальная декларация не перебивает специального значения.
24 ноя 09, 21:25    [7973361]     Ответить | Цитировать Сообщить модератору
 Re: PL/SQL-оператор MOD, или внимательно читая PLS-00103  [new]
xymbo
Member

Откуда: Донской --> Москва
Сообщений: 2561
wildwind,

Понятно, я посмотрел на парочке значений только :)
24 ноя 09, 22:16    [7973471]     Ответить | Цитировать Сообщить модератору
 Re: PL/SQL-оператор MOD, или внимательно читая PLS-00103  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 28960
wildwind
Баннер забыл :). 10g+
Не совсем, сперва заметил на девятке:
Connected to:
Oracle9i Enterprise Edition Release 9.2.0.8.0 - Production

SQL> exec dbms_output.put_line(132 mod 10); dbms_output.put_line(132 rem 10)
2
2

PL/SQL procedure successfully completed.
24 ноя 09, 22:38    [7973545]     Ответить | Цитировать Сообщить модератору
 Re: PL/SQL-оператор MOD, или внимательно читая PLS-00103  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 17322
-2-
Функции относятся к просто keywords, и без проблем декларируются в качестве переменных, но в выражениях локальная декларация не перебивает специального значения.

см. второй пример из "если хочется..." :)
Имеет место не "перебивание" деклараций, но банальный конфликт имен.
И его можно разрешить.
24 ноя 09, 22:48    [7973583]     Ответить | Цитировать Сообщить модератору
 Re: PL/SQL-оператор MOD, или внимательно читая PLS-00103  [new]
wildwind
Member

Откуда: Москва
Сообщений: 1298
Elic
сперва заметил на девятке

rem — да (синоним mod похоже), но не remainder
24 ноя 09, 22:48    [7973584]     Ответить | Цитировать Сообщить модератору
 Re: PL/SQL-оператор MOD, или внимательно читая PLS-00103  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 28960
wildwind
Elic
сперва заметил на девятке
rem — да (синоним mod похоже), но не remainder
Какая разница :) Пользоваться недокументированными операторами вместо аналогичных, но документированных функций - искать приключений на свою ...
24 ноя 09, 23:01    [7973620]     Ответить | Цитировать Сообщить модератору
 Re: PL/SQL-оператор MOD, или внимательно читая PLS-00103  [new]
Elic
Member

Откуда: 1984. Выбраковка финно-угром продолжается. КЯЗ
Сообщений: 28960
Три года назад перемывали предикат overlaps и на эти же слова не обратили внимания :)
24 ноя 09, 23:40    [7973671]     Ответить | Цитировать Сообщить модератору
 Re: PL/SQL-оператор MOD, или внимательно читая PLS-00103  [new]
SY
Member

Откуда: Middlebury, CT USA
Сообщений: 9462
wildwind
Elic
сперва заметил на девятке

rem — да (синоним mod похоже), но не remainder


Close, but no cigar . Not a synonym. It is a function declared in package STANDARD. Check $ORACLE_HOME/rdbms/admin/stdbody.sql:

  function 'REM' (LEFT NUMBER, RIGHT NUMBER) return NUMBER is
  begin
    return (LEFT - (trunc(LEFT / RIGHT) * RIGHT));
  end;

  function 'REM' (LEFT BINARY_FLOAT, RIGHT BINARY_FLOAT)
    return BINARY_FLOAT is
  begin
    return (LEFT - (trunc(LEFT / RIGHT) * RIGHT));
  end;

  function 'REM' (LEFT BINARY_DOUBLE, RIGHT BINARY_DOUBLE)
    return BINARY_DOUBLE is
  begin
    return (LEFT - (trunc(LEFT / RIGHT) * RIGHT));
  end;

And therefore acts differently than MOD:

SQL> exec dbms_output.put_line(0 mod 0);
0

PL/SQL procedure successfully completed.

SQL> exec dbms_output.put_line(0 rem 0);
BEGIN dbms_output.put_line(0 rem 0); END;

*
ERROR at line 1:
ORA-01476: divisor is equal to zero
ORA-06512: at "SYS.STANDARD", line 94
ORA-06512: at line 1


SQL> exec dbms_output.put_line(0 mod binary_float_infinity);
0

PL/SQL procedure successfully completed.

SQL> exec dbms_output.put_line(0 rem binary_float_infinity);
Nan

PL/SQL procedure successfully completed.

SQL> exec dbms_output.put_line(5 mod binary_float_infinity);
5.0E+000

PL/SQL procedure successfully completed.

SQL> exec dbms_output.put_line(5 rem binary_float_infinity);
Nan

PL/SQL procedure successfully completed.

SQL> 

SY.
25 ноя 09, 00:04    [7973705]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить