Открытый SQL и собственный SQL в SAP ABAP
Цель этого урока – не научить вас 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
- ВЫБОР
- ВСТАВИТЬ
- ОБНОВЛЕНИЕ ПО
- ИЗМЕНИТЬ
- УДАЛИТЬ
- ОТКРЫТЬ КУРСОР, ВЫБРАТЬ, ЗАКРЫТЬ КУРСОР
Пример
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:
Коды возврата открытого SQL
Все операторы Open SQL заполняют следующие два системных поля кодами возврата.
SY-SUBRC
После каждого оператора Open SQL системное поле SY-SUBRC содержит значение 0, если операция прошла успешно, и значение, отличное от 0, в противном случае.
SY-DBCNT
После оператора Open SQL системное поле SY-DBCNT содержит количество обработанных строк базы данных.
Собственный 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 – правила производительности
Чтобы улучшить производительность SQL и, в свою очередь, программы ABAP, следует соблюдать следующие правила:
Держите набор результатов небольшим
- Использование предложенияwhere
- Если из базы данных требуется только одна запись, по возможности используйте SELECT SINGLE.
Минимизируйте объем передаваемых данных
- Ограничить количество строк
- Если в таблице требуются только определенные поля, используйте SELECT. INTO … заявление
- Ограничить количество столбцов
- Используйте агрегатные функции
Минимизируйте количество передач данных
- Избегайте вложенных циклов выбора
- Альтернативный вариант — использовать оператор SELECT .. FOR ALL ENTRIES. Этот оператор часто может быть намного более эффективным, чем выполнение большого количества операторов SELECT или SELECT SINGLE во время LOOP внутренней таблицы.
- Использовать словарные представления
- Используйте соединения в предложении FROM
- Используйте подзапросы в предложенииwhere
Минимизируйте затраты на поиск
- Используйте индексные поля в предложенииwhere
- При доступе к базам данных всегда проверяйте, используется ли правильный индекс.
Уменьшите нагрузку на базу данных
- BufferИНГ
- Логические базы данных
- Избегайте повторного доступа к базе данных
Использование внутренних таблиц для Buffer документация
- Чтобы избежать многократного выполнения одного и того же SELECT (и, следовательно, дублирования выбора), для повышения производительности можно использовать внутреннюю таблицу типа HASHED.