Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2005.08.07;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.48 MB
Время: 0.034 c
1-1121715510
JohnJ
2005-07-18 23:38
2005.08.07
Поиск компонентов


1-1121678132
granni
2005-07-18 13:15
2005.08.07
создание ресурсного файла


1-1121867379
Dust
2005-07-20 17:49
2005.08.07
Опять вопрос про качественный код:


3-1119761090
funman
2005-06-26 08:44
2005.08.07
Файлы *.qr2 , чем открыть редактировать?


14-1121298969
Михаил(Киров)
2005-07-14 03:56
2005.08.07
Администрирование компьютерных клубов





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский