Открытый SQL и собственный SQL в SAP ABAP
⚡ Умное резюме
Open SQL и нативный SQL в SAP В ABAP описываются два способа взаимодействия программы с базой данных. Open SQL работает с таблицами-словарями независимо от базы данных, в то время как Native SQL передает специфические для базы данных операторы непосредственно на платформу.
Что такое OpenSQL и Native SQL?
Цель этого урока – не научить вас SQL или концепции баз данных, но чтобы познакомить вас с разнообразием SQL в ABAP.
В языке программирования ABAP/4 используется два типа SQL.
- РОДНОЙ SQL
- ОТКРЫТЬ SQL.
Open SQL позволяет получить доступ к таблицам базы данных, объявленным в словаре ABAP, независимо от платформы базы данных, которую использует система R/3.
Собственный SQL позволяет использовать операторы SQL, специфичные для базы данных, в программе ABAP/4. Это означает, что вы можете использовать таблицы базы данных, которые не администрируются словарем ABAP, и, следовательно, интегрировать данные, которые не являются частью системы R/3.
Open SQL состоит из набора операторов ABAP, которые выполняют операции с центральной базой данных в системе R/3. Результаты операций и любые сообщения об ошибках не зависят от используемой системы баз данных. Таким образом, Open SQL обеспечивает единый синтаксис и семантику для всех систем баз данных, поддерживаемых SAP. Программы ABAP, использующие только операторы Open SQL, будут работать в любой системе R/3, независимо от используемой системы баз данных. Операторы Open SQL могут работать только с таблицами баз данных, созданными в словаре ABAP.
Open SQL является языком программирования по умолчанию практически в каждой программе, поэтому его набор команд будет рассмотрен в первую очередь.
Основные команды Open SQL
- ВЫБОР
- ВСТАВИТЬ
- ОБНОВЛЕНИЕ ПО
- ИЗМЕНИТЬ
- УДАЛИТЬ
- ОТКРЫТЬ КУРСОР, ВЫБРАТЬ, ЗАКРЫТЬ КУРСОР
Пример
TABLES SBOOK. DATA C TYPE CURSOR, WA LIKE SBOOK. OPEN CURSOR C FOR SELECT * FROM SBOOK WHERE CARRID = 'LH ' AND CONNID = '0400' AND FLDATE = '19950228' ORDER BY PRIMARY KEY. DO. FETCH NEXT CURSOR C INTO WA. IF SY-SUBRC <> 0. CLOSE CURSOR C. EXIT. ENDIF. WRITE: / WA-BOOKID, WA-CUSTOMID, WA-CUSTTYPE, WA-SMOKER, WA-LUGGWEIGHT, WA-WUNIT, WA-INVOICE. ENDDO.
Выведите список пассажиров рейса Lufthansa 0400 28-02.1995:
Результат выполнения каждого из этих утверждений отображается в двух системных полях, описанных далее.
Open SQL Return Codes
Все операторы Open SQL заполняют следующие два системных поля кодами возврата.
| Поле системы | Смысл |
|---|---|
| SY-SUBRC | После каждого оператора Open SQL системное поле SY-SUBRC содержит значение 0, если операция прошла успешно, и значение, отличное от 0, в противном случае. |
| SY-DBCNT | После оператора Open SQL системное поле SY-DBCNT содержит количество обработанных строк базы данных. |
💡 Совет: Всегда проверяйте SY-SUBRC сразу после выполнения оператора. Последующая команда ABAP перезапишет это поле, и исходный результат будет потерян.
Если таблица находится за пределами словаря ABAP, Open SQL не может до неё добраться, и управление переходит к собственному SQL.
Собственный SQL
Как уже упоминалось, Native SQL позволяет использовать операторы SQL, специфичные для базы данных, в ABAP-программа.
Чтобы использовать оператор Native SQL, перед ним необходимо поставить оператор EXEC SQL, а после него — оператор ENDEXEC.
Синтаксис
EXEC SQL [PERFORMING <form>]. <Native SQL statement> ENDEXEC.
После операторов Native SQL точка не ставится. Более того, использование кавычек («) или звездочки (*) в начале строки в собственном операторе SQL не вводит комментарий, как в обычном синтаксисе ABAP. Вам необходимо знать, чувствительны ли к регистру имена таблиц и полей в выбранном вами формате. база данных.
В операторах Native SQL данные передаются между таблицей базы данных и программой ABAP с использованием переменных хоста. Они объявлены в программе ABAP, и в инструкции Native SQL им предшествует двоеточие (:). В качестве переменных хоста можно использовать элементарные структуры. В исключительных случаях структуры в предложении INTO обрабатываются так, как будто все их поля перечислены по отдельности.
Как и в Open SQL, после оператора ENDEXEC SY-DBCNT содержит количество обработанных строк. Почти во всех случаях SY-SUBRC содержит значение 0 после оператора ENDEXEC.
⚠️ Предупреждение: Встроенный SQL обходит эту проблему. SAP Буфер таблицы и автоматическая обработка клиента Open SQL. Поле клиента должно быть предоставлено программой, и оператор выполняется только на той платформе базы данных, для которой он был написан.
Open SQL против нативного SQL: ключевые различия
Оба интерфейса обращаются к одной и той же базе данных, однако различаются по переносимости, буферизации и объектам, к которым они могут обращаться. В таблице ниже приведены основные практические различия.
| Критерии | Открытый SQL | Собственный SQL |
|---|---|---|
| Таблицы, к которым были обращены | Только таблицы, объявленные в словаре ABAP. | Любая таблица базы данных, включая таблицы, находящиеся за пределами словаря. |
| Портативность | Работает на всех поддерживаемых базах данных. SAP | Привязан к синтаксису одной платформы баз данных. |
| Синтаксис | ABAP-формулы с указанием периода закрытия | Операторы SQL, заключенные в блок EXEC SQL … ENDEXEC, без точки закрытия. |
| передача данных | Рабочие зоны и внутренние столы через INTO | Переменные хозяина, которым предшествует двоеточие. |
| Обработка и буферизация данных клиента | Автоматическая обработка клиентов и буферизация таблиц. | Отсутствует автоматическая обработка клиентов, и SAP буфер пропущен |
| Типичное использование | Ежедневный доступ к данным приложений R/3 | Интеграция данных, не являющихся частью системы R/3. |
Таким образом, OpenSQL является языком программирования по умолчанию, а приведенные ниже правила обеспечивают его высокую скорость.
Открытый SQL – правила производительности
Чтобы улучшить производительность SQL и, в свою очередь, программы ABAP, следует соблюдать следующие правила:
Держите набор результатов небольшим
- Использование предложенияwhere
- Если из базы данных требуется только одна запись, по возможности используйте SELECT SINGLE.
Минимизируйте объем передаваемых данных
- Ограничить количество строк
- Если в таблице требуются только определенные поля, используйте SELECT. INTO … заявление
- Ограничить количество столбцов
- Используйте агрегатные функции
Минимизируйте количество передач данных
- Избегайте вложенных циклов выбора
- Альтернативный вариант — использовать оператор SELECT .. FOR ALL ENTRIES. Этот оператор часто может быть намного более эффективным, чем выполнение большого количества операторов SELECT или SELECT SINGLE во время LOOP внутренней таблицы.
- Использовать словарные представления
- Используйте соединения в предложении FROM
- Используйте подзапросы в предложенииwhere
Минимизируйте затраты на поиск
- Используйте индексные поля в предложенииwhere
- При доступе к базам данных всегда проверяйте, используется ли правильный индекс.
Уменьшите нагрузку на базу данных
- BufferИНГ
- Логические базы данных
- Избегайте повторного доступа к базе данных
Использование внутренних таблиц для Buffer документация
- Чтобы избежать многократного выполнения одного и того же запроса SELECT (и, следовательно, появления дубликатов запросов SELECT), внутренний стол Хэшированные директивы типа HASHED могут использоваться для повышения производительности.

