Sybase выбрать переменную логику - PullRequest
1 голос
/ 21 июля 2009

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

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

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

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

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

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

Например.

ID   Status
1    Cancelled
2    Cancelled
3    Cancelled
4    Open

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

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

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

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

1 Ответ

2 голосов
/ 21 июля 2009

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

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

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

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