Форум: "Базы";
Текущий архив: 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