首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用HANA存储过程的输入参数中的字段为execute_immediate语句动态生成表名?

如何使用HANA存储过程的输入参数中的字段为execute_immediate语句动态生成表名?
EN

Stack Overflow用户
提问于 2020-11-09 23:11:46
回答 2查看 1.8K关注 0票数 1

我一直试图解决一个需求,但没有成功,我必须将包含3个字段的表传递给存储过程:对象名称、客户和位置(从AMDP到存储过程)。存储过程应用于返回存储相同客户、位置&min(日期)的表。

min(date)位于从对象名称派生的表中,如下所示:'"/BIC/A' || (object name passed from AMDP) || 2"'的级联。因此,假设AMDP将参数对象作为YCUSTM01传递,那么查找最小日期的表名应该是"/BIC/AYCUSTM012"。因此,我应该能够做一个execute_immediate语句(也许?)若要查找特定位置上的客户的最小日期,请将该表返回AMDP进行进一步计算。

输入表:

代码语言:javascript
复制
| Object_name | Customer | Location |
+-------------+----------+----------+
| YCUSTM01    | Walgreen | Chicago  |

"/BIC/AYCUSTM012"中的样本数据

代码语言:javascript
复制
| Customer | Location | Date       |
+----------+----------+------------+
| Walgreen | Chicago  | 24.09.2020 |
| Walgreen | Chicago  | 07.02.2019 |
| Walgreen | Chicago  | 12.12.2012 |
| Walgreen | Chicago  | 01.04.2015 |

存储过程的期望输出表:

代码语言:javascript
复制
  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 |

任何线索都将不胜感激。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-11-15 06:29:19

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

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

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

包括演示在内的完整方法在这里描述:Lars Breddemann博客:将业务逻辑从表中分离出来,避免动态SQL,因此这里给出了它的大致轮廓:

  • 创建一个表函数,在适当的表类型上执行所需的计算,而不是特定的表。
  • 对于每个要使用逻辑的表,创建从表中选择并转换为匹配表函数的表类型的样板代码。
  • 现在,只有样板代码依赖于物理表(无论如何,您需要输入表的参数),计算/业务逻辑与任何物理表无关。
票数 0
EN

Stack Overflow用户

发布于 2020-11-10 21:38:44

动态对象名有很多缺点。

  • 它违反了SAP BW所拥有的所有安全性。
  • 它不跟踪对象引用,因此您无法在ABAP或HANA中(通过OBJECT_DEPENDENCIES视图)为您的ADSO获取使用的列表。
  • 它在对象替换方面没有灵活性:想象一下,在某一天,您需要使用Composite或infoobject主数据表来查找。在HANA方面,您很难获得用于此的基本表。而且,您将使用的所有字段都应该在所有对象之间具有相同的名称,或者作为参数传递。

但也有一些选择。

  1. 创建复合提供程序,您将合并所有需要访问的对象,将客户名称和位置映射到输出,为该对象生成外部HANA视图,并在选择中使用它,并对INFOPROV维度进行限制,而不是动态对象名称。或者不是很好,但工作方式-使用默认情况下在HANA中生成的0BW:BIA:<infoprovname>列视图访问相同的数据。
  2. 复合提供程序上的一个变体,但来自ABAP端: create视图,它将所有的基表封装到带有对象标识符列的单个UNION中,并在SELECT列表中对相应的对象进行编码。
  3. 使用RSDRI_INFOPROV_READ函数模块从ABAP中所需的信息提供者(动态名称传递)读取数据,然后将该数据传递给AMDP。
  4. 对我来说,最坏的情况是,但只在HANA2.0中工作,因为在1.0中,INTOEXECEXECUTE IMMEDIATE中没有添加。生成动态SQL,在SQLScript中使用SQLScript语句并添加INTO,将其输出的内容获取为三个变量(用于客户、位置和日期),然后用select ... from dummy填充表格结果。
代码语言:javascript
复制
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;

我没有HANA2.0DBMS来检查如何使用绑定变量与USING一起传递参数到EXEC,而不是普通的连接,而且文档中没有它的示例。希望Lars将添加一些有关该功能的信息。

在这个动态代码上还有一点:如果可以的话,传递多个客户和要检索的位置,因为HANA解析中的单行处理所花费的时间几乎与数据检索过程相同(甚至是多倍)。因此,从联合数据中选择多个客户将表现得更好:

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64760571

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档