Sql 如何使用HANA存储过程的输入参数中的字段为execute\U immediate语句动态生成表名?
我一直在尝试解决一个需求,但运气不好,因为我必须将一个包含3个字段的表从AMDP传递到存储过程:对象名称、客户和位置。存储过程应用于返回存储相同客户、位置和最小值(日期)的表 最小值(日期)可在从对象名称派生的表中找到,如下所示: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语句(可能?),以确定客户在
'“/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(通过
view)中获取ADSO的使用位置列表object\u DEPENDENCIES
- 它在对象替换方面没有灵活性:想象一下,有一天您将需要使用复合提供程序或infoobject主数据表进行查找。在HANA端,您无法轻松地获得用于此目的的基表。此外,您将使用的所有字段在所有对象中应具有相同的名称,或者应作为参数传递
INFOPROV
维度,而不是动态对象名称。或者不是很好,但工作方式-使用HANA中默认生成的0BW:BIA:
列视图访问相同的数据UNION
中,并带有对象标识符列,编码在SELECT
列表中,用于对应的对象RSDRI\u INFOPROV\u READ
功能模块从ABAP中所需的infoprovider(动态名称传递)读取该数据,然后将该数据传递给AMDPEXEC
或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不是一个好主意,因此我不再重复
我推荐的解决方案方法需要更多的步骤,并将用于数据选择和数据处理/查询计算的代码分离开来
这里描述了包括演示在内的完整方法:,因此这里给出了该方法的大致轮廓:
- 创建一个表函数,该函数对适当的表类型而不是特定表执行所需的计算
- 对于要在其上使用逻辑的每个表,创建样板代码,从表中进行选择并将其转换为与表函数的表类型相匹配
- 现在,只有样板代码依赖于物理表(无论如何,您都必须拥有它,因为您需要在某处输入表的参数),并且计算/业务逻辑独立于任何物理表
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;