【问题标题】:PLSQL - Searching for record in a Nested Table that was Bulk CollectedPLSQL - 在批量收集的嵌套表中搜索记录
【发布时间】:2013-10-24 04:36:20
【问题描述】:

我使用bulk collect 将记录提取到嵌套表中。我想用exists 方法搜索一条记录,但没有成功。然后我发现exists 方法使用索引并且不查找值。我是否需要遍历每条记录并搜索匹配项?是否有更短的方法可以做到这一点,因为我将对大量记录使用相同的逻辑?

我在网站上读到bulk collect 在使用 varchar 作为键时不能与关联数组一起正常工作,所以我改用嵌套表。另外,我不想读取每条记录并将其存储在哈希图中,因为它会降低性能。

Create table sales(
   name varchar2(100)
)
insert into sales(name) values('Test');
insert into sales(name) values('alpha');
insert into sales(name) values(null);


declare
 type sales_tab is table of varchar2(1000);
 t_sal sales_tab;
 begin
 select name bulk collect into t_sal from sales;


 if(t_sal.exists('Test')) THEN
   dbms_output.put_line('Test exists');
 END IF;

 dbms_output.put_line(t_sal.count);
end;

【问题讨论】:

  • 为什么不在查询中添加 WHERE 子句?这将使其更快并使用更少的内存。
  • 不能使用 where 子句,因为当我处理大数据时,即使我有索引也需要很多时间。
  • “不能”?如果这是一个查询性能问题,那么我几乎 100% 肯定在 PL/SQL 中进行过滤不会使其更快。
  • 非常感谢。将尝试再次检查 where 子句。可能是我忽略了sql查询性能。

标签: sql oracle plsql


【解决方案1】:

exists() 函数告诉您是否存在具有整数或 varchar2(对于 varchar2 集合索引的关联数组)索引的特定元素。它不测试成员资格。为了能够检查集合是否包含具有特定值member of 的元素,可以使用条件:

SQL> declare
  2    type  sales_tab is table of varchar2(1000);
  3    t_sal sales_tab;
  4  begin
  5   select name
  6     bulk collect into t_sal
  7     from sales;
  8  
  9   if('Test' member of t_sal) THEN
 10     dbms_output.put_line('Test exists');
 11   END IF;
 12  
 13   dbms_output.put_line(t_sal.count);
 14  end;
 15  /
Test exists
3
PL/SQL procedure successfully completed

【讨论】:

  • 非常感谢。这是一个很大的帮助。我如何检查重复的关键成员。如果我想知道是否有多个“测试”,那么我想根据它做一个逻辑。
  • @Arav 越来越深了。根据您的最终目标,您必须问自己,您真的需要为此进行程序处理吗?正如 Jeffrey Kemp 在对您的问题的评论中所说,使用纯 SQL 不是更好吗,测试重复项也更简单?
  • 非常感谢。将尝试再次检查 sql 查询。可能是我忽略了sql查询性能。
猜你喜欢
  • 2019-03-08
  • 2015-08-10
  • 1970-01-01
  • 1970-01-01
  • 2023-03-20
  • 2021-05-31
  • 2011-09-14
  • 2016-02-29
  • 1970-01-01
相关资源
最近更新 更多