Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Есть ли способ посчитать математическое выражение записанное в строковом виде  [new]
еще один зеленый
Guest
Встала задача вычислить математическое выражение записаное в строковом виде, т.е. есть переменная varchar2 ее значение, например, '2+(4-2)*3'
надо вычислить это математическое выражение и записать в переменную средствами SQL

заранее благодарен

P.S.: есть способ через execute immediate, но тогда надо работать через временную таблицу, может есть другой вариант?
17 авг 05, 13:02    [1794155]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли способ посчитать математическое выражение записанное в строковом виде  [new]
alex-ls
Member

Откуда: Иркутская обл - Пенза - Москва
Сообщений: 6912
DECLARE
 T NUMBER;
begin
  EXECUTE IMMEDIATE 'SELECT 2*3-4 FROM DUAL' INTO T;
  DBMS_OUTPUT.PUT_LINE(T);
end;
17 авг 05, 13:10    [1794222]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли способ посчитать математическое выражение записанное в строковом виде  [new]
VasyakinM
Member

Откуда: Москва
Сообщений: 371
А на черта временную таблицу, а просто select из dual ?
17 авг 05, 13:14    [1794258]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли способ посчитать математическое выражение записанное в строковом виде  [new]
alex-ls
Member

Откуда: Иркутская обл - Пенза - Москва
Сообщений: 6912
VasyakinM
А на черта временную таблицу, а просто select из dual ?

поэтому и написал пример!
17 авг 05, 13:19    [1794311]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли способ посчитать математическое выражение записанное в строковом виде  [new]
Oldwalkman
Member

Откуда: Moscow
Сообщений: 36
Как вариант -- написать собственный парсер. Но стоит ли это того -- код получится немерянный, а если уйти на конечные автоматы, то более чем немерянный. ;)

Легче эту заботу отдать самому ораклу -- он сделает все правильно.

Одно НО -- надо исключить возможность выполнить команду из этого поля! Ведь по своей сути, просто отдав на исполнение это поле мы делаем security hole.

Значит надо:
1. скармливать поле только через биндинг,
2. вычистить поле от лишних знаков оставив только разрешенное ( в примере -- '+-()*/1234567890')

execute immediate 'select translate(:1,'+-()*/1234567890x'||translate(:2,'x+-()*/1234567890','x'),'+-()*/1234567890') into :3 from dual' using field, field returning into result;

SY,
=Maximo
17 авг 05, 13:20    [1794322]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли способ посчитать математическое выражение записанное в строковом виде  [new]
Oldwalkman
Member

Откуда: Moscow
Сообщений: 36
Извините за ошибку -- правильнее будет "немерЕнный" :)

SY,
=Maximo
17 авг 05, 13:21    [1794337]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли способ посчитать математическое выражение записанное в строковом виде  [new]
Stax.
Guest
VasyakinM
А на черта временную таблицу, а просто select из dual ?

а зачем таблицу
declare
 m number;
 f varchar2(100) :='2+(4-2)*3';
begin
 execute immediate
 'begin
   :m:='||f||';
  end;' using out m;
 dbms_output.put_line('Значение '||f||'='||m);
end;
SQL> /
Значение 2+(4-2)*3=8

PL/SQL procedure successfully completed.
17 авг 05, 13:33    [1794449]     Ответить | Цитировать Сообщить модератору
Между сообщениями интервал более 1 года.
 Re: Есть ли способ посчитать математическое выражение записанное в строковом виде  [new]
Nikola18
Member

Откуда:
Сообщений: 55
А как это (посчитать математическое выражение записанное в строковом виде) сделать во время запроса, т.е. из Selectа?
6 мар 08, 03:03    [5377075]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли способ посчитать математическое выражение записанное в строковом виде  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18351
Nikola18
А как это (посчитать математическое выражение записанное в строковом виде) сделать во время запроса, т.е. из Selectа?

https://www.sql.ru/forum/actualthread.aspx?bid=3&tid=297999&pg=-1
6 мар 08, 03:11    [5377077]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли способ посчитать математическое выражение записанное в строковом виде  [new]
Elic
Member

Откуда:
Сообщений: 29979
Nikola18
А как это (посчитать математическое выражение записанное в строковом виде) сделать во время запроса, т.е. из Selectа?
STFF function Eval
6 мар 08, 08:55    [5377270]     Ответить | Цитировать Сообщить модератору
 Re: Есть ли способ посчитать математическое выражение записанное в строковом виде  [new]
==Tims==
Member [заблокирован]

Откуда: Гена Евтушенко
Сообщений: 343
Elic
Nikola18
А как это (посчитать математическое выражение записанное в строковом виде) сделать во время запроса, т.е. из Selectа?
STFF function Eval

ну и + неплохо было-бы добавить обработку исключения в функцию))
6 мар 08, 09:52    [5377540]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить