Не работает хранимая процедура.

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
Mironico
Сообщения: 81
Зарегистрирован: 17 янв 2007, 12:23

Не работает хранимая процедура.

Сообщение Mironico » 03 янв 2008, 12:46

Прошу помощи.
Написал ХП но она почему-то не работает.
Бьюсь уже 2 день, голова пухнет.
Гляньте пож трезвым взглядом, может подскажете.
Ошибок в тексте не обнаружено.
Может быть что проблема в моей неопытности.

Код: Выделить всё

SET TERM ^ ;

CREATE PROCEDURE PRICE2UPDTSELLS (
    d2 timestamp,
    d1 timestamp)
returns (
    vtovar_kod integer,
    vsum double precision)
as
begin
        for SELECT T.TOVAR_KOD, SUM( T.KOLVO )
                 FROM protocol_arch T
                 where T.dateadd between :D1 and :D2
                 group by T.TOVAR_KOD
                 into :vtovar_kod, :vsum
        do
        begin
            update PRICE2 P2
            set P2.sells=:vsum where p2.tovar_kod=:vtovar_kod;
        end
        exit;
end^

SET TERM ; ^

GRANT SELECT ON PROTOCOL_ARCH TO PROCEDURE PRICE2UPDTSELLS;

GRANT SELECT,UPDATE ON PRICE2 TO PROCEDURE PRICE2UPDTSELLS;

GRANT EXECUTE ON PROCEDURE PRICE2UPDTSELLS TO SYSDBA;

mdfv
Сообщения: 119
Зарегистрирован: 23 май 2006, 15:53

Сообщение mdfv » 03 янв 2008, 12:56

Не работает - понятие растяжимое.
Что конкретно не так? И как должно быть?

Mironico
Сообщения: 81
Зарегистрирован: 17 янв 2007, 12:23

Сообщение Mironico » 03 янв 2008, 12:58

нету результата.
должна обновляться таблица price2 колонка sells.
а там нули, хотя если делать только селект
то выборка далеко не пустая

mdfv
Сообщения: 119
Зарегистрирован: 23 май 2006, 15:53

Сообщение mdfv » 03 янв 2008, 14:19

select * from PRICE2UPDTSELLS (...)
что-нибудь возвращает?
кстати там suspend пропущен.

Mironico
Сообщения: 81
Зарегистрирован: 17 янв 2007, 12:23

Сообщение Mironico » 03 янв 2008, 14:30

vtovar_kod <null>
vsum <null>
возвращает

mdfv
Сообщения: 119
Зарегистрирован: 23 май 2006, 15:53

Сообщение mdfv » 03 янв 2008, 15:07

это уже при вставленном суспенде?

Mironico
Сообщения: 81
Зарегистрирован: 17 янв 2007, 12:23

Сообщение Mironico » 03 янв 2008, 15:12

да

mdfv
Сообщения: 119
Зарегистрирован: 23 май 2006, 15:53

Сообщение mdfv » 03 янв 2008, 15:19

А как происходит вызов процедуры?
(непосредственно участок кода с передачей параметров)

Mironico
Сообщения: 81
Зарегистрирован: 17 янв 2007, 12:23

Сообщение Mironico » 03 янв 2008, 15:23

ну я пока запускаю из-под ibeexpert .
даты запрашивает перед выполнением.
транзакцию подтверждаю.

mdfv
Сообщения: 119
Зарегистрирован: 23 май 2006, 15:53

Сообщение mdfv » 03 янв 2008, 15:33

А что он говорит на вкладке анализ производительности?
действительно нет чтений?

Mironico
Сообщения: 81
Зарегистрирован: 17 янв 2007, 12:23

Сообщение Mironico » 03 янв 2008, 15:34

------ Performance info ------
Prepare time = 0ms
Execute time = 6s 250ms
Avg fetch time = 6 250,00 ms
Current memory = 1 183 832
Max memory = 1 316 368
Memory buffers = 2 048
Reads from disk to cache = 155 578
Writes from cache to disk = 0
Fetches from cache = 1 050 245

mdfv
Сообщения: 119
Зарегистрирован: 23 май 2006, 15:53

Сообщение mdfv » 03 янв 2008, 15:41

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

Mironico
Сообщения: 81
Зарегистрирован: 17 янв 2007, 12:23

Сообщение Mironico » 03 янв 2008, 15:56

есть график только на чтение из протокола ~ 350 000
а на обновление пусто - 0

mdfv
Сообщения: 119
Зарегистрирован: 23 май 2006, 15:53

Сообщение mdfv » 03 янв 2008, 16:28

Это оригинально.
Надо полагать индекса по dateadd тут нет.

А данные то точно есть на этот промежуток?

Mironico
Сообщения: 81
Зарегистрирован: 17 янв 2007, 12:23

Сообщение Mironico » 03 янв 2008, 16:36

данные есть 100%

mdfv
Сообщения: 119
Зарегистрирован: 23 май 2006, 15:53

Сообщение mdfv » 03 янв 2008, 16:49

с типом timestamp и не такое бывает.
при этом вы утверждаете что отдельно тот же запрос с теми же параметрами возвращает данные?

Код: Выделить всё

SELECT T.TOVAR_KOD, SUM( T.KOLVO )
FROM protocol_arch T
where T.dateadd between d1 and d2
group by T.TOVAR_KOD 
dateadd имеет тип timestamp ?

Mironico
Сообщения: 81
Зарегистрирован: 17 янв 2007, 12:23

Сообщение Mironico » 03 янв 2008, 16:51

да, возвращает

Mironico
Сообщения: 81
Зарегистрирован: 17 янв 2007, 12:23

Сообщение Mironico » 03 янв 2008, 16:51

да timestamp

mdfv
Сообщения: 119
Зарегистрирован: 23 май 2006, 15:53

Сообщение mdfv » 03 янв 2008, 17:00

как вариант могу предположить что
порядок параметров не тот и про это забыто
d2 timestamp,
d1 timestamp)
а в запросе правильно
where T.dateadd between d1 and d2

Mironico
Сообщения: 81
Зарегистрирован: 17 янв 2007, 12:23

Сообщение Mironico » 03 янв 2008, 17:29

Мать его за ногу!
Точно!
Ну спасибо добрый Человек!
ФУФ! :oops:

Ответить