【问题标题】:how to save a query result in a temporary table within a procedure如何将查询结果保存在过程中的临时表中
【发布时间】:2015-03-16 14:48:10
【问题描述】:

我是甲骨文的新手,所以我提前为这个简单的问题道歉。 所以我有这个程序,在我运行查询时,我想保存查询结果以供进一步使用,特别是我想运行一个 for 循环,它将逐行获取我的选择并将一些值复制到另一个表中。目的是从父表开始填充子表(弱实体)。 为此,让我们假设我有一个查询:

select *
from tab
where ...

现在我想在本地范围内保存选择,因此生命周期仅限于过程本身(基本上就像 C 函数中的局部变量)。我怎样才能达到这样的结果?

基本上我有一个这样组成的课程表:

Schedule
--------------------------------------------------------
subject_code | subject_name | class_starting_date | starting hour | ending hour | day_of_week

所以我进行了查询以获取为当前学年安排的所有科目,并且我需要在结果集的每一行上使用函数 next_day 来填充下周安排的实际课程表。 我的坚持是: 我通过查询获得了需要安排在下周的课程,将结果保存在某处,然后使用 next_day 通过 for 循环(因为我需要上课的实际日期)填充“class_occurence”表。我不确定这是不是正确的思维方式,可能有一些东西可以在不先保存结果的情况下执行这项工作,也许是一个光标,谁知道......

【问题讨论】:

  • 我不知道这是否是做这种事情的最佳方式,这是我的第一个任务,因为我习惯于使用 c/java/c++ 和其他类似语言跨度>
  • 您是否需要多次迭代同一个数据集?您是否必须逐行执行此操作 - 如果您要将数据复制到另一个表,您可以 insert ... select 作为一个操作,还是先对数据做一些复杂的事情?

标签: oracle stored-procedures plsql


【解决方案1】:

Global Temporary tables 是一个不错的解决方案。只要您知道要插入的数据的结构(多少列和什么数据类型),您就可以将其插入到全局临时表中。只有执行插入的会话才能看到数据。可以使用某些选项删除或提交数据。

CREATE GLOBAL TEMPORARY TABLE my_temp_table (
  column1  NUMBER,
  column2  NUMBER
) ON COMMIT DELETE ROWS;

这对我来说非常有用,因为我需要汇总数据,但只需要很短的时间。

编辑:数据是本地的和临时的,临时表总是在那里。 如果您想在过程中将表放在内存中,这是另一种解决方案,但更复杂一些。

【讨论】:

  • 是否可以将它们设为本地?我只需要在我正在使用的程序的生命周期内汇总数据。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-02-06
  • 2020-12-05
  • 1970-01-01
  • 2015-03-05
  • 2021-11-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多