Открытый SQL и собственный SQL в SAP ABAP

Цель этого урока – не научить вас SQL или концепции баз данных, но чтобы познакомить вас с разнообразием SQL в ABAP.

В языке программирования ABAP/4 используется два типа SQL.

  1. РОДНОЙ SQL
  2. ОТКРЫТЬ 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.