Как получить все дочерние узлы иерархической структуры в ABAP?

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

  • Я бы
  • predecessor_id
  • название

Начиная с заданного идентификатора, я должен иметь возможность извлекать все дочерние узлы (не только прямые дочерние узлы). Поскольку общие выражения таблиц (WITH RECURSIVE) недоступны в ABAP, что может быть лучшим способом для решения этой проблемы?

Возможное решение, о котором я думал, - это итерация набора результатов (LOOP или с помощью курсора) и рекурсивный вызов функции, которая извлекает прямые дочерние узлы. Тем не менее, я надеюсь, что есть более элегантный подход.

1 ответ

Прежде всего вам необходимо знать, что SAP не является базой данных, и OpenSQL всегда переводится на диалект SQL базовой базы данных. Если базовая база данных не поддерживает WITH или же WITH RECURSIVE и из того, что я вижу из следующей статьи, не каждая база данных делает это, поэтому добавление ее в OpenSQL не будет иметь никакого смысла, так как во многих случаях не будет ничего, чтобы сопоставить это.

Таким образом, первое решение было бы, как вы предложили, написать отдельную рекурсивную функцию / метод / подпрограмму или, если вы действительно хотите использовать базовую функциональность базы данных, вы можете использовать ADBC интерфейс. Если вы знакомы с JDBC тогда концепция не должна быть новой для вас. Однако, если вы делаете это для продуктивных целей, вам следует убедиться, что вероятность миграции базы данных в будущем невелика.

Решение с ADBC это работает для меня в системе SAP с базой данных Oracle.

REPORT Z_ADBC_TEST.

CLASS lcl_test DEFINITION.
    PUBLIC SECTION.
        CLASS-METHODS:
            main.
ENDCLASS.

CLASS lcl_test IMPLEMENTATION.
    METHOD main.
        DATA lo_sql_connection TYPE REF TO cl_sql_connection.
        DATA lo_sql_statement  TYPE REF TO cl_sql_statement.
        DATA lo_sql_result_set TYPE REF TO cl_sql_result_set.
        TYPES BEGIN OF lt_result_struct,
            n    TYPE i,
            fact TYPE i,
        END OF lt_result_struct.
        DATA lt_result TYPE TABLE OF t_result_struct WITH DEFAULT KEY.
        DATA lr_ref_to_data TYPE REF TO data.
        FIELD-SYMBOLS <fs_result> LIKE LINE OF lt_result.

        lo_sql_connection = cl_sql_connection=>get_connection( ).
        lo_sql_statement = lo_sql_connection->create_statement( ).
        GET REFERENCE OF lt_result INTO lr_ref_to_data.
        lo_sql_result_set = lo_sql_statement->execute_query(
            `WITH temp(n, fact) ` &&
            `AS (SELECT 0,1 FROM dual UNION ALL ` &&
            `SELECT n+1,(n+1)*fact FROM temp ` &&
            `WHERE n < 9) ` &&
            `SELECT * FROM temp`
        ).
        lo_sql_result_set->set_param_table( lr_ref_to_data ).
        WHILE lo_sql_result_set->next_package( ) > 0.
            LOOP AT lt_result ASSIGNING <fs_result>.
                WRITE: / <fs_result>-n, <fs_result>-fact.
            ENDLOOP.
        ENDWHILE.
    ENDMETHOD.
ENDCLASS.

END-OF-SELECTION.
    lcl_test=>main( ).
Другие вопросы по тегам