【问题标题】:How do I create and select from an in memory table in PL/SQL?如何从 PL/SQL 中的内存表中创建和选择?
【发布时间】:2017-01-01 02:33:05
【问题描述】:

我正在使用 Oracle 的 PL/SQL,并想创建一个内存表,我可以从中进行选择。

假设我有一个只有 20 条记录的表,其中包含两列: special_id(int), out_date(日期)

我想收集这 20 条记录并将它们保存在内存中,这样我就不必执行相同的选择 10,000 次,并且我希望以后能够访问这 20 条记录。

然后我有一个循环运行不同的查询,我想在该循环内执行以下等效操作:

select out_date 
from in_memory_table 
where in_memory_table.special_id = cursor.special_id (where cursor is from my current loop).

注意:在任何情况下循环遍历 in_mempry_table 都是没有意义的。我只需要能够访问该表中的数据。

我没有在这里包含实际代码,因为我必须做大量的重新编码工作才能不泄露公司信息。

【问题讨论】:

  • 你有什么样的桌子?如果你有一个在 SQL 中定义的嵌套表,你可以select out_date from table(local_collection_variable) where ...。虽然从 SQL 中获取一堆数据,将其加载到 PL/SQL VM,然后将其全部推回 SQL VM,但通常没有多大意义。我猜您最好将用于将集合填充到游标定义中的表中的任何表加入。
  • 如果有足够的内存并且该表被足够频繁地访问,则常规表将自动保存在“内存中”(=缓冲区缓存)。您甚至可以告诉 Oracle 将表的数据固定到缓冲区缓存中。
  • @WickedJester 为什么不能使用常规表或联接?您是否担心性能或简化代码?如果是性能的话,从 20 行表中选择所有行 10000 次只需要半秒左右。
  • 我可以向您保证,PL/SQL 既不是可憎的也不是脚本语言。

标签: sql oracle plsql


【解决方案1】:

如上所述,这样做可能没有多大意义,但您可以使用某种hashmap 来为您完成这项工作。这使用关联数组。

1) 在程序开始时填充哈希图

for x in (select out_date, special_id from input_table) loop
   my_hashmap(x.special_id) := x.out_date;
end loop;

2) 当您需要 out_date 时,您可以使用

代替 select
curr_out_date := my_hashmap(cursor.special_id);

3) 享受,希望它有助于使 plsql 对您更友好

【讨论】:

    猜你喜欢
    • 2017-05-29
    • 1970-01-01
    • 2015-06-14
    • 2020-10-19
    • 1970-01-01
    • 2012-03-24
    • 1970-01-01
    • 2011-07-08
    • 1970-01-01
    相关资源
    最近更新 更多