2009-07-21 3 views
1

Хорошо, у меня есть вопрос, связанный с проблемой, которую я ранее имел. Я знаю, как это исправить, но у нас возникают проблемы с воспроизведением ошибки.Sybase select variable logic

У нас есть ряд процедур, которые создают записи на основе других записей. Записи привязаны к первичной записи посредством link_id. В процедуре, которая захватывает эту link_id, запрос является

select @p_link_id = id --of the parent 
from table 
where thingy_id = (blah) 

Теперь, есть несколько строк в таблице для деятельности. Некоторые могут быть отменены. Код, который у меня есть, не отменяет отмененные строки в инструкции select, поэтому, если ранее были отменены строки, эти идентификаторы появятся в списке. Всегда будет одна «открытая» запись, которая будет выбрана, если я исключу отмененные строки. (append where status != 'C')

Это решает эту проблему. Однако мне нужно иметь возможность воспроизвести проблему в нашей среде разработки.

Я прошел процесс, когда я ввел целую кучу данных, открыв, отменив и т. Д., Чтобы попытаться заставить этот оператор select вернуть недопустимый идентификатор. Однако всякий раз, когда я запускаю select, идентификаторы находятся в порядке (сгенерирована последовательность), но в случае возникновения этой ошибки оператор select возвращает то, что кажется первым значением в переменной.

Например.

ID Status 
1 Cancelled 
2 Cancelled 
3 Cancelled 
4 Open 

Учитывая вышеизложенное, если я делаю выбор для идентификатора, который я хочу, я хочу получить «4». В ошибке результат равен 1. Однако, даже если я вхожу в 10 отмененных записей, я все равно получаю последний в списке.

В oracle я знаю, что если вы выберете переменную и вернется более одной записи, вы получите ошибку (я думаю). Очевидно, Sybase может присваивать несколько значений переменной без ошибок.

Я думаю, что есть какое-то отношение к тому, как данные выбираются из таблицы, где идентификаторы без порядка сортировки не возвращаются в порядке возрастания, или есть dboption, где выбор в переменной будет сохранить запрашиваемое первое или последнее значение.

Редактировать: похоже, мы можем воспроизвести эту ошибку, отбросив изменения хранимой процедуры. Тем не менее, procs не приближаются к этому столбцу link_id. Возможно ли, что изменения в архитектуре базы данных могут сломать индекс или что-то еще?

+0

Это [тег: sybase-asa], [tag: sybase-ase], [tag: sybase-iq] или [tag: sqlanywhere]? Попытка очистить тег [sybase] ... –

ответ

2

Если получено более одной строки, то значение, которое будет сохранено, будет Последнее значение в списке в соответствии с this.

Если вы не указали заказ на получение через ORDER BY, тогда заказ будет возвращен при удобстве движка базы данных. Он может очень сильно отличаться от экземпляра базы данных. Это может быть в порядке, созданном или даже показанным «случайным», из-за того, где данные помещаются в структуру блока базы данных.

Мораль истории:

  1. Всегда сделать одноплодной SELECT s возвращают одну строку,
  2. Когда # 1 не может быть сделано, используйте ORDER BY, чтобы убедиться, что один вы заботитесь о прошлом приходит