【问题标题】:Store the result of a select statement within a stored procedure将 select 语句的结果存储在存储过程中
【发布时间】:2014-08-02 20:53:54
【问题描述】:

这是一个 Teradata v14 特定问题。

如何将查询结果存储在存储过程中以供进一步处理。

我看过的选项:

  • volatile 临时表 - 但需要在存储之前创建 程序
  • 派生表 - 但它只保存一个查询期间的结果

结果需要在存储过程期间可用。

还有其他选择吗?

2014 年 6 月 16 日更新: 根据答案和 cmets,似乎 volatile table 是最好的答案。但是,然后我们尝试使用 volatile 表,存储过程抱怨该表不存在。有没有办法解决这个问题?

【问题讨论】:

  • 你的意思是你想在你的 proc 中存储数据以供进一步处理?您是什么意思需要在该过程之前创建易失性表?您只需在过程中声明表即可。
  • @Andrew:是的,我的意思是我想在存储过程中进行处理。存储过程可以同时执行多次。在存储过程中声明 volatile 表会引发错误,指出该表不存在。
  • 不,易失性表不是最佳答案。按照 Rob 的建议使用全局临时表。在您创建您的 SP 之前创建它一次(您也可以在您的 SP 中创建它并捕获“表已存在”错误,但它不值得源代码中的开销),在您的 SP 中只需像使用任何其他表一样使用它,每个会话都会有自己的物化实例。
  • @dnoeth:谢谢,全局临时表是存在于模式中还是存在于服务器上的所有模式中?为什么它比永久桌子好?
  • GTT 的定义存储在数据库中,就像永久表一样。但是每个永久表都需要一个唯一的名称,而每个会话可以将不同的数据插入到同一个 GTT 中。而且您不必删除表,会话的 GTT 版本在注销期间会像易失性表一样自动删除。

标签: stored-procedures teradata


【解决方案1】:

您考虑过全局临时表吗?

表定义存储在 DBC 数据字典中,并在被 SQL 引用时在会话期间实例化。与 volatile 表一样,全局临时表是特定于会话的。与 volatile 表不同,全局临时表依赖于用户的临时空间而不是 spool 空间。

【讨论】:

  • 谢谢,我有,但是从存储过程中创建表似乎会抛出一个错误,指出该表不存在。另外,如果存储过程同时被启动多次会发生什么? (不一定在同一个会话中)
  • 如果我的回答不清楚,我深表歉意 - 在存储过程之外创建全局临时表。然后,您可以根据需要在存储过程中简单地引用它。
  • GTT 的每个“实例”都是特定于会话的,因此如果多个用户同时执行该过程,他们每个人都会有一个单独的 GTT 实例。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多