Fb 2.1 - ограничение....

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
SerjP
Сообщения: 24
Зарегистрирован: 09 июл 2008, 15:01

Fb 2.1 - ограничение....

Сообщение SerjP » 15 янв 2009, 15:45

Имеются расчетные задачи, расчеты задаются формулами(строка), переменные в которых описываются тоже формулами.
Формулы из Oracle, там имеются языковые конструкции типа "case", некоторые функции и т.д. Расчеты идут в SP.
На первом этапе была следующая реализация - из формулы выбирались "переменные", для них вызывалась процедура расчета(которая брала формулу для этой "переменной", вызывала процедуру расчета и сохраняла результат) и результат подставлялся вместо "переменные" - в конце вызывался execute statement - и получался результат расчета.
В связи с наличием case в формулах - возникла необходимость считать не все "переменные" а лишь "нужные". Т.е вместо расчета "переменной" и подстановки результата - подставлялась вызов процедуры расчета "переменной"...
И тут получаю большую проблему -
invalid request BLR at offset 1537
context already in use (BLR error)

Почитал в инете - стало грустно..... неужели все так плохо....
Может попробовать 2.5 (где ее взять в сомпилированном виде?)

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Re: Fb 2.1 - ограничение....

Сообщение WildSery » 15 янв 2009, 15:54

Не догнал.

Tonal
Сообщения: 104
Зарегистрирован: 30 сен 2007, 13:42

Re: Fb 2.1 - ограничение....

Сообщение Tonal » 16 янв 2009, 08:56

SerjP писал(а):Почитал в инете - стало грустно..... неужели все так плохо....
Может попробовать 2.5 (где ее взять в сомпилированном виде?)
Может перестать жрать кактус и подцепить нормальный интерпретатор через UDF-ку? :)

SerjP
Сообщения: 24
Зарегистрирован: 09 июл 2008, 15:01

Re: Fb 2.1 - ограничение....

Сообщение SerjP » 16 янв 2009, 09:10

Попробую объяснить.. :)
Имеется задача - расчет автостраховок. Она реализована на Oracle(там пишутся "расчетные" формулы), я пытаюсь "воспроизвести" это в виде "автономного" клиента. Формулы расчетов загружаются из Oracle и "оптимизируются" под FB - меняются функции, некоторые конструкци....
Формулы хранятся в виде строк, там присутсвуют "данные" трех типов - числа, даты, строки.
Пример - расчет КАСКО(это Oracle "синтаксис")
case
when INSTR(:tp_INDrisk,{RiskSteal})>0 then :Prem_Ugon
else 0
end
+
case
when :FR_INDrisk >0 then :Prem_Usherb
else 0
end
В формуле имеются константы({RiskSteal} - подставляются из справочников) и "параметры" - расчитываемые по другим формулам
Пример 2(это Oracle "синтаксис")
case
when :K_Tariff_Group = {exclusive} then
0.0455/
case
when :FR_AgeCarM<=1 then (1-:FR_AgeCarM) + 0.8*:FR_AgeCarM
else 0.8*Power(0.9, Trunc(:FR_AgeCarM)-1)*(1+Trunc(:FR_AgeCarM)-:FR_AgeCarM) + 0.8*Power(0.9,Trunc(:FR_AgeCarM)) * (:FR_AgeCarM- trunc(:FR_AgeCarM))
end
else
case
when :Tbd_kasco_sp > 0 then :Tbd_kasco_sp
else
case :K_Domestic
when 0 then
(:tp_InsCost * ((:Kvozr * :FR_AgeCarM + :Kkons)/Least(:Sv_am, Greatest(:Sn_am,:tp_InsCost)) + :Klim/100) * :K_ush_avar/100 * 1.0273 + 1438.6850 + 1697.0600 * :K_ka_avar/100)/((1- 0.0762 - :Kkom/100 - :Kprib/100) * :tp_InsCost)
when 1 then
(:tp_InsCost * ((:Kvozr * :FR_AgeCarM + :Kkons)/Least(:Sv_am, Greatest(:Sn_am,:tp_InsCost)) + :Klim/100) * :K_ush_avar/100 * 1.0273 * 1.15 * Power(0.85, Least(3, :FR_AgeCarM)) + 1438.6850 + 1697.0600 * :K_ka_avar/100)/((1 - 0.0762 - :Kkom/100 - :Kprib/100) * :tp_InsCost)
end
end
end
Для расчета существует ряд процедур - "Расчет скрипта", "Расчет параметра"(которая ищет значение параметра в таблице параметров, если его нет - то смотри, как его посчитать - через формулу(запускается "Расчет скрипта") или через поиск по "дереву", после получения результат заносится в табл. параметров).
На первом этапе, при "расчете скрипта" из формулы выделялись параметры, для них запускаласть процедура "расчет параметра" и получившийся результат подставлялся в формулу вместо параметра, в конце производился расчет через execute statement
Но возникли следующие проблемы - т.к. в формулах присутсвуют конструкции case - то для формулы нужно считать не все "параметры", а только "нужные"("лишние" параметры могут не считаться(давать ошибку при попытке расчета) на заданных исходных данных - пример ветки "спец программ страховки" для определенных моделей транспорта).
Было решено сделать вместо расчета "параметра" и подстановки результата в формулу, подставлять "вызов" процедуры расчета(так сейчас реализовано в Oracle)
- т.е в формуле вместо ":Prem_Ugon" -ставится "(select результат from "расчет параметра"(список параметров))"
и для получившейся строки вызывается execute statement
Вариант "первого этапа" - работал нормально, а вот на новой реализации,я и получаю эту ошибку... Причем в "первом" варианте, происходила подстановка вызова расчета на "первом уровне формулы"(на последующих "уровнях" подставлялся результат расчета) - и все работало...
Вот собственно вроде и все.
(А где взять 2.5 - хочу попробовать :))

SerjP
Сообщения: 24
Зарегистрирован: 09 июл 2008, 15:01

Re: Fb 2.1 - ограничение....

Сообщение SerjP » 16 янв 2009, 09:15

Tonal писал(а):
SerjP писал(а):Почитал в инете - стало грустно..... неужели все так плохо....
Может попробовать 2.5 (где ее взять в сомпилированном виде?)
Может перестать жрать кактус и подцепить нормальный интерпретатор через UDF-ку? :)
И из udf - цеплятся к базе для загрузки/выгрузки данных? [-X - их количество различно для разных расчетов, а значения некоторых "промежуточных" параметров выводятся в "результат расчета"(зависит от данных и типа расчета)

SerjP
Сообщения: 24
Зарегистрирован: 09 июл 2008, 15:01

Re: Fb 2.1 - ограничение....

Сообщение SerjP » 16 янв 2009, 13:25

Вроде нашел проблему :) она оказалась в приведенном примере 2 :)
там есть конструкция

Код: Выделить всё

case x
  when 0 then ….
  when 1 then …
а в fb проходит
case
when x=0 then ….
when x=1 then …

WildSery
Заслуженный разработчик
Сообщения: 1738
Зарегистрирован: 05 июн 2006, 16:19

Re: Fb 2.1 - ограничение....

Сообщение WildSery » 16 янв 2009, 13:57

Оба варианта записи для CASE являются правильными. В стандарте SQL, не только в FB.

SerjP
Сообщения: 24
Зарегистрирован: 09 июл 2008, 15:01

Re: Fb 2.1 - ограничение....

Сообщение SerjP » 16 янв 2009, 14:03

однако на FB 2.1

Код: Выделить всё

select
 case (select first 1 xxx from ууу)
 when 1 then 5
 when 0 then 6
end
 from rdb$database
не работает, а

Код: Выделить всё

select
 case 
 when (select first 1 xxx from ууу)=1 then 5
 when (select first 1 xxx from ууу)=2 then 6
end
работает

dimitr
Разработчик Firebird
Сообщения: 888
Зарегистрирован: 26 окт 2004, 16:20

Re: Fb 2.1 - ограничение....

Сообщение dimitr » 17 янв 2009, 00:09

это баг, исправлен в 2.5

Ответить