Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.08.07;
Скачать: CL | DM;

Вниз

SELECT из ХП   Найти похожие ветки 

 
TohaNik ©   (2005-06-30 15:53) [0]

Возникла непонятная для меня ситуация.
При вызове некой ХП с одним входным параметром из отладчика IBexpert-а возвращается корректное кол-во записей, а при селективном запросе из SQL - редактора того-же IBexpert-а или из
Delphi(FibDataSet) возвращаются не все записи.
Если кто сталкивался, в чем проблема?


 
Johnmen ©   (2005-06-30 15:55) [1]

Исходные тексты ? Вызовы ?


 
TohaNik ©   (2005-06-30 16:04) [2]

Вызов-
select MD_ID
from GET_PARENT_MD_ID(632)-- возвращает подмножество записей
вызова из отладчика с этим же параметром.
Ну а текст процедуры если не лень смотреть...
CREATE PROCEDURE GET_PARENT_MD_ID (
   PARRENT_MD_ID INTEGER)
RETURNS (
   MD_ID INTEGER,
   MD_NUM VARCHAR(15),
   CURRENT_MD_ID INTEGER,
   QUAN NUMERIC(15,3),
   REST NUMERIC(15,3),
   MD_FROM INTEGER,
   MD_TO INTEGER,
   CHARGE NUMERIC(15,3),
   FROM_NAME VARCHAR(32),
   TO_NAME VARCHAR(32))
AS
DECLARE VARIABLE TMP_MD_ID INTEGER;
begin
 md_id = parrent_md_id;
 while (not (parrent_md_id is null)) do
   begin
     select move_details.p_md_id
     from move_details
     where (move_details.md_id = :md_id)
     into :parrent_md_id;
     if (not (parrent_md_id is null)) then md_id =   parrent_md_id;
   end
   if (parrent_md_id is null) then
     begin
       tmp_md_id = md_id;
       while ((md_id > parrent_md_id) or (parrent_md_id is null))  do
         begin
           parrent_md_id = md_id;
           for select move_details.md_id, move_details.p_md_id, move_details.md_num,
                      move_details.md_quan, move_details.md_rest,
                      move_details.p_from, move_details.p_to
           from move_details
           where (move_details.p_md_id = :md_id) or
                 (move_details.md_id = :tmp_md_id)
           into :md_id, :current_md_id, :md_num, :quan, :rest, :md_from, :md_to
           do
             begin
               if (tmp_md_id > 0) then tmp_md_id = 0;
               charge = (quan - rest);
               select points.p_name
               from points
               where (points.p_id = :md_from)
               into :from_name;
               select points.p_name
               from points
               where (points.p_id = :md_to)
               into :to_name;
               suspend;
             end
         end
     end
end


 
Johnmen ©   (2005-06-30 16:11) [3]

>При вызове некой ХП с одним входным параметром из отладчика IBexpert-а

>селективном запросе из SQL - редактора того-же IBexpert-а или из Delphi(FibDataSet)

Исх. текст вызова того и другого ?


 
TohaNik ©   (2005-06-30 16:21) [4]

Johnmen ©   (30.06.05 16:11) [3]
Я что чего-то не понимаю? :)

select MD_ID, MD_NUM, CURRENT_MD_ID, QUAN, REST, MD_FROM, MD_TO, CHARGE,
      FROM_NAME, TO_NAME
from GET_PARENT_MD_ID(?PARRENT_MD_ID)


 
TohaNik ©   (2005-06-30 16:38) [5]

Закономерность нашел, вот при таких записях (при любом входном параметре из 1-го столбца) из отладчика suspend срабатывает 5 раз, а при селекте возвращаются первые три записи, если третью запись удалить в обеих случаях возвращаются 4 записи.

620 null
630 620
632 630
633 630
635 633


 
Johnmen ©   (2005-06-30 16:38) [6]

>TohaNik ©   (30.06.05 16:21) [4]

Все мы чего-то не понимаем...:)
Приводи текст вызова
>При вызове некой ХП с одним входным параметром из отладчика IBexpert-а
и то, как определил, что "возвращаются не все записи".


 
Johnmen ©   (2005-06-30 16:42) [7]

...да, и ещё, перестань манипулировать значением входного параметра в процедуре в части его изменения...


 
Zacho ©   (2005-06-30 16:45) [8]

TohaNik ©   (30.06.05 16:21) [4]
Я что чего-то не понимаю? :)


Не понимаешь :) Того, что отладчик IBExpert эмулириует  сервер. Так что не обращай на него внимание. Неправильно он работает. Иногда. А иногда - правильно. Но  редко.


 
TohaNik ©   (2005-06-30 17:05) [9]

Johnmen ©   (30.06.05 16:38) [6]
Так какбудто привел...
Ща перестану.

Zacho ©   (30.06.05 16:45) [8]
Бубен мне это тоже подсказывает:)


 
TohaNik ©   (2005-06-30 17:42) [10]

Ну ладно допустим отладчик кривой, но всетаки имеем записи
md_id            parrent_md_id
620              null
630              620
632              630
633              630
635              633
--
на выходе хочу получить копию т.е.
:md_id,          :current_md_id
620              null
630              620
632              630
633              630
635              633
---
а получаю
:md_id,          :current_md_id
620              null
630              620
632              630

на входе в этот блок md_id = 620; parrent_md_id is null
if (parrent_md_id is null) then
begin
 tmp_md_id = md_id;  
 while ((md_id > parrent_md_id) or (parrent_md_id is null)) do
  begin
   parrent_md_id = md_id;
   for select md_id, p_md_id
   from move_details
   where (p_md_id = :md_id) or
         (md_id = :tmp_md_id)
   into :md_id, :current_md_id,
   do
     begin
       if (tmp_md_id > 0) then tmp_md_id = 0;
       suspend;
     end
  end
end

Где туплю?


 
Johnmen ©   (2005-06-30 17:47) [11]

>TohaNik ©   (30.06.05 17:42) [10]

В процедуре разбираться лень, честно скажу.
Но косяк виден - из двух записей
632              630
633              630
идём по первой, а вторую как-бы и не рассматриваем, цепочка по второй не идет...


 
TohaNik ©   (2005-06-30 18:10) [12]

Да это называется поплющило :)))

я уже переделал классически через рекурсию, просто пришлось делать две процедуры чтоб в первом блоке не зациклилось
когда корневую запись нашли...

А всеравно плющит.



Страницы: 1 вся ветка

Текущий архив: 2005.08.07;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.049 c
14-1121389485
Джо
2005-07-15 05:04
2005.08.07
To whom it may concern.


4-1118079752
NikNet
2005-06-06 21:42
2005.08.07
Как вызвать приревание в DELPHI из RING3 (Третего кольца)


4-1118417059
Earth
2005-06-10 19:24
2005.08.07
Перезагрузка, выключение, выход из системы.


14-1121309347
Магнум
2005-07-14 06:49
2005.08.07
Windows Media Player и WMV


11-1105004896
Pushkin
2005-01-06 12:48
2005.08.07
Длина текста в пикселях