【发布时间】: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 既不是可憎的也不是脚本语言。