Программы ABAP не взаимодействуют с системой баз данных напрямую; вместо этого интерфейс базы данных SAP NetWeaver AS ABAP отвечает за связь с базой данных. Когда мы используем операторы Open SQL в программах ABAP, интерфейс базы данных преобразует операторы Open SQL в операторы Native SQL, которые являются родными для базовой базы данных. Этот уровень абстракции делает программы ABAP переносимыми; то есть они могут работать в любой среде базы данных.
Открытый SQL включает в себя DML-часть стандартного SQL, которая позволяет читать и изменять данные из таблиц базы данных. Например, оператор SELECT позволяет считывать данные из таблицы базы данных, тогда как операторы INSERT, UPDATE, MODIFY и DELETE позволяют изменять данные в таблице базы данных. Операторы Open SQL в ABAP предлагают дополнительные варианты по сравнению со стандартным SQL; эти варианты упрощают и ускоряют доступ к базе данных.
Операторы Open SQL необходимо отслеживать на предмет негативного влияния на производительность приложения. Если доступ к базе данных не запрограммирован должным образом, программа может отрицательно сказаться на производительности системы. Мы можем использовать различные инструменты, такие как трассировка SQL (транзакция ST05) или анализ времени выполнения (транзакция SAT), для мониторинга производительности доступа к базе данных.
Вы можете следовать определенным общим рекомендациям при программировании доступа к базе данных, чтобы ваши программы работали с высокой эффективностью. Когда вы извлекаете данные из базы данных, объем извлеченных данных создает нагрузку на память базы данных, а также на сеть между базой данных и сервером приложений. Мы рекомендуем свести обращения к базе данных и объем данных к минимуму.
Например, если вы хотите обработать только определенные поля данных из таблицы базы данных, вам следует извлекать только обязательные поля, а не всю строку. Кроме того, вы должны программировать таким образом, чтобы вы извлекали данные из таблицы базы данных только один раз и работали с этими данными локально, обращаясь к объектам данных программы, вместо того, чтобы писать оператор SELECT для многократного извлечения данных из одной и той же таблицы. раз в программе, потому что каждый доступ к базе данных увеличивает рабочую нагрузку на базу данных и сеть.
Предложение WHERE оператора SELECT также играет решающую роль в повышении производительности программы. Вы должны обеспечить минимальное усилие поиска, сформулировав предложение WHERE для использования любого доступного индекса, или вообще свести усилия поиска к минимуму. Следует избегать ненужного доступа к базе данных, потому что, как правило, многие прикладные программы обращаются к одной и той же базе данных, и каждый доступ к базе данных каждой программой будет увеличивать рабочую нагрузку на базу данных. Не существует фиксированных правил программирования для эффективного доступа к базе данных, поэтому вам необходимо выбрать наилучший возможный подход в каждом конкретном случае в зависимости от данных, которые вы планируете обрабатывать.
SELECT
Оператор SELECT позволяет импортировать данные из таблиц базы данных в объекты данных программы ABAP. Функции оператора SELECT варьируются от простого выбора данных до программирования сложных запросов к базе данных.
Базовый оператор SELECT содержит различные предложения, как показано ниже.
SELECT result FROM source INTO target WHERE cond.
Результат предложения SELECT определяет результирующий набор таблицы базы данных, то есть поля таблицы базы данных, которые считываются. Вы можете прочитать только определенные поля или все поля таблицы базы данных. Источник предложения FROM определяет таблицу базы данных или представление, из которого считываются данные.
Цель предложения INTO определяет объект данных программы, в который считываются данные из таблицы базы данных. Этот объект данных обновляется данными из базы данных после успешного выполнения оператора SELECT. Если данные не считаны, системное поле SY-SUBRC обновляется на 4. Системное поле SY-DBCNT обновляется количеством прочитанных записей.
Предложение WHERE определяет условия, при которых данные считываются. Система выполняет поиск в таблице базы данных на основе условия, указанного в предложении WHERE. Если предложение WHERE не указано, все данные из таблицы базы данных, указанной в предложении FROM, будут считаны в объект данных, указанный в предложении INTO. Всегда следует избегать выполнения инструкции SELECT без предложения WHERE, поскольку это может привести к передаче огромных объемов данных и вызвать переполнение памяти при определенных условиях.
В дополнение к этим основным предложениям оператор SELECT может содержать три других предложения:
GROUP BY Используется для объединения нескольких строк и импорта в одну строку.
HAVING Используется для указания условий для агрегированных строк.
ORDER BY Используется для сортировки строк набора результатов.
SELECT Clause
Предложение SELECT определяет, считываются ли одна или несколько строк из таблицы базы данных и какие столбцы считываются. Если используется дополнение SINGLE, считывается только одна запись. Если дополнение SINGLE не указано, оператор SELECT должен быть закрыт оператором ENDSELECT (или целевая переменная должна быть внутренней таблицей), и система будет считать, что результирующий набор содержит несколько строк. Система зацикливается между операторами SELECT и ENDSELECT, передавая одну запись за раз в объект данных, указанный в предложении INTO.
Оператор SELECT...ENDSELECT позволяет вам оценивать каждую строку по мере ее передачи в программу. При использовании дополнения SINGLE предложение WHERE должно использовать полный ключ таблицы базы данных для уникальной идентификации строки; в противном случае в программу загружается первая совпадающая строка. Чтобы игнорировать дубликаты при использовании неуникального предложения WHERE с SELECT...ENDSELECT, вы можете использовать дополнение DISTINCT.
Вы можете указать столбцы, которые должны быть выбраны, перечислив имена полей, разделенные пробелами, или использовать *, чтобы выбрать все поля таблицы. Следующий оператор показывает пример использования SELECT SINGLE для выбора определенных полей таблицы SPFLI:
SELECT SINGLE carrid connid FROM spfli INTO ls_spfli WHERE carrid EQ 'AA' AND connid EQ'0017'.
Следующий оператор показывает пример использования SELECT SINGLE для выбора всех полей таблицы SPFLI:
SELECT SINGLE * FROM spfli INTO ls_spfli WHERE carrid EQ 'AA' AND connid EQ'0017'.
SELECT...ENDSELECT для выборки определенных полей из таблицы SPFLI. Система зацикливается между SELECT и ENDSELECT, передавая по одной записи за раз.
SELECT carrid connid FROM sflight INTO ls_sflight WHERE carrid EQ 'AA' AND connid EQ '0017'. *Код для обработки записи ENDSELECT.
SELECT...ENDSELECT для выборки всех полей из таблицы SPFLI. Система зацикливается между SELECT и ENDSELECT, передавая по одной записи за раз.
SELECT * FROM sflight INTO ls_sflight WHERE carrid EQ 'AA' AND connid EQ '0017'. *Код для обработки записи ENDSELECT.
Агрегатные функции можно использовать с предложением SELECT, которое затем вычисляет значение в системе базы данных и возвращает одно значение. Это особенно полезно для представлений CDS, в которых вычисления могут быть переданы в базу данных, такую как SAP HANA, которая выполняет агрегирование намного быстрее, чем выборка записей в программу ABAP, а затем выполнение агрегирования. Агрегатные функции также сокращают передачу данных между базой данных и программой ABAP, возвращая только результат. Агрегатные функции обходят буфер.
Поддерживаются следующие функции агрегации:
Среднее (AVG)
Возвращает среднее значение для указанного поля столбца результирующего набора. Функцию AVG можно применять только к числовым полям. Например:
SELECT AVG( netwr ) FROM vbrp INTO lv_avg_netwr WHERE vbeln EQ p_vbeln.
В предыдущем примере переменная lv_avg_netwr должна иметь тип F (с плавающей запятой).
Минимум (MIN)
Возвращает наименьшее значение для указанного столбца в наборе результатов. Значения NULL игнорируются, если только все строки в столбце не содержат значения NULL. Например:
SELECT MIN( fkimg ) FROM vbrp INTO lv_min_fkimg WHERE vbeln EQ p_vbeln.
Максимум (MAX)
Возвращает наибольшее значение для указанного столбца в наборе результатов. Значения NULL игнорируются, если только все строки в столбце не содержат значения NULL.
SELECT MAX( fkimg ) FROM vbrp INTO lv_max_fkimg WHERE vbeln EQ p_vbeln.
Cумма (SUM)
Возвращает сумму всех значений для указанного столбца в результирующем наборе. SUM можно применять только к числовым полям.
SELECT SUM( fkimg ) FROM vbrp INTO lv_sum_fkimg WHERE vbeln EQ p_vbeln.
Количество (COUNT)
Возвращает количество строк или отдельных строк для указанного столбца в результирующем наборе. Использование COUNT DISTINCT возвращает количество различных строк, тогда как COUNT (*) возвращает количество строк для данного выбора.
SELECT COUNT( DISTINCT MATNR ) FROM vbrp INTO lv_count WHERE vbeln EQ p_vbeln.
Каждый столбец, указанный в предложении SELECT, может быть задан как альтернативное имя столбца с помощью добавления AS. Это полезно, когда вы хотите обратиться к имени столбца в других дополнениях оператора SELECT, таких как ORDER BY или JOIN. Например.
SELECT vbeln AS a1 fkimg AS a2 FROM vbrp INTO CORRESPONDING FIELDS OF TABLE lt_vbrp WHERE vbeln EQ p_vbeln ORDERBY a2.
FROM Clause
Предложение FROM позволяет указать таблицу словаря данных ABAP, классическое представление или представление CDS. Вы можете указать одну или несколько таблиц, используя внутренние и внешние соединения ( inner and outer joins).
INTO Clause
Предложение INTO определяет объекты данных программы ABAP, в которые должны быть извлечены данные. Объект данных, указанный в предложении INTO, должен соответствовать столбцам таблицы, перечисленным в предложении SELECT. При использовании SELECT SINGLE предложение INTO не может имеет внутреннюю таблицу. Если SELECT SINGLE не используется, предложение INTO может перечислить внутреннюю таблицу, используя дополнение TABLE. Например:
SELECT * FROM vbrp INTO TABLE lt_vbrp WHERE vbeln EQ p_vbeln.
Добавление INTO TABLE копирует результирующий набор во внутреннюю таблицу, и все предыдущие записи во внутренней таблице будут заменены. Если вы хотите сохранить предыдущие записи во внутренней таблице и добавить новые записи, вы можете использовать дополнение APPENDING TABLE вместо добавления INTO TABLE.
Добавление CORRESPONDING FIELDS OF используется для автоматического сопоставления идентичных полей из набора результатов с целевым объектом данных. Если имена столбцов поставляются с альтернативными именами с использованием дополнения AS, то альтернативные имена сопоставляются с целевым объектом данных. Это особенно полезно при выборе данных из нескольких таблиц в один целевой объект данных, когда несколько таблиц содержат одно и то же имя поля.
WHERE Clause
Предложение WHERE позволяет ограничить выбор данных; он играет решающую роль в выполнении программы. Вы можете указать логические выражения с предложением WHERE, которое можно комбинировать с AND и OR или инвертировать с NOT. Логические выражения могут формировать условия с помощью операторов сравнения =, < >, <>, <= или >=, например, в следующем примере: WHERE carrid = 'AA'.
Левый операнд в сравнении всегда должен быть полем таблицы, указанной в предложении FROM. Вы также можете указать предикаты BETWEEN и IN в предложении WHERE, например: WHERE col BETWEEN v_col1 AND v_col2. Предикат IN используется с таблицами выбора (таблицами диапазонов).
INSERT
Оператор INSERT вставляет новую запись в таблицу базы данных. Если первичный ключ записи уже существует, новая запись не вставляется.
Подобно другим операторам Open SQL, оператор INSERT устанавливает значение для системных полей SY-SUBRC и SY-DBCNT. Если после выполнения оператора значение SY-SUBRC равно 0, это означает, что запись успешно вставлена в таблицу базы данных. Поле SY-SUBRC будет установлено на 0, если в источнике указана пустая внутренняя таблица. Если значение SY-SUBRC равно 4, это означает, что запись не вставлена в таблицу базы данных, поскольку первичный ключ или уникальный вторичный ключ уже существует в таблице. Системное поле SY-DBCNT обновляется количеством вставленных строк.
С помощью оператора INSERT вы можете вставить одну строку из структуры (например, INSERT имя_таблицы FROM wa) или несколько строк из внутренней таблицы (например, INSERT имя_таблицы FROM TABLE itab).
Пример вставки одной строки с помощью инструкции INSERT.
DATA : ls_makt TYPE makt. ls_makt-matnr = '100'. ls_makt-spras = 'E'. ls_makt-maktx = 'Ручка'. INSERT makt FROM ls_makt. IF sy-subrc IS INITIAL. MESSAGE 'Запись вставлена успешно' TYPE 'I'. ENDIF.
Пример вставки нескольких строк.
DATA : lt_makt TYPE STANDARD TABLE OF makt, ls_makt TYPE makt. ls_makt-matnr ='100'. ls_makt-spras ='E'. ls_makt-maktx ='Ручка'. APPEND ls_makt TO lt_makt. ls_makt-matnr ='200'. ls_makt-spras ='E'. ls_makt-maktx ='Карандаш'. APPEND ls_makt TO lt_makt. INSERT makt FROM TABLE lt_makt. IF sy-subrc IS INITIAL. MESSAGE 'Записи вставлены успешно' TYPE 'I'. ENDIF.
UPDATE
Оператор UPDATE обновляет существующую запись в таблице. При использовании этого оператора неключевые поля существующей строки обновляются. Если ключ не существует, запись не обновляется.
Подобно оператору INSERT, вы можете обновить одну запись, указав структуру, или обновить несколько записей, передав внутреннюю таблицу. Система устанавливает поля SY-SUBRC и SY-DBCNT аналогично оператору INSERT. Эти системные поля можно проверить, чтобы определить, успешно ли обновлена запись, и количество обновленных записей соответственно.
Синтаксис использования инструкции UPDATE подобен синтаксису инструкции INSERT. Например, чтобы обновить запись из рабочей области, вы можете использовать оператор UPDATE вместо INSERT следующим образом:
UPDATE makt FROM ls_makt
Аналогично, для обновления из внутренней таблицы вы можете использовать следующий оператор:
UPDATE makt FROM TABLE lt_makt.
MODIFY
Оператор MODIFY работает как комбинация операторов INSERT и UPDATE. Когда вы используете оператор MODIFY, запись вставляется, если ключ не существует, и обновляется, если ключ существует. Системные поля SY-SUBRC и SY-DBCNT задаются так же, как и в операторах INSERT и UPDATE.
Синтаксис использования оператора MODIFY также подобен двум другим операторам. Например, чтобы изменить одну запись, вы можете использовать оператор MODIFY следующим образом:
MODIFY makt FROM ls_makt.
Чтобы изменить несколько записей с помощью внутренней таблицы, вы можете использовать оператор следующим образом:
MODIFY makt FROM TABLE lt_makt.
DELETE
Оператор DELETE безвозвратно удаляет строку или несколько строк из таблицы базы данных. С оператором DELETE вы можете указать условие WHERE или исходную структуру/внутреннюю таблицу. При использовании условия WHERE все соответствующие записи удаляются. Системные поля SY-SUBRC и SY-DBCNT задаются аналогично остальным трем операторам.
*Удалить с использованием условия WHERE DELETE FROM makt WHERE matnr EQ '100' AND spras EQ 'E'. *Удалить с помощью структуры DELETE makt FROM ls_makt. *Удалить с помощью внутренней таблицы DELETE makt FROM TABLE lt_makt.
Эти операторы Open SQL не обновляют базу данных немедленно, когда оператор выполняется на сервере приложений; вместо этого данные фиксируются в базе данных, когда работа по фиксации выполняется в LUW. Пока работа фиксации не будет выполнена, эти операторы устанавливают блокировку базы данных. При неправильном использовании эти операторы могут привести к тупиковой блокировке (блокировке доступа к данным).
Комментарии
Отправить комментарий