ADBC — ABAP Database Connectivity

ADBC – объектно-ориентированное API, для взаимодействия с интерфейсом нативного SQL в ABAP. Может быть использован в том случае, когда необходим динамический доступ к нативному SQL, т.к. вызов через команды EXEC SQL не подразумевает динамической обработки.

Классы, представляющие ADBC начинаются с CL_SQL_* и CX_SQL_* (пакет SDB_ADBC). Основные из них:

  • CL_SQL_STATEMENT – для выполнения SQL команд
  • CL_SQL_PREPARED_STATEMENT – для выполнения заранее созданных SQL команд, с возможностью подстановки параметров
  • CL_SQL_CONNECTION  — для управления подключениями к БД
  • CX_SQL_EXCEPTION – базовый класс исключений

ADBC не поддерживает обработки автоматическое заполнение мандантов на основе текущей сессии, поле мандант должно быть явно указано (sy-mandt).  Вы должны позаботиться о том, чтобы приложение не использовало данные из других мандантов.

Выполнение SQL команд через CL_SQL_STATEMENT

Класс CL_SQL_STATEMENT содержит методы уровня инстанции для выполнения и получения данных из динамически созданных SQL выражений.

Инстанцию класса можно получить, используя оператор CREATE OBJECT, при необходимости передав ссылку на объект класса CL_SQL_CONNECTION, в котором содержится информация о подключении к БД. Если не передать ссылку, используется стандартное подключение к БД (см. тр. DBACOCKPIT).

DDL и DML выражения

Класс содержит следующие методы для выполнения DDL (язык определения данных) и DML (язык манипуляции данными) инструкций:

  • EXECUTE_DDL – для таких команд как: CREATE, DROP или ALTER.
  • EXECUTE_UPDATE – для таких команд как: INSERT, UPDATE или DELETE.

Оба метода содержат обязательный для заполнения параметр – STATEMENT типа string. Данный параметр должен содержать синтаксически корректное SQL выражение. Метод EXECUTE_UPDATE так же имеет возвращаемый параметр ROWS_PROCESSED, в котором заполняется количество строк таблицы, обработанных выражением.

В DML выражениях значения, передаваемые в базу данных, могут быть параметризированы, для того чтобы указать параметры необходимо воспользоваться символом «?». До выполнения SQL выражения, необходимо чтобы все параметры были заполнены, заполнение параметров осуществляется через метод SET_PARAM, с указанием ссылки на переменную. При этом по умолчанию, заполнение параметров происходит поочередно, слева направо в SQL выражении. После выполнения SQL выражения, все присвоения параметров теряются.

Следует знать, что использование DDL для создания таблиц (вместо SE11) крайне не рекомендуется, т.к. кроме созданных таблиц в БД, SAP создает записи в таблицах с метаданными (DD02L, DD03L и др.), из-за чего доступ к созданным таким способом таблицам будет ограничен. Для создания таблиц лучше использовать ФМ: DD_CREATE_TABLE.

Запросы

С помощью метода EXECUTE_QUERY можно выполнить запрос к БД. Так же как и предыдущие методы, он содержит обязательный параметр STATEMENT, который должен быть заполнен синтаксически верным SELECT выражением. Можно, как и для вышеописанных методов, задавать параметры, используя метод SET_PARAM.

В качестве результата, метод возвращает параметр RESULT_SET, который является ссылкой на класс CL_SQL_RESULT_SET. Методы данного класса позволяют получить доступ к результатам SQL запроса.

Для получения результата запроса служат следующие методы класса CL_SQL_RESULT_SET:

  • SET_PARAM, NEXT, и CLOSE. Данные методы обеспечивают доступ к индивидуальным строкам и колонкам данных из результата.  По умолчанию, доступ осуществляется слева на право. Метод NEXT переводит к следующей строке набора данных, если возвращает 1 – следующая строка считана, 0 – следующая строка не считана (достигнут конец набора данных). Чтение должно заканчиваться вызовом метода CLOSE.
  • SET_PARAM_STRUCT, NEXT, и CLOSE. Доступ аналогичен вышеуказанному способу, но вместо доступа к индивидуальным столбцам, получаем целиком структуру строки.
  • SET_PARAM_TABLE, NEXT_PACKAGE, и CLOSE. Метод NEXT_PACKAGE считывает указанное в параметре UPTO значение строк таблицы. Если параметр не задан, считываются все строки. При каждом новом вызове этого метода, в указанную таблицу добавляются новые записи, старые не удаляются.

Хранимые процедуры

Для запуска хранимых процедур используется метод EXECUTE_PROCEDURE. Метод содержит обязательный параметр PROC_NAME типа string, в который передается имя хранимой процедуры. Как и для вышеуказанных методов, можно задавать параметры, которые будут переданы в процедуру. Параметры, передаваемые в ХП, могут иметь разные типы направления, задается через необязательный параметр метода SET_PARAM – INOUT. Значения данного атрибута заполняются константами из класса CL_SQL_STATEMENT: C_PARAM_IN (по умолчанию), C_PARAM_OUT, и C_PARAM_INOUT.

Примеры работы с данным классом:

Программа, выполняющая запрос и считывающая результат в таблицу:

Создание и выполнение хранимой процедуры:

Выполнение заранее определенных SQL команд

Класс CL_SQL_PREPARED_STATEMENT позволяет выполнять заранее определенные SQL выражения, при этом меняя их параметры при необходимости. Данный класс является наследником от CL_SQL_STATEMENT.

SQL выражение передается в конструктор класса, через обязательный параметр STATEMENT. Как и для методов класса CL_SQL_STATEMENT доступны методы для определения параметров SQL выражения.

После выполнения ЛЕР БД, объект данного класса не может быть вновь использован. Если данный объект более не нужен, необходимо выполнить метод close, который освободит занятые ресурсы.

Пример программы использующей данный класс:

Обработка подключений

SQL выражения представленные классами CL_SQL_STATEMENT  и CL_SQL_PREPARED_STATEMENT по умолчанию используют соединение для главной базы данных сервера приложений. При необходимости можно указать и другое подключение, если оно настроено (тр. DBACOCKPIT).

Статический метод GET_CONNECTION при удачном соединении с альтернативной БД, возвращает экземпляр класса CL_SQL_CONNECTION, который в дальнейшем может быть использован при создании объектов  CL_SQL_STATEMENT  и CL_SQL_PREPARED_STATEMENT через параметр конструктора — CON_REF. Если подключение необходимо контролировать для БД по умолчанию, объект может быть создан через оператор CREATE OBJECT.

Для закрытия подключения необходимо использовать метод CLOSE. При этом объекты, созданные с этим подключением, не могут быть далее использованы, если только подключение не осуществлялось к главной БД (БД по умолчанию).

Для обработки ЛЕР БД в данном классе присутствуют следующие методы: COMMIT – для подтверждения, ROLLBACK – для отмены. При создании экземпляра данного класса ЛЕР БД открывается неявно.

Обработка исключений

Для обработки исключений в ADBC используется класс CX_SQL_EXCEPTION. Кроме текста исключения, в данном классе присутствуют следующие атрибуты:

Атрибут Значение
DB_ERROR «X», Если SQL выражение не выполнено СУБД. SQL_CODE и SQL_MESSAGE содержат подробную информацию.
DBOBJECT_EXISTS «X», Если вы пытаетесь создать объект, который уже существует. DB_ERROR так же содержит «X».
DBOBJECT_NOT_EXISTS «X», Если вы пытаетесь получить доступ к объекту, которого не существует. DB_ERROR так де содержит «X».
DUPLICATE_KEY «X», Если DML выражение нарушает уникальность ключа. DB_ERROR так де содержит «X».
INTERNAL_ERROR Внутренняя ошибка СУБД, для подробных данных смотрите журналы СУБД.
INVALID_CURSOR «X», если вы используете не активный курсор БД.
SQL_CODE Код ошибки в SQL выражении, Если DB_ERROR — «X».
SQL_MESSAGE Расшифровка кода ошибки в SQL выражении, если DB_ERROR — «X».

SAP справка на тему ADBC.