ошибка при выполнении ХП

Brother_2005
Дата: 13.10.2005 14:31:09
Здравствуйте!

При выполнении следующего кода хр. процедуры :

for
     select
          P."Id",
          P."Description",
          P."Name",
          PG."Name" as "GroupName",
          P."Use",
          P."Unit",
          P."Last_Supplier",
          S."Name",
          PG."Id"
     from "Products" P
          left join "Product_Groups" PG on P."Id_Group" = PG."Id"
          left join "Suppliers" S on P."Last_Supplier" = S."Id"
     into :"Id_Product",
          :"Description",
          :"Name",
          :"GroupName",
          :"Use",
          :"Unit",
          :"Id_Last_Supplier",
          :"Name_Last_Supplier",
          :"Id_Group"
  do
     update "Analysis_Profits_By_Products"
     set "Description" = :"Description",
         "Name" = :"Name",
         "GroupName" = :"GroupName",
         "Use" = :"Use",
         "Unit" = :"Unit",
         "Id_Last_Supplier" = :"Id_Last_Supplier",
         "Name_Last_Supplier" = :"Name_Last_Supplier",
         "Id_Group" = :"Id_Group"
     where "User_Name" = current_user and
           "Id_Product" = :"Id_Product";

вываливается ошибка
"Arithmetic overflow or division by zero has occurred.
arithmetic exception, numeric overflow, or string truncation."

Не пойму в чем дело? Кто нибудь может подсказать?
Благодарен заранее
Gold
Дата: 13.10.2005 14:34:03
Наверное ты пытаешься запихнуть в поле или переменную слишком длинную строку (длиннее чем объявлено)
Мимопроходящий
Дата: 13.10.2005 14:34:22

Привет, Brother_2005!
Ты пишешь:

Brother_2005
B> При выполнении следующего кода хр. процедуры :
[Sorry, skipped]
B> вываливается ошибка
B> "Arithmetic overflow or division by zero has occurred.
B> arithmetic exception, numeric overflow, or string truncation."
B> Не пойму в чем дело? Кто нибудь может подсказать?
Не-а.
Телепаты в курилке.
Ты ж не привёл полный текст процедуры.
И DDL таблиц тоже.
А то, что у тебя где-то что-то переполняется, тебе сервер сказал...

--
With best regards, Мимопроходящий.

Posted via ActualForum NNTP Server 1.3

Brother_2005
Дата: 13.10.2005 14:41:41
Мимопроходящий

Привет, Brother_2005!
Ты пишешь:

Brother_2005
B> При выполнении следующего кода хр. процедуры :
[Sorry, skipped]
B> вываливается ошибка
B> "Arithmetic overflow or division by zero has occurred.
B> arithmetic exception, numeric overflow, or string truncation."
B> Не пойму в чем дело? Кто нибудь может подсказать?
Не-а.
Телепаты в курилке.
Ты ж не привёл полный текст процедуры.
И DDL таблиц тоже.
А то, что у тебя где-то что-то переполняется, тебе сервер сказал...

--
With best regards, Мимопроходящий.



Пусть телепаты там и остаются а я приведу полный код :

CREATE PROCEDURE "Analysis_of_Profit_grouped" 
AS
DECLARE VARIABLE "Id_Product" INTEGER;
DECLARE VARIABLE "Description" VARCHAR(90) CHARACTER SET WIN1251;
DECLARE VARIABLE "Name" VARCHAR(50) CHARACTER SET WIN1251;
DECLARE VARIABLE "GroupName" VARCHAR(50) CHARACTER SET WIN1251;
DECLARE VARIABLE "Use" VARCHAR(90) CHARACTER SET WIN1251;
DECLARE VARIABLE "Unit" VARCHAR(10) CHARACTER SET WIN1251;
DECLARE VARIABLE "Id_Last_Supplier" INTEGER;
DECLARE VARIABLE "Name_Last_Supplier" VARCHAR(150) CHARACTER SET WIN1251;
DECLARE VARIABLE "Count_Monthes" INTEGER;
DECLARE VARIABLE "Price_for_group_A" NUMERIC(15,2); /* Ãðàíè÷íàÿ öåíà äëÿ ãðóïïû À */
DECLARE VARIABLE "Price_for_group_C" NUMERIC(15,2); /* Ãðàíè÷íàÿ öåíà äëÿ ãðóïïû C */
DECLARE VARIABLE "Quantity_for_group_X" INTEGER; /* Ãðàíè÷íîå êîëè÷åñòâî äëÿ ãðóïïû X */
DECLARE VARIABLE "Quantity_for_group_Z" INTEGER; /* Ãðàíè÷íîå êîëè÷åñòâî äëÿ ãðóïïû Z */
DECLARE VARIABLE "Id_Group" INTEGER;
begin
   /* Î÷èùàåì äàííûå */
   Delete from "Analysis_Profits_By_Products" where "User_Name" = current_user;

   /* Âñòàâëÿåì îáíîâëåííûå äàííûå */
   Insert into "Analysis_Profits_By_Products"
      ("Id_Product",
       "Total_Profit", "Total_Quantity",
       "Last_Year_Profit", "Last_Year_Quantity",
       "This_Year_Profit","This_Year_Quantity",
       "Q", "RQ", "PQ",
       "Price",
       "User_Name", "Suma")
      select
       A."Id_Product",
       A."Total_Profit",
       A."Total_Quantity",
       A."Last_Year_Profit",
       A."Last_Year_Quantity",
       A."This_Year_Profit",
       A."This_Year_Quantity",
       (select "Q" from "Branch_Balances_Total"(A."Id_Product") ) as "Q",
       (select "RQ" from "Branch_Balances_Total"(A."Id_Product") ) as "RQ",
       (select "PQ" from "Branch_Balances_Total"(A."Id_Product") ) as "PQ",
       RI."Price",
       current_user,
       RI."Price" * A."Total_Quantity"
      from "Analysis_of_Profit_group" A
           join "Balance" B on A."Id_Product" = B."Id_Product" and B."Id_Branch" = 1
           join "Revaluation_Items" RI on B."Id_Revaluation" = RI."Id_Revaluation"
                                      and B."Id_Product" = RI."Id_Product";

  /* Çàïîëíÿåì äîïîëíèòåëüíûå ïîëÿ, õàðàêòåðèçóþùèå ïîçèöèþ : */
  for
     select
          P."Id",
          P."Description",
          P."Name",
          PG."Name" as "GroupName",
          P."Use",
          P."Unit",
          P."Last_Supplier",
          S."Name",
          PG."Id"
     from "Products" P
          left join "Product_Groups" PG on P."Id_Group" = PG."Id"
          left join "Suppliers" S on P."Last_Supplier" = S."Id"
     into :"Id_Product",
          :"Description",
          :"Name",
          :"GroupName",
          :"Use",
          :"Unit",
          :"Id_Last_Supplier",
          :"Name_Last_Supplier",
          :"Id_Group"
  do
     update "Analysis_Profits_By_Products"
     set "Description" = :"Description",
         "Name" = :"Name",
         "GroupName" = :"GroupName",
         "Use" = :"Use",
         "Unit" = :"Unit",
         "Id_Last_Supplier" = :"Id_Last_Supplier",
         "Name_Last_Supplier" = :"Name_Last_Supplier",
         "Id_Group" = :"Id_Group"
     where "User_Name" = current_user and
           "Id_Product" = :"Id_Product";

  /* Äëÿ êàæäîé ïîçèöèè òîâàðîâ óñòàíàâëèâàåì ãðóïïó A, B èëè C, à òàêæå X, Y èëè Z */

   -- Îïðåäåëÿåì êîëè÷åñòâî ìåñÿöåâ :
  "Count_Monthes" = DaysBetween('01.01.2004', current_date)/30;
   -- Âûáèðàåì êðèòåðèè äåëåíèÿ íà ãðóïïû :
  select "Product_Group_A" from "__System" into :"Price_for_group_A";
  select "Product_Group_C" from "__System" into :"Price_for_group_C";
  select "Product_Group_X" from "__System" into :"Quantity_for_group_X";
  select "Product_Group_Z" from "__System" into :"Quantity_for_group_Z";
  "Quantity_for_group_X" = "Quantity_for_group_X" * "Count_Monthes";
  "Quantity_for_group_Z" = "Quantity_for_group_Z" * "Count_Monthes";

  /* Äëÿ êàæäîé ïîçèöèè â ñïðàâî÷íèêå òîâàðîâ óñòàíàâëèâàåì ãðóïïó A, B èëè C */
  update "Analysis_Profits_By_Products" AN set AN."ABC_Group" = 1
     where AN."Price" >= :"Price_for_group_A"
       and AN."Price" > 0
       and AN."User_Name" = current_user;

  update "Analysis_Profits_By_Products" AN set AN."ABC_Group" = 2
     where AN."Price" < :"Price_for_group_A"
       and AN."Price" > :"Price_for_group_C"
       and AN."Price" > 0
       and AN."User_Name" = current_user;

  update "Analysis_Profits_By_Products" AN set AN."ABC_Group" = 3
     where AN."Price" <= :"Price_for_group_C"
       and AN."Price" > 0
       and AN."User_Name" = current_user;

  /* Äëÿ êàæäîé ïîçèöèè â ñïðàâî÷íèêå òîâàðîâ óñòàíàâëèâàåì ãðóïïó X, Y èëè Z */
  update "Analysis_Profits_By_Products" AN set AN."XYZ_Group" = 1
     where AN."Total_Quantity" >= :"Quantity_for_group_X"
       and AN."User_Name" = current_user;

  update "Analysis_Profits_By_Products" AN set AN."XYZ_Group" = 2
     where AN."Total_Quantity" < :"Quantity_for_group_X"
       and AN."Total_Quantity" > :"Quantity_for_group_Z"
       and AN."User_Name" = current_user;

  update "Analysis_Profits_By_Products" AN set AN."XYZ_Group" = 3
     where (AN."Total_Quantity" <= :"Quantity_for_group_Z"
        or  AN."Total_Quantity" is null)
       and  AN."User_Name" = current_user;
end
kdv
Дата: 13.10.2005 14:42:07
я не пойму, это все один и тот же человек пишет, или нет.
from "Products" P
          left join "Product_Groups" PG on P."Id_Group" = PG."Id"
          left join "Suppliers" S on P."Last_Supplier" = S."Id"

то есть, есть продукты
а) которые НЕ включены ни в одну группу, и
б) которые НЕ принадлежат ни одному поставщику

такое бывает в это базе? Если нет - откуда тут взялись left join?
fraks
Дата: 13.10.2005 14:53:50
kdv

то есть, есть продукты
а) которые НЕ включены ни в одну группу, и
б) которые НЕ принадлежат ни одному поставщику

такое бывает в это базе? Если нет - откуда тут взялись left join?


Даже если такого и не бывает - смысл использовать left join может быть. Это вместо ручного планирования - оптимизатору практически прямо говорится как джойнить. Я такое употребляю постоянно, в основном для приджойнивания справочников, бывают исключения - когда inner работает лучше но у меня таких ситуаций почти не бывает.
kdv
Дата: 13.10.2005 15:02:00
ты только мне не рассказывай об этом, ладно? :-)
и на своих курсах я примеры таких вещей показываю. Вопрос в другом - тут регулярно возникает народ с ТАКИМИ left join, которые похоже, лезут из какого-то "автоматического" построителя запросов. Как начинаешь спрашивать - так или прячутся, или тут же left убирают...
Brother_2005
Дата: 13.10.2005 15:02:41
fraks
kdv

то есть, есть продукты
а) которые НЕ включены ни в одну группу, и
б) которые НЕ принадлежат ни одному поставщику

такое бывает в это базе? Если нет - откуда тут взялись left join?


Даже если такого и не бывает - смысл использовать left join может быть. Это вместо ручного планирования - оптимизатору практически прямо говорится как джойнить. Я такое употребляю постоянно, в основном для приджойнивания справочников, бывают исключения - когда inner работает лучше но у меня таких ситуаций почти не бывает.


вот именно для справочников такое и было сделано
Brother_2005
Дата: 13.10.2005 15:12:51
kdv

то есть, есть продукты
а) которые НЕ включены ни в одну группу, и
б) которые НЕ принадлежат ни одному поставщику

такое бывает в это базе? Если нет - откуда тут взялись left join?


хорошо, напиши так как ты видишь этот запрос. напиши ПРАВИЛЬНО
Pop
Дата: 14.10.2005 06:56:04
А может проблема, как обычно, в том, что в базе/строке соединения кодировка не указана/указана неверно?