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

Вниз

Хранримая процедура   Найти похожие ветки 

 
starik30   (2004-05-06 10:48) [0]

Hi, All !

Написал хранимую процедуру, а она работает не правильно... может кто подскажет где туплю (уже все перепробывал  включая backup/restore)...

CREATE PROCEDURE SEARCH_DUPLICATE
RETURNS (
   SESSION_NUMBER1 CHAR (4),
   SEQUENCE_NUMBER1 CHAR (6),
   CORR_SESSION CHAR (4),
   CORR_SEQUENCE CHAR (6),
   ITSELF_MSG VARCHAR (10000))
AS
BEGIN
 for select session_number ,sequence_number, corr_session_num, corr_sequence_num, itself_message  from txt_message where (in_out="O")
 into :session_number1, :sequence_number1, :corr_session, :corr_sequence,  :itself_msg
 do
 begin
   for select session_number , sequence_number  FROM txt_message WHERE  (sequence_number=:corr_sequence) and (in_out="I")
   into :session_number1, :sequence_number1
   do
   begin
    if (session_number1 is not null) then session_number1="-001";
         end
   if (session_number1 is null) then suspend;
   session_number1=null;
 end

END


Использую EMS QuickDesk 2.3.0.1 Использую пошаговую отладку :
при первом проходу дает верный результат, потом почему-то не срабатывает (т.е. не присваиваются значения для session_number1 во втором for select).Да и еще когда просто запускаешь на выполнение процедуру (F9) то выскакивает ошибка Parameter is incorrect. (В SQL editor-е через select  работает нормально кроме результатов ...).

Заранее благодарен.
Юра


 
Соловьев ©   (2004-05-06 10:59) [1]


> Использую EMS QuickDesk 2.3.0.1

http://www.ibexpert.com/rus/ibe_sfx.exe - лучшая для ИБ и клонов, ИМХО конечно :)


>  SESSION_NUMBER1 CHAR (4),
>    SEQUENCE_NUMBER1 CHAR (6),
>    CORR_SESSION CHAR (4),
>    CORR_SEQUENCE CHAR (6),
>    ITSELF_MSG VARCHAR (10000))

точно совпадают типы полей и параметров?


 
Соловьев ©   (2004-05-06 11:01) [2]


> ION_NUMBER1 CHAR (4),
>    SEQUENCE_NUMBER1 CHAR (6),
>    CORR_SESSION CHAR (4),
>    CORR_SEQUENCE CHAR (6),

зачем ? может все-таки VARCHAR?


 
starik30   (2004-05-06 11:21) [3]

да, типы полей совпадают (сейчас поставил varchar в процедуре в таблице оставил char ... результат одинаковый...) при отладке показывает что не присваиваются значения полученные из второго select-а ... непонятно вроде 2 строчки ... а гемору...


 
Соловьев ©   (2004-05-06 11:24) [4]


> (sequence_number=:corr_sequence) and (in_out="I")

вместо = используй LIKE , строковые только так сравниваются и приведи все к VARCHAR, потому как CHAR дополнчется пробелами если длина строки меньше указаного количества символов


 
Курдль ©   (2004-05-06 11:26) [5]


> вместо = используй LIKE , строковые только так сравниваются

Это с какого перепугу?


 
Johnmen ©   (2004-05-06 11:31) [6]

>starik30  

А зачем вообще два вложенных цикла по курсору из одной и той же таблицы ?
Достаточно одного. Но с соединением таблицы самой с собой...


 
Соловьев ©   (2004-05-06 11:32) [7]


> Курдль ©   (06.05.04 11:26) [5]

с такого


 
starik30   (2004-05-06 11:59) [8]

>Johnmen [6] Надо подумать , может и можно просто процедурой на первый взляд казалось проще , а теперь уже и сам факт такого странного поведения

>Соловьев [4] Все привел к varchar (все в таблице и в процедуре )- результат тот же ... может правда уже надо сделать backup/restore ... не понятно почему такое поведение ... если бы условие сравнение (мое первоначальное было  всегда False) ну тогда бы возвращала бы null в переменные , а то ведь значения после первого for select не меняются ...


 
starik30   (2004-05-06 12:02) [9]

попробовал с like таже песня только запрос выполняется дольше ... -(((


 
Соловьев ©   (2004-05-06 12:07) [10]


> starik30   (06.05.04 12:02) [9]

почему советом
> Johnmen ©   (06.05.04 11:31) [6]

не воспользуешся?


 
starik30   (2004-05-06 12:21) [11]

наверное прийдется но сам факт такого поведения ... И что делать когда действительно по другому никак  нельзя будет сделать ?


 
starik30   (2004-05-06 14:58) [12]

> Johnmen ©   (06.05.04 11:31) [6]

Я попробовал изобразить запрос через join но что-то у меня не получается

select b.* from txt_message a inner join txt_message b on a.sequence_number!=b.corr_sequence_num where (b.in_out="O") and a.in_out="I"


 
Johnmen ©   (2004-05-06 15:02) [13]

>starik30   (06.05.04 14:58) [12]
>не получается

В смысле ?

И что значит a.sequence_number!=b.corr_sequence_num ?


 
starik30   (2004-05-06 15:09) [14]

мне необходимо сравнить sequence_number с corr_sequence_num и выбрать только те которых нет в sequence_number ...


 
Johnmen ©   (2004-05-06 15:26) [15]

SELECT * FROM txt_message A
RIGHT JOIN txt_message B ON A.session_number=B.corr_session_num
WHERE (A.session_number1 IS NULL) AND
     (B.in_out="O") AND
     (A.in_out="I")


 
starik30   (2004-05-06 16:30) [16]

м-да все равно не правильно получается ... потому что ли ничего не выбирает (с right) или выбирает только те которые есть (c left) ... кажется с процедурой было бы проще ....


 
starik30   (2004-05-06 16:38) [17]

> Johnmen
извиняюся ... с left join все получилось ...

Спасибо ...


 
Mike Kouzmine ©   (2004-05-06 21:03) [18]

Соловьев ©   (06.05.04 11:24) [4] Прошу прощения, сам недавно работаю, но почему строковые сравниваются только с Like?



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

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

Наверх




Память: 0.51 MB
Время: 0.027 c
1-1084606165
Alek_1
2004-05-15 11:29
2004.05.30
Форма в Dll


14-1084345964
Kerk
2004-05-12 11:12
2004.05.30
Команда


3-1083740584
wild_arg
2004-05-05 11:03
2004.05.30
Транзакции между двумя серверами БД


3-1083833695
Михаил
2004-05-06 12:54
2004.05.30
Подстановочные поля


1-1084773824
1008
2004-05-17 10:03
2004.05.30
Корректно ли следующее объявление?