HANA程序中的本地临时表

2020-08-20 17:57发布

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


专家们,

我对临时表洞察SAP HANA程序有疑问。 如果我以以下方式使用本地SQL编辑器,那么它将起作用:

创建本地临时表#test_table(mandt VARCHAR(3),type_id VARCHAR(4));

插入#test_table值('001','Dum');
插入# test_table值('002','Dum2');

SELECT
mandt,
type_id
从#test_table
mandt ='001';

但是现在我想对具有编辑权限的过程使用相同的见解。 所以我写下了以下内容:

创建过程" _SYS_BIC"。" d052319/DEMO_PROC"(在MANDT VARCHAR(3)中,
在OUTPUT_TABLE" _SYS_BIC"中。" d052319/DEMO_PROC/tabletype/OUTPUT_TABLE")

语言SQLSCRIPT sql安全定义程序为

/*********开始过程脚本************/
开始

创建本地临时表#test_table(mandt VARCHAR(3),type_id VARCHAR(4));

插入#test_table值(mandt,'Dum1');
插入#test_table值 ('002','Dum2');

output_table =
SELECT
mandt,
type_id
从#test_table
哪里mandt = mandt;

END
;

但是通过执行,我得到了表#test_table不存在的错误。 如果您在过程中创建表并尝试直接访问它们,也会发生同样的事情。 但是有没有可能说在前面的行中使用创建的表?

如果需要更多详细信息,则错误消息为:

无法执行'创建过程" _SYS_BIC"。" d052319/DEMO_PROC"(在MANDT VARCHAR(3)中,在OUTPUT_TABLE中......

SAP DBTech JDBC:[259](在353):无效的表名:在模式D052319中找不到表/视图#TEST_TABLE:第9行第15列(在pos 353)

致以最诚挚的问候,并感谢所有对您有帮助的人,

马丁

         点击此处--->   EasySAP.com群内免费提供SAP练习系统(在群公告中)

加入QQ群:457200227(SAP S4 HANA技术交流) 群内免费提供SAP练习系统(在群公告中)


专家们,

我对临时表洞察SAP HANA程序有疑问。 如果我以以下方式使用本地SQL编辑器,那么它将起作用:

创建本地临时表#test_table(mandt VARCHAR(3),type_id VARCHAR(4));

插入#test_table值('001','Dum');
插入# test_table值('002','Dum2');

SELECT
mandt,
type_id
从#test_table
mandt ='001';

但是现在我想对具有编辑权限的过程使用相同的见解。 所以我写下了以下内容:

创建过程" _SYS_BIC"。" d052319/DEMO_PROC"(在MANDT VARCHAR(3)中,
在OUTPUT_TABLE" _SYS_BIC"中。" d052319/DEMO_PROC/tabletype/OUTPUT_TABLE")

语言SQLSCRIPT sql安全定义程序为

/*********开始过程脚本************/
开始

创建本地临时表#test_table(mandt VARCHAR(3),type_id VARCHAR(4));

插入#test_table值(mandt,'Dum1');
插入#test_table值 ('002','Dum2');

output_table =
SELECT
mandt,
type_id
从#test_table
哪里mandt = mandt;

END
;

但是通过执行,我得到了表#test_table不存在的错误。 如果您在过程中创建表并尝试直接访问它们,也会发生同样的事情。 但是有没有可能说在前面的行中使用创建的表?

如果需要更多详细信息,则错误消息为:

无法执行'创建过程" _SYS_BIC"。" d052319/DEMO_PROC"(在MANDT VARCHAR(3)中,在OUTPUT_TABLE中......

SAP DBTech JDBC:[259](在353):无效的表名:在模式D052319中找不到表/视图#TEST_TABLE:第9行第15列(在pos 353)

致以最诚挚的问候,并感谢所有对您有帮助的人,

马丁

付费偷看设置
发送
5条回答
huskylover
1楼 · 2020-08-20 18:37.采纳回答

嗨,马丁,


对此做了一些测试。 结论是您不能在过程中使用本地临时表-不支持此操作。 如果这样做,您将面临以下问题:

a。 在当前会话中-您只能调用该过程一次。 当您再次调用它时,它将错误,因为该表已存在并且无法再次创建。 您可以通过在create语句之前放置drop语句来解决此问题,但是最终会遇到问题(b)。

b。 在下一个会话中-您将无法调用该过程,因为drop语句将失败,因为此时临时表将不存在。

您可以改用全局临时表 (只有元数据是持久的)或普通表(元数据和数据都是持久的)。

您既可以在过程外部创建全局临时表,也可以在内部插入语句,或者在内部使用"创建" 之前带有" drop table"语句,这样您就不会在第二次调用该过程时出错。

希望有帮助。

谢谢

< p> Anooj

clasier
2楼-- · 2020-08-20 18:39

嗨,马丁,

正如我先前的回复中所建议的那样,您不能使用全局临时表来满足您的要求吗?

请记住,只有全局临时表的元数据会保留。 当您离开HANA会话时,实际数据内容将被删除/截断。

一个例子是:

创建全局临时表" SYSTEM"。" test_table"(命令VARCHAR(3) ,type_id VARCHAR(4));

创建过程" SYSTEM"。" DEMO_PROC"(在MANDT VARCHAR(3)中,

在OUTPUT_TABLE" SYSTEM"中。" OUTPUT_TABLE")

语言SQLSCRIPT sql安全定义程序为

/*********开始过程脚本************/

< p> BEGIN

截断表" SYSTEM"。" test_table";

插入" SYSTEM"。" test_table"值(:mandt,'Dum1');

插入" SYSTEM"。" test_table"值('002','Dum2');

output_table =

SELECT

mandt,

type_id

来自" SYSTEM"。" test_table"

其中mandt =:mandt;

END;

谢谢

Anooj

Aaron 3364
3楼-- · 2020-08-20 18:33

嗨,

对于那些在搜索临时表主题时落入此处的用户:本地临时表的此限制已在Hana的当前版本中修复,因此可以在存储过程中创建本地临时表。 应该在会话自动完成时删除它们,但是在过程结束时删除它们不会有任何伤害。 另外,请确保使用正确类型的临时表-基于行或列。 如果将这样的临时表与不同类型的持久化表结合使用,这将很重要。 由于不同的商店使用了不同的引擎,因此引擎之间的数据传输将影响大量数据的性能

史蒂夫,交易范围取决于您执行命令的方式。 您可以从应用程序启动交易。 然后,通过启动事务并提交或回滚来定义事务范围。

此外,每个无名存储过程在没有外部启动的事务触发时都有其自己的事务范围。 然后,调用堆栈顶部的存储过程将定义其范围。 所有嵌套的SP调用都将绑定到该事务。 我认为SQL Server的工作方式完全相同


Artem

Climb_Ma
4楼-- · 2020-08-20 18:31

嗨,是的,我认为在最新版本中解决了创建本地临时表的限制。 但是,我在执行程序时注意到一个问题。 这是问题描述:

我正在创建一个循环过程和一个包装过程。 包装SP调用循环SP多次,然后在同一会话中运行。 但是,当循环过程的每次运行完成时,尽管该执行已完成,但在最后一次执行期间消耗的内存仍会出现在包装程序下。
我确实观察到DROP本地临时表不会释放内存,因此我改用了DELETE,但它似乎没有任何区别,并且直到最后一次执行继续增加包装程序之前,内存才起作用。

对此有任何解决方案吗?

能不能别闹
5楼-- · 2020-08-20 18:36

问候,

此帖子回答了我的许多问题-谢谢。 没有得到回答的一件事是HANA会话的范围是什么? 什么定义了会话的开始和结束?

我需要确保,如果我有一个全局表,例如有一个存储错误代码的VARCHAR(3)字段,并且会话一没有遇到错误,而会话二却遇到了错误,则这两个 会话在它们都处于活动状态时不会互相干扰-即每个会话都获得自己的唯一全局表实例。

将在交易应用程序中使用HANA,以便可以通过多个会话多次调用该过程。

预先感谢

史蒂夫

一周热门 更多>