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

  FOR
  execute statement
  'select w.Dashcode, w.WareNum, l.Pricecode
    from wares w join pricelevel l on (w.Printit = l.Pricecode)
    where 1=1 '||where_str
  INTO
    :Dashcode, :WN, :Pricecode
  DO
  begin
    FOR
    select n.Num, g.Price, g.Region_Id
      from Get_Wares_Prices(:WN, :Priceout_Curr) g
           left join StoreNames n on (g.REGION_ID = n.Pricecolumn_Int)
      where g.Price is not null
            and (n.Closed=0 or n.Closed is null)
    INTO
      :Storenum, :Price, :Region_Id
    DO
    begin
      if (:Region_Id <> :Old_Region_Id) then
      -- ищем, только если код сменился
        select f.PRICENAME, f.Priceid from Pricetypes_Full f /* <<<< */
          where f.Priceid = :Region_Id
          into :Region_Name, :Old_Region_Id;
      --end if
      suspend;
    end
  end

Проблема в том, что если верхний запрос возвращает слишком много записей, то в конце концов возникает нехватка памяти на вызове хранимки Pricetypes_Full, и процесс fb_inet_server занимает всю доступную память.
Commit приводит потребление памяти в норму.

Что происходит и как это побороть?

Ответить