将 HANA 层次结构查询分配给 table 变量会导致结果不一致

Assigning a HANA hierarchy query to a table variable leads to inconsistent results

上下文

我想使用 HANA HIERARCHY_TEMPORAL 函数在具有时间间隔的 SAP KNVH 层次结构上工作; 当简单地在 SELECT 查询中使用时,它工作正常; 如果使用完全相同的查询但将其分配给 table 变量,则结果不一致。


我的问题

这个匿名块使用 HANA HIERARCHY_TEMPORAL 函数工作得很好 :

DO
BEGIN

    DECLARE hierarchy_type          CHAR(1);
    DECLARE valid_from              CHAR(8);
    DECLARE valid_until             CHAR(8);
    
    
    
    hierarchy_type  =   'A'             ;
    valid_from      =   '20211201'      ;
    valid_until     =   '20211201'      ;

        SELECT
            HIERARCHY_RANK              ,
            HIERARCHY_TREE_SIZE         ,
            HIERARCHY_PARENT_RANK       ,
            HIERARCHY_ROOT_RANK         ,
            HIERARCHY_LEVEL             ,
            HITYP                       ,
            VKORG                       ,
            VTWEG                       ,
            SPART                       ,
            KUNNR                       ,
            HKUNNR                      ,
            node_id                     ,
            parent_id                   ,
            valid_from                  ,
            valid_until                 ,
            DATAB                       ,
            DATBI
            
        FROM HIERARCHY_TEMPORAL (
            SOURCE 
            (
                    SELECT
                        HIERARCHY_COMPOSITE_ID(
                            HITYP   ,
                            VKORG   ,
                            VTWEG   ,
                            SPART   ,
                            KUNNR
                        )                       AS  node_id         ,
                        
                        CASE HKUNNR
                            WHEN    ''  THEN    NULL
                            ELSE                HIERARCHY_COMPOSITE_ID(
                                                    HITYP   ,
                                                    HVKORG  ,
                                                    HVTWEG  ,
                                                    HSPART  ,
                                                    HKUNNR
                                                )
                        END                     AS  parent_id       ,
                        
                                                    HITYP           ,
                                                    VKORG           ,
                                                    VTWEG           ,
                                                    SPART           ,
                                                    KUNNR           ,
                                                    HKUNNR          ,
                        
                        DATAB                   AS  valid_from      ,
                        DATBI                   AS  valid_until     ,
                        
                                                    DATAB           ,
                                                    DATBI                                       
                    
                    FROM    SAPKTP. KNVH
                    
                    WHERE   
                        KNVH.   HITYP   =   :hierarchy_type
                        
            )
            
            VALID FROM :valid_from UNTIL :valid_until
        );

END;

但是分配完全相同的块并在之后查询 table 变量会导致不一致的结果:

    DO
    BEGIN
        
    
    DECLARE tbl_CLIENT_HIERARCHY    TABLE (
        HIERARCHY_RANK              CHAR    ,
        HIERARCHY_TREE_SIZE         CHAR    ,
        HIERARCHY_PARENT_RANK       CHAR    ,
        HIERARCHY_ROOT_RANK         CHAR    ,
        HIERARCHY_LEVEL             CHAR    ,
        HITYP                       CHAR    ,
        VKORG                       CHAR    ,
        VTWEG                       CHAR    ,
        SPART                       CHAR    ,
        KUNNR                       CHAR    ,
        HKUNNR                      CHAR    ,
        node_id                     CHAR    ,
        parent_id                   CHAR    ,
        valid_from                  CHAR    ,
        valid_until                 CHAR    ,
        DATAB                       CHAR    ,
        DATBI                       CHAR
    );

    DECLARE hierarchy_type          CHAR(1);
    DECLARE valid_from              CHAR(8);
    DECLARE valid_until             CHAR(8);
    
    hierarchy_type  =   'A'             ;
    valid_from      =   '20211201'      ;
    valid_until     =   '20211201'      ;
    
    tbl_CLIENT_HIERARCHY =
        SELECT
            HIERARCHY_RANK              ,
            HIERARCHY_TREE_SIZE         ,
            HIERARCHY_PARENT_RANK       ,
            HIERARCHY_ROOT_RANK         ,
            HIERARCHY_LEVEL             ,
            HITYP                       ,
            VKORG                       ,
            VTWEG                       ,
            SPART                       ,
            KUNNR                       ,
            HKUNNR                      ,
            node_id                     ,
            parent_id                   ,
            valid_from                  ,
            valid_until                 ,
            DATAB                       ,
            DATBI
            
        FROM HIERARCHY_TEMPORAL (
            SOURCE 
            (
                    SELECT
                        HIERARCHY_COMPOSITE_ID(
                            HITYP   ,
                            VKORG   ,
                            VTWEG   ,
                            SPART   ,
                            KUNNR
                        )                       AS  node_id         ,
                        
                        CASE HKUNNR
                            WHEN    ''  THEN    NULL
                            ELSE                HIERARCHY_COMPOSITE_ID(
                                                    HITYP   ,
                                                    HVKORG  ,
                                                    HVTWEG  ,
                                                    HSPART  ,
                                                    HKUNNR
                                                )
                        END                     AS  parent_id       ,
                        
                                                    HITYP           ,
                                                    VKORG           ,
                                                    VTWEG           ,
                                                    SPART           ,
                                                    KUNNR           ,
                                                    HKUNNR          ,
                        
                        DATAB                   AS  valid_from      ,
                        DATBI                   AS  valid_until     ,
                        
                                                    DATAB           ,
                                                    DATBI                                       
                    
                    FROM    SAPKTP. KNVH
                    
                    WHERE   
                        KNVH.   HITYP   =   :hierarchy_type
                        
            )
            
            VALID FROM :valid_from UNTIL :valid_until
        );
                                        
    SELECT TOP 10 * FROM :tbl_CLIENT_HIERARCHY;

END;

有人知道为什么吗?

感谢您的帮助。

一个潜在的原因可能是缺少 SIBLING ORDER BY 子句(参见 https://help.sap.com/viewer/09f734c2169c4661b1aa15c00022ab21/2021_3_QRC/en-US/c44d60a76342456f91cb51054915a32e.html )。如果没有稳定的兄弟顺序,SAP HANA 层次结构生成器函数的行为可能不确定。

实际上这个问题与 HANA 层次结构无关:我只是没有在括号中准确说明声明的 table 变量的字符数,然后将其解释为 CHAR(1),前导奇怪的提取结果!