是否可以在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;