Периодически возникает потребность сделать запрос к таблицам баз данных или Hana объектам, например calculation view.
Делается это весьма просто.
- Нужно создать объект connection к базе данных;
- создать объект statement, оболочку для sql запроса;
- если это нужно, то получить результаты с помощью специального объекта result set.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
types: begin of result_s, value1 type i, value2 type string, value3 type numc5, value4 type p length 4 decimals 3, end of result_s. data: result_data type ref to data. field-symbols: <result_table> type any table. create data result_data type table of result_s. assign result_table->* to <result_table>. data: connection type ref to cl_sql_connection, statement type ref to cl_sql_statement, result_set type ref to cl_sql_result_set. try. data(sql) = |select ...|. connection = cl_sql_connection=>get_connection( con_name = 'DEFAULT' ). statement = new #( con_ref = connection ). result_set = statement->execute_query( sql ). result_set->set_param_table( result_table ). result_set->next_package( ). result_set->close( ). catch cx_sql_exception into data(ex). write ex->get_text( ). endtry. |
После выполнения этого кода, в <result_table> будут находиться результаты запроса из базы данных.
Вызов SQL команды с результирующей структурой
Данную конструкцию можно легко положить в статичный метод глобального класса. Таким образом вызов будет выглядеть следующим образом.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
types: begin of result_s, value1 type i, value2 type string, value3 type numc5, value4 type p length 4 decimals 3, end of result_s. data: result_data type ref to data, comment type string, status(1). field-symbols: <result_table> type any table. create data result_data type table of result_s. assign result_data->* to <result_table>. data(sql) = |select ...|. zcl_sql_executor=>result( exporting i_query = sql importing e_comm = comment e_status = status changing c_data_table = result_data ). |
Аналогично, после выполнения этого кода, результат будет в <result_table>. В исходящей переменной comment будет сообщение об SQL ошибке, если такая будет. Формат ошибки получается таким же, как и в SQL консоле. В переменной status будет char из одной позиции, который может принимать 2 значения
- S — success (успех);
- E — error(ошибка).
Для удобства я добавил еще пару статических методов.
Вызов SQL команды без результирующей структуры
1 |
zcl_sql_executor=>execute( |insert into "SCHEMA"."TABLE" ("FIELD") select FIELD_ from SCHEMA.TABLE_| ). |
Аналогично, в исходящих параметрах есть comm и status.
Вызов Hana модели с динамической структурой
В примерах выше, для того что бы вернуть результат запроса, нужно было создавать результирующую структуру result_s. Однако для calculation view, эту структуру можно формировать динамически. Вызов будет следующим.
1 2 3 4 |
data(sql) = |select ...|. data(result_data) = zcl_sql_executor=>result_hana_model( exporting i_query = sql ). field-symbols: <result_table> type any table. assign result_data->* to <result_table>. |
В <result_table> будет результат запроса
Так же при помощи этого метода, можно получить каталог полей ( field catalog ) Hana модели, путь, название схемы и имя модели, не выполняя при этом сам запрос.
1 2 3 4 5 6 7 8 9 10 11 |
data: catalog type lvc_t_fcat, schema type string, patch type string, model_name type string. data(sql) = |select ...|. zcl_sql_executor=>result_hana_model( exporting i_query = sql i_execute = abap_false importing e_catalog = catalog e_schema = schema e_patch = patch e_model_name = model_name ). |
Исходный код класса zcl_sql_executor
Полный исходный код можно найти по ссылке