powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / разные результаты одного селекта
8 сообщений из 8, страница 1 из 1
разные результаты одного селекта
    #36010670
jack_nsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
всем почтение

не могу понять, почему один и тот же селект по разному выдает результаты
есть процедура
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
CREATE PROCEDURE SALES_PARSER_PER_CHECK (
inout cardnumber int, 
inout sale_DATE varchar( 100 ), 
inout sale_TIME varchar( 100 ), 
inout sale_SUM varchar( 100 ), 
inout #NOTEID bigint,

    out sale_DATE_1  date,
    out sale_TIME_1  time,
    out sale_SUM_1   decimal( 8 , 2 ),
    out ddd varchar( 250 ),
    out check_id     int

)
P1: BEGIN 

    set sale_DATE  = replace(trim(sale_DATE),' ','');
    set sale_TIME  = replace(trim(sale_TIME),' ','');
    set sale_SUM   = replace(trim(sale_SUM),' ','');
    	
    set sale_DATE  = replace(sale_DATE ,'/','.');
    set sale_TIME  = replace(sale_TIME ,'/','.');
    set sale_SUM   = replace(sale_SUM  ,',','.');

    set sale_DATE_1  = cast(sale_DATE  as date);
    set sale_TIME_1  = cast(sale_TIME  as time);
    set sale_SUM_1   = cast(sale_SUM   as decimal( 8 , 2 ));
	
	set ddd = '
    select min(id) into check_id
      from discount_sales
     where cardnumber = ' || char(cardnumber) || '  and
           sale_date  = ' || char(sale_date_1) || ' and
           sale_sum   = ' || char(sale_sum_1) || ' and
           sale_time  = ' || char(sale_time_1);
           
    select min(id) into check_id
      from discount_sales
     where cardnumber = cardnumber  and
           sale_date  = sale_date_1 and
           sale_sum   = sale_sum_1 and
           sale_time  = sale_time_1;           

END P1

зову её
Код: plaintext
call SALES_PARSER_PER_CHECK ( 3671284 , '23/11/2008', '13:50', '500',  2158 ,?,?,?,?,?)

на выходе

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
  Имя параметра   : CARDNUMBER
  Значение парам. :  3671284 

  Имя параметра   : SALE_DATE
  Значение парам. :  23 . 11 . 2008 

  Имя параметра   : SALE_TIME
  Значение парам. :  13 : 50 

  Имя параметра   : SALE_SUM
  Значение парам. :  500 

  Имя параметра   : #NOTEID
  Значение парам. :  2158 

  Имя параметра   : SALE_DATE_1
  Значение парам. :  11 / 23 / 2008 

  Имя параметра   : SALE_TIME_1
  Значение парам. :  13 : 50 : 00 

  Имя параметра   : SALE_SUM_1
  Значение парам. :  500 , 00 

  Имя параметра   : DDD
  Значение парам. : 
    select min(id) into check_id
      from discount_sales
     where cardnumber =  3671284       and
           sale_date  =  23 . 11 . 2008  and
           sale_sum   =  000500 . 00   and
           sale_time  =  13 : 50 : 00 

  Имя параметра   : CHECK_ID
  Значение парам. :  663022 

а если просто выполнить запрос
Код: plaintext
1.
2.
3.
4.
5.
    select min(id)
      from discount_sales
     where cardnumber =  3671284       and
           sale_date  = "23.11.2008" and
           sale_sum   =  000500 . 00   and
           sale_time  = "13:50:00"
то на выходе как и должно - NULL

статистику по таблице собрал...
...
Рейтинг: 0 / 0
разные результаты одного селекта
    #36012258
const64
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почему-то форматы даты разные (11/23 и 23/11)?
Да и десятичный разделитель тоже , или . (хотя в приведенном примере это и неважно).
И еще - разве в запросе кавычки, а не апостроф используется?
...
Рейтинг: 0 / 0
разные результаты одного селекта
    #36012298
jack_nsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
call SALES_PARSER_PER_CHECK ( 3671284 , '23/11/2008', '13:50', '500',  2158 ,?,?,?,?,?)
'23/11/2008' - извлеченное значение из длинной текстовой переменной
  Имя параметра   : SALE_DATE_1
  Значение парам. :  11 / 23 / 2008 
это внутренний формат экземпляра дб2, было бы иначе, было бы выдано сообщение об ошибке на неправильную дату

    select min(id)
      from discount_sales
     where cardnumber =  3671284       and
           sale_date  = "23.11.2008" and
           sale_sum   =  000500 . 00   and
           sale_time  = "13:50:00"
тут естественно должны быть апострофы, просто пока не знаю, как экранировать апостроф
в ПХП это выглядело бы так 
	$ddd = '
    select min(id) into check_id
      from discount_sales
     where cardnumber = ' . cardnumber . '  and
           sale_date  = \' ' . sale_date_1 . '\' and
           sale_sum   = ' . sale_sum_1 . ' and
           sale_time  = \' ' . char(sale_time_1) . '\';';

любопытно, откуда появляется само значение
Код: plaintext
1.
2.
  Имя параметра   : CHECK_ID
  Значение парам. :  663022 

с дб2 опыта пока маловато
относительно InterBase мог бы сказать, что данные брались бы из таблицы относительно записей в таблице транзакций. т.к. ИБ - версионник, то сначала бы была найдена запись в таблице транзакций о последней успешно завершенной транзакции для таблицы, а потом выбрана запись с признаком этой транзакции
как это работает в дб2 пока представляю слабо, компенсирую отсутствие знаний изучением "Руководства по подготовке к сертификационному экзамену #700" Роджера Сандерса

а пока делаю бекап-рестор базы, полагаю, что должно помочь, т.к. до этого игрался с укорочением транзакций с помощью SAVEPOINT и иногда выходило сообщение о переполнении лога транзакций.
...
Рейтинг: 0 / 0
разные результаты одного селекта
    #36012527
Mark Barinstein
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте.jack_nskа если просто выполнить запрос
Код: plaintext
1.
2.
3.
4.
5.
    select min(id)
      from discount_sales
     where cardnumber =  3671284       and
           sale_date  = "23.11.2008" and
           sale_sum   =  000500 . 00   and
           sale_time  = "13:50:00"
то на выходе как и должно - NULL

статистику по таблице собрал...Вы из какой программы этот запрос выполняете?
...
Рейтинг: 0 / 0
разные результаты одного селекта
    #36012706
jack_nsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
из редактора комманд
...
Рейтинг: 0 / 0
разные результаты одного селекта
    #36014943
jack_nsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
выяснил "симптомы болезни"...
внутри хранимой процедуры в селекте почему-то игнорируется поиск по
Код: plaintext
where cardnumber = cardnumber
получается, что результаты выдает селект
Код: plaintext
1.
2.
3.
4.
5.
      select id 
        from discount_sales 
       where 
             sale_date  = sale_date_1 and
             sale_sum   = sale_sum_1 and
             sale_time  = sale_time_1_1
было подозрение на приведение типов переменных
cardnumber в таблице discount_sales - bigint, а в процедуре int
поменял процедуру, передаю cardnumber в нее как varchar,
потом привожу к типу bigint
но положительных результатов нет...
всё по-старому
...
Рейтинг: 0 / 0
разные результаты одного селекта
    #36015146
const64
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
jack_nskвыяснил "симптомы болезни"...
внутри хранимой процедуры в селекте почему-то игнорируется поиск по
Код: plaintext
where cardnumber = cardnumber

А, ну да, у Вас cardnumber воспринимается не как имя переменной, а как название поля в этой же таблице, обзовите переменную по другому...
...
Рейтинг: 0 / 0
разные результаты одного селекта
    #36015175
jack_nsk
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
const64, СПАСИБО!

const64jack_nskвыяснил "симптомы болезни"...
внутри хранимой процедуры в селекте почему-то игнорируется поиск по
Код: plaintext
where cardnumber = cardnumber

А, ну да, у Вас cardnumber воспринимается не как имя переменной, а как название поля в этой же таблице, обзовите переменную по другому...

сделал так
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
    DECLARE cursor1 CURSOR WITH RETURN FOR
      select id 
        from discount_sales 
       where cardnumber = SALES_PARSER_PER_CHECK.cardnumber  and
             sale_date  = sale_date_1 and
             sale_sum   = sale_sum_1 and
             sale_time  = sale_time_1_1
       order by id
       fetch first  1  row only;
тоже работает
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / разные результаты одного селекта
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]