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

Работа VB и СУБД (Access, MSSQL, MySQL, Oracle и пр.)
Правила форума
При создании новой темы не забывайте указывать используемую СУБД.
VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

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

Сообщение VVitafresh » 02.02.2007 (Пт) 13:35

Ломаю голову над совершенно непонятной для меня ситуацией. Следующий код не работает при вызове его из хранимой процедуры, а именно не отрабатывает UPDATE (все записи имеют ost_n=NULL).

Код: Выделить всё
CREATE TABLE #tmp_mopb(
acc varchar(34),
ost_n numeric(15,2) NULL, 
ost_k numeric(15,2) NULL
)

INSERT INTO #tmp_mopb(acc, ost_k)
SELECT BMO_ACC, ABS(ONV-OBDV+OBKV) 
FROM MOPB INNER JOIN SCPF ON BMO_ACC=BSC_ACC
WHERE BMO_ACC LIKE '3579%'
AND DAT_OD = '2007-01-31' 

DELETE FROM #tmp_mopb
WHERE ost_k=0

UPDATE #tmp_mopb
SET ost_n=ONV
FROM MOPA as mo INNER JOIN #tmp_mopb as tmpb ON mo.BMO_ACC=tmpb.ACC
WHERE DAT_OD = '2007-01-03'
 

select * 
from #tmp_mopb


НО! Если тот же самый код выполнить непосредственно, то все отрабатывает корректно. Из-за чего такое вообще возможно. Для меня это полная загадка.

P.S. Сервер Sybase ASE, Transact-SQL.
Никакую проблему невозможно решить на том же уровне, на каком она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 02.02.2007 (Пт) 16:47

Ну, наиболее распространенные причины:
    1. Юзер-владелец процедуры не имеет прав на работу с некоторыми объектами.
    2. Юзер-пользователь процедуры не имеет права на работу с объектами, доступ к которым осуществляется через динамический SQL. Не твой случай.
    3. Различные установки SET-опций для скрипта и для процедуры.
Вообще же, я бы сгенерил план выполнения процедуры и посмотрел, на каком именно шаге апдейта появляется пустое множество. Кстати, MOPA - это часом не вьюха/функция, результат обращения к которой зависит от пользователя, который к ней обратился?..

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 02.02.2007 (Пт) 18:35

Выполняю ХП под админом, доступы все есть.
MOPA -- обычная табличка, не вьюха.

Похоже, дело даже не в UPDATE'e, а в окончательно выводе. Наверное, что-то действительно с SET'ами.
Заменяю:
Код: Выделить всё
SELECT * 
FROM #tmp_mopb

на
Код: Выделить всё
select tmpb.acc,tmpb.ost_n,tmpb.ost_k,mo.onv
FROM tmp_mopb as tmpb INNER JOIN MOPB as mo ON tmpb.ACC=mo.BMO_ACC
WHERE DAT_OD = '2007-01-30'


и данные выводятся правильно. Это что-то совсем непоянтное :roll:
Никакую проблему невозможно решить на том же уровне, на каком она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 02.02.2007 (Пт) 19:15

В одном месте у тебя указано 31 января, в другом - 3-е, в третьем - 30-е. Это ничего, нормально?..

Кстати, Сайбейз всегда однозначно интерпретирует такую запись даты как yyyy-mm-dd или нет?

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 02.02.2007 (Пт) 19:24

Ennor писал(а):В одном месте у тебя указано 31 января, в другом - 3-е, в третьем - 30-е. Это ничего, нормально?..

Нормально, это я просто с разными датами эксперементировал, результат один и тот же. В таком варианте тоже выводится все правильно (значения полей tmpb.ost_n и mo.onv совпадают и не NULL):
Код: Выделить всё
select tmpb.acc,tmpb.ost_n,tmpb.ost_k,mo.onv
FROM #tmp_mopb as tmpb INNER JOIN MOPA as mo ON tmpb.ACC=mo.BMO_ACC
WHERE BMO_DAT_OD = '2007-01-03'

А вот если просто:
Код: Выделить всё
SELECT * 
FROM #tmp_mopb
то для всех записей поле tmpb.ost_n=NULL :scratch:

Ennor писал(а):Кстати, Сайбейз всегда однозначно интерпретирует такую запись даты как yyyy-mm-dd или нет?

Да, конечно. Ведь это как бы стандартная форма представления даты.
Никакую проблему невозможно решить на том же уровне, на каком она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.

Ennor
Конструктивный критик
Конструктивный критик
 
Сообщения: 2504
Зарегистрирован: 18.12.2001 (Вт) 3:58
Откуда: Калуга -> Москва

Сообщение Ennor » 02.02.2007 (Пт) 21:53

Код: Выделить всё
SELECT tmpb.acc,tmpb.ost_n,tmpb.ost_k
from #tmp_mopb tmpb
что вернет?
Еще: попробуй определить какой-нить ключ/индекс на эту таблицу. Идиотизм, конечно, но кто его знает, какие там у этого сервера свои заморочки...

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 03.02.2007 (Сб) 21:49

Буду на работе, попробую.

Но, интересное дело, сейчас попробовал воспроизвести ситуацию дома: создал две таблички с похожей структурой TMOPA и TMOPB, заполнил их вручную тестовыми значениями, запустил указанную в первом посте процедуру на выполнение и получил ПРАВИЛЬНЫЙ результат, тот который и должен по логике вещей получить :roll:

Выходит, на работе что-то либо с настройками сервера (что мало вероятно), либо с настройками клиента через который я запускаю на выполнение процедуру. Больше склоняюсь к последнему варианту...
Никакую проблему невозможно решить на том же уровне, на каком она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 03.02.2007 (Сб) 22:05

А мне скорее кажется, что первый вариант.
Ты проверял настройки SET?
Lasciate ogni speranza, voi ch'entrate.

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 03.02.2007 (Сб) 22:07

alibek писал(а):А мне скорее кажется, что первый вариант.
Ты проверял настройки SET?

Нет, а какие именно настройки проверить? Я не знаю, что может так повлиять на результат.
Никакую проблему невозможно решить на том же уровне, на каком она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 05.02.2007 (Пн) 8:19

ANSI_NULLS и прочие.
Lasciate ogni speranza, voi ch'entrate.

VVitafresh
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1641
Зарегистрирован: 12.05.2005 (Чт) 14:44
Откуда: Херсон, UA

Сообщение VVitafresh » 05.02.2007 (Пн) 10:25

Не, дело не в ANSI_NULLS.

Я процедуры выполнял в SQL Advantag'e (в Sybase это что-то вроде Query Analyzer'a). Так вот, оказалось, что в его настройках стояла опция "возвращать первые 512 записей". Как только я поставил "возвращать все" мне возвратился нормальный результат!
Видать при первых 512 записях что-то не отрабатывает на большом объеме данных... Вот из-за такой ерунды заткнулся на первом же этапе создания процедруы :(

Ennor, alibek, спасибо за помощь в решении проблемы :)
Никакую проблему невозможно решить на том же уровне, на каком она возникла. Нужно стать выше этой проблемы, поднявшись на следующий уровень.


Вернуться в Базы данных

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 214

    TopList  
cron