Каково поведение оператора SORT без «BY» в стандартных внутренних таблицах?Это безопасно? - PullRequest
0 голосов
/ 23 октября 2018

Что именно делает оператор SORT без спецификации ключа при запуске в стандартной внутренней таблице?Согласно документации :

Если явный ключ сортировки не вводится с помощью добавления BY, , внутренняя таблица itab сортируется по ключу первичной таблицы .Приоритет сортировки определяется порядком, в котором ключевые поля указаны в определении таблицы.В стандартных ключах сортировка имеет приоритет в соответствии с порядком расположения ключевых полей в типе строки таблицы.Если ключ первичной таблицы стандартной таблицы пуст, сортировка не производится.Если это известно статически, проверка синтаксиса выдает предупреждение.

С ключом первичной таблицы , определяемым как:

Каждая внутренняя таблица имеет ключ первичной таблицы, который является либо самоопределяемым ключом, либостандартный ключ.Для хэшированных таблиц первичный ключ - это хеш-ключ, для отсортированных таблиц первичный ключ - это отсортированный ключ.Оба этих типа таблиц являются таблицами ключей, для которых оптимизирован доступ к ключам, и поэтому первичный ключ имеет свою собственную администрацию.Ключевые поля этих таблиц защищены от записи при доступе к отдельным строкам.Стандартные таблицы также имеют первичный ключ, но соответствующий доступ не оптимизирован, отдельного администрирования ключей нет, а поля ключей не защищены от записи.

И для правильной меры стандартный ключ определяется как:

Ключ первичной таблицы внутренней таблицы, чьи ключевые поля структурированыТип строки - это все поля таблицы с символьными типами данных и байтовыми типами данных.Если тип строки содержит подструктуры, они разбиваются на элементарные компоненты.Стандартный ключ для неструктурированных типов строк - это вся строка таблицы, если сам тип строки не является типом таблицы.Если соответствующие поля таблицы отсутствуют или сам тип строки является типом таблицы, стандартный ключ из стандартных таблиц пуст или не содержит полей ключа.

Все это в основном просто смущает меня, так как я не уверен, могу ли я действительно полагаться на базовое утверждение SORT, чтобы обеспечить надежный или безопасный результат.Должен ли я действительно избегать этого во всех ситуациях или имеет ли это цель, если используется правильно ?

По расширению, если я хочу запустить DELETE ADJACENT DUPLICATES FROM itab COMPARING ALL FIELDS, когда это будет безопасносделать это после простого SORT itab.?Только если я добавил ключ на все поля?Без явного ключа, только если у меня есть внутренняя таблица со столбцами clike и xsequence? Если я хочу выполнить этот оператор DELETE, какой оператор SORT наиболее оптимален для выполнения во внутренней таблице?

Ответы [ 2 ]

0 голосов
/ 24 октября 2018

Внутренние таблицы могут иметь ключи, которые могут быть унаследованы от структур, на которых основана или указана itab.Как сказано в документации, sort без by сортируется по первичному ключу и что является безопасным при условии, что внутренняя таблица реализована правильно.

I думаю этоЭта функция разработана как динамическая функция, которая будет использоваться с ключом смарт-таблицы .Если все сделано правильно, sort без by может заставить вашу программу адаптироваться к изменениям ключа таблицы в будущем.(так что если ваш ключ меняется, сортируйте с изменением вместе с ним).Проблемы могут возникнуть, когда ключ модифицируется нечетным образом.

Как правило:

Чем конкретнее код вашей программы, тем менее он подвержен ошибкам (и безопаснее).Таким образом, sort by key_id, key_date всегда будет производить одинаковую сортировку по этим двум полям.

Динамические компоненты в приложении делают его более гибким, но, как правило, имеют (часто трудно заметить) ошибки, возникающие, когда они полагаются намодифицированныйПоэтому, если вы возьмете предыдущий пример с 2 ключевыми полями, вы добавите 1 в середине (скажем, key_is_active между 2 существующими полями), результаты сортировки могут измениться так, как вы этого не ожидали.Если у вас есть алгоритм, который обрабатывает на основе даты, ваш алгоритм может быть нарушен этим изменением.

В вашем конкретном случае с delete adjacent Я бы следовал совету Сандры Росси .

0 голосов
/ 23 октября 2018

SORT без BY следует избегать во всех ситуациях, потому что это «делает программу трудной для понимания и, возможно, непредсказуемой» (dixit документация ABAP ).Я думаю, что если вы не упомянете BY, в Инспекторе кода появится предупреждение по статической проверке.Вы должны использовать SORT itab BY table_line, где table_line - это специальное имя («псевдо-компонент»), означающее «все поля строки».

Не ваш вопрос, но вы также можете определитьвнутренняя таблица с первичными и вторичными ключами, поэтому вам не нужно явно сортировать - УДАЛИТЬ ДУБЛИКАТЫ ADJACENT можно использовать с любым из этих ключей.

...