2017-01-25 34 views
1

如何读取SAP Hana SQL脚本中过程的表格类型参数的内容?在SAP Hana中读取表类型输出

示例过程:

create procedure "MYSCHEMA".ReturnTypeTest(out OUTPUT_TABLE "MYSCHEMA"."RESOUT") 
as 
begin 
    create local temporary table #temp ("COL1" bigint, "COL2" bigint, "COL3" bigint); 

    insert into #temp values(1, 2, 3); 
    insert into #temp values(4, 5, 6); 
    insert into #temp values(7, 8, 9); 

    OUTPUT_TABLE = select * from #temp; 

    drop table #temp; 
end; 

表类型(输出该参数):

create type "MYSCHEMA"."RESOUT" as table ("COL1" bigint, "COL2" bigint, "COL3" bigint); 

当我调用过程如下,它显示在SAP HANA Studio的结果窗格全部内容但我怎样才能以编程方式获得它?

call "MYSCHEMA"."RETURNTYPETEST"(?); 

回答

0

过程的输出变量只能分配给SQLScript上下文中的变量。
此例外是默认结果集,它被绑定到过程中执行的最后一条SELECT命令。
如果您的意图是生成可以选择的内容,您可能需要使用表类型的用户定义函数(TUDF)

两点意见您的示例代码:

  1. 使用临时表是不是一个好主意,如果性能是您的应用程序的关注。虽然命令式代码经常出现 更直观,但它确实倾向于在执行语句时阻止并行。

  2. 通过包含数据操作,计算和结果集返回,这是非常(太)容易过载单个过程功能。如果可能的话,宁愿选择更小的功能单元,并将功能拆分为多个对象。

好吧,你澄清后,你实际上只是想访问SQLScript结果集,而不是在普通的SQL,我可以添加这对我的回答: 检查了我的第一句写道!您可以简单地将过程的任何输出变量分配给相应的变量。 该文档有关于HANA documentation: CALL的示例。 例如,如果你的输出结构是一个包含它可能看起来像该用户信息表:

DECLARE uaccounts TABLE (USERID bigint, USERNAME NVARCHAR(256), CREATED date); 
DECLARE expdate date := current_date; 

/* In this example the procedure 'get_expired_useraccounts_by date' has got 
    the IN parameter expiry_date (date) and 
    the OUT parameter expired_accounts (table structure). 

    By assigning the variable uaccounts to the OUT parameter, the result set 
    automatically gets bound to uaccounts.*/ 

call get_expired_useraccounts_by_date (:expdate, :uaccounts); 

/* from here you can use :uaccounts like a table variable*/ 

SELECT count(*) FROM :uaccounts; 

所有这一切,当然,参考文档和开发者指南的一部分...

+0

感谢您的回复,但由于函数在SAP Hana中只读,因此无法用于我们的情况。除了TUDF,我们还有其他选择吗? – Amiga500

+0

好的,所以你想要一个过程来改变数据并返回一个可以从普通SQL读取的结果集?不,我没有办法做到这一点。对于你的例子,你可以简单地运行该过程并从temp中选择修改后的数据。表 - 数据会随着会话的进行而变化,因此您可能会滥用这种方式来交换数据。但是要意识到这是一个非常糟糕的设计,并且您可能想要做的大部分数据操作都可以在不写入/更新表中的数据的情况下完成。您在这里选择的方式是表现最差的方法。 –

+0

不,我不想从普通的SQL读取输出参数。我需要在另一个过程的主体中调用此过程,并处理它返回的内容。但我不知道如何处理表格类型的输出。如果它是一个标量输出参数,我可以简单地为它声明一个变量,但我无法弄清楚用于表格输出参数的数据结构。 – Amiga500

-1

您可以查询元数据 请检查系统的观点如下SQLScript选择

select table_type_schema, table_type_name, * 
from PROCEDURE_PARAMETERS 
where 
schema_name = UPPER('MYSCHEMA') and 
procedure_name = UPPER('ReturnTypeTest') and 
parameter_name = UPPER('OUTPUT_TABLE') 

我希望它能帮助

+0

谢谢,它返回过程参数,但我如何查询/读取out参数(这是一个表类型)的内容? – Amiga500

+0

这个答案没有解决OP的问题。 –

0

能否请您检查以下SQLScript

declare lt_list "MYSCHEMA"."RESOUT"; 
call "MYSCHEMA"."RETURNTYPETEST"(lt_list); 
select * from :lt_list; 

这应该显示输出参数表使用最后的SELECT语句