Sql 如何使用HANA存储过程的输入参数中的字段为execute\U immediate语句动态生成表名?

Sql 如何使用HANA存储过程的输入参数中的字段为execute\U immediate语句动态生成表名?,sql,stored-procedures,dynamic-sql,hana,execute-immediate,Sql,Stored Procedures,Dynamic Sql,Hana,Execute Immediate,我一直在尝试解决一个需求,但运气不好,因为我必须将一个包含3个字段的表从AMDP传递到存储过程:对象名称、客户和位置。存储过程应用于返回存储相同客户、位置和最小值(日期)的表 最小值(日期)可在从对象名称派生的表中找到,如下所示:'“/BIC/a'| | |(从AMDP传递的对象名称)| | 2”。因此,假设AMDP将参数对象作为YCUSTM01传递,那么查找最小日期的表名应该是“/BIC/AYCUSTM012”。因此,我应该能够做出execute_immediate语句(可能?),以确定客户在

我一直在尝试解决一个需求,但运气不好,因为我必须将一个包含3个字段的表从AMDP传递到存储过程:对象名称、客户和位置。存储过程应用于返回存储相同客户、位置和最小值(日期)的表

最小值(日期)可在从对象名称派生的表中找到,如下所示:
'“/BIC/a'| | |(从AMDP传递的对象名称)| | 2”
。因此,假设AMDP将参数对象作为
YCUSTM01
传递,那么查找最小日期的表名应该是
“/BIC/AYCUSTM012”
。因此,我应该能够做出execute_immediate语句(可能?),以确定客户在特定位置的最短日期,并将该表返回给AMDP进行进一步计算

输入表:

| Object_name | Customer | Location |
+-------------+----------+----------+
| YCUSTM01    | Walgreen | Chicago  |
”/BIC/AYCUSTM012“
中的样本数据:

存储过程的所需输出表:

  select
    customer,
    location,
    min(calday)
  from "/BIC/AYCUSTM012"
  where customer = :customer
    and location = :location
  group by
    customer,
    location;

  | Customer | Location | Min_date   |
  +----------+----------+------------+
  | Walgreen | Chicago  | 12.12.2012 |


任何潜在客户都将不胜感激。

动态对象名称有很多缺点

  • 它违反了SAP BW拥有的所有安全性
  • 它不跟踪对象引用,因此您无法在ABAP或HANA(通过
    object\u DEPENDENCIES
    view)中获取ADSO的使用位置列表
  • 它在对象替换方面没有灵活性:想象一下,有一天您将需要使用复合提供程序或infoobject主数据表进行查找。在HANA端,您无法轻松地获得用于此目的的基表。此外,您将使用的所有字段在所有对象中应具有相同的名称,或者应作为参数传递
但也有一些选择

  • 创建复合提供程序,在该提供程序中,您将合并需要访问的所有对象,将客户名称和位置映射到输出,为此对象生成外部HANA视图,并在您的选择中使用该视图,同时限制
    INFOPROV
    维度,而不是动态对象名称。或者不是很好,但工作方式-使用HANA中默认生成的
    0BW:BIA:
    列视图访问相同的数据
  • 复合提供程序的一个变体,但来自ABAP端:CREATECDS视图,它将所有基表包装到单个
    UNION
    中,并带有对象标识符列,编码在
    SELECT
    列表中,用于对应的对象
  • 使用
    RSDRI\u INFOPROV\u READ
    功能模块从ABAP中所需的infoprovider(动态名称传递)读取该数据,然后将该数据传递给AMDP
  • 对我来说最坏的情况是,但只在HANA 2.0中有效,因为在1.0中,
    EXEC
    executeimmediate
    中没有
    添加到
    中。生成动态SQL,在SQLScript中使用
    执行IMMEDIATE
    语句并将
    添加到
    加法中,将其输出的内容抓取为三个变量(客户、位置和日期),然后用
    选择填充表格结果。。。从虚拟机开始
  • executeimmediate'选择客户、地点、分钟(日期)
    从…起
    其中customer=''客户:p|u客户''
    和位置=“”“| |”:p|u loc |”
    按客户分组,地点'
    输入lv_客户、lv_loc、lv_日期;
    外页=
    选择:lv_客户作为客户
    :lv_loc作为位置,
    :lv_日期作为min_日期
    来自虚拟;
    
    我没有HANA 2.0 DBMS来检查如何将绑定变量与
    一起使用
    来传递参数到
    EXEC
    ,而不是普通的连接,文档中也没有这样的例子。希望Lars能添加一些关于该功能的信息

    关于动态代码还有一点:如果可以,请传递多个客户和位置以进行检索,因为对于HANA中的单行处理,解析所需的时间几乎与数据检索过程所需的时间相同(或者可能是多倍)。因此,从多个客户的联合数据中选择将更好地执行:

    非常正确:在代码中直接访问SAP BW ADSO表不是最好的方法。相反,建议使用这些ADSO对象的外部视图

    但这并不是动态SQL方法的主要问题。同样,astentx已经全面概述了为什么使用动态SQL不是一个好主意,因此我不再重复

    我推荐的解决方案方法需要更多的步骤,并将用于数据选择和数据处理/查询计算的代码分离开来

    这里描述了包括演示在内的完整方法:,因此这里给出了该方法的大致轮廓:

    • 创建一个表函数,该函数对适当的表类型而不是特定表执行所需的计算
    • 对于要在其上使用逻辑的每个表,创建样板代码,从表中进行选择并将其转换为与表函数的表类型相匹配
    • 现在,只有样板代码依赖于物理表(无论如何,您都必须拥有它,因为您需要在某处输入表的参数),并且计算/业务逻辑独立于任何物理表

    非常感谢您的回复。前两个选项实际上不是一个选项,因为它们需要一个HCPR或一个CDS视图,其中包含系统中所有ADSO的并集,因为我们需要一个可重用的存储过程,在传递参数(ADSO名称)时,它可以返回相同的表,将来被任何AMDP使用。第三个选项非常有趣。我下一步肯定会尝试。第四个选项是我尝试过但无法实现的,我们已经使用HANA2&因此希望尝试使用动态sql执行即时操作,但未能实现。非常感谢您的输入,非常感谢。顺致敬意,
      select
        customer,
        location,
        min(calday)
      from "/BIC/AYCUSTM012"
      where customer = :customer
        and location = :location
      group by
        customer,
        location;
    
      | Customer | Location | Min_date   |
      +----------+----------+------------+
      | Walgreen | Chicago  | 12.12.2012 |
    
    
    execute immediate 'select customer, location, min(date)
    from <dyn_tab_name>
    where customer = ''' || :p_cust || '''
      and location = ''' || :p_loc || '''
    group by customer, location'
      into lv_cust, lv_loc, lv_date;
    
    outTab =
      select :lv_cust as customer
        :lv_loc as location,
        :lv_date as min_date
      from dummy;