在SAP HANA表函数中使用WITH语句

  • 本文关键字:WITH 语句 函数 SAP HANA hana
  • 更新时间 :
  • 英文 :


是否可以在SAP HANA表函数中使用WITH语句,或者在表函数中是否可以使用其他语句?

CREATE OR REPLACE FUNCTION "MY_SCHEMA"."TF_TEST_1" ()
RETURNS TABLE ( 
mytext NVARCHAR(200)
) LANGUAGE SQLSCRIPT SQL SECURITY INVOKER AS
BEGIN RETURN
WITH X AS (SELECT 'asdf' AS mytext FROM dummy)
SELECT * FROM X;
END;

在table函数中,您需要显式返回一个带有return语句的表。如实验所示,return内部不允许使用with(类似于CTAS:从select语句创建以with开头的表会抛出错误(。

但您可以将语句的结果分配给表变量并返回它

create function test_tf (x int)
returns table (
id int
)
as begin
res = with a as (
select x as id
from dummy
)
select *
from a;
return(:res);
end;
select *
from test_tf(1);

|   | ID|
|--:|--:|
|  1|  1|

但在HANASQL脚本中,我们更喜欢使用表变量,而不是with语句,因为它们允许逐步调试代码,而无需重写代码,也无需作为SQL语句在外部运行,在每个with后面都有准备好的输入和select。你可以即时申报,这样你就不会提前申报一些奇怪的事情。所以重写它的方法是:

alter function test_tf (x int)
returns table (
id int
)
as begin
/*with a as */
a =
select x as id
from dummy
;

res = 
select *
from :a;
return(:res);
end;

注意:当您访问表变量时,唯一需要做的就是在它之前添加一个冒号,这样解析器就可以将它与表名区分开来。

如果您想在作为函数发布之前调试代码,只需将create function语句替换为do,将return替换为select * from <return variable>。要查看中间结果,您仍然需要将select * from :table_var放在中间的某个位置,因为据我所知,匿名块不允许使用调试器进行调试。

do (in x int => ?)
begin
/*with a as */
a =
select x as id
from dummy
;

res = 
select *
from :a;
select * from :res;
--return(:res);
end;

最新更新