【问题标题】:FORALL loop - select statement from associative arrayFORALL 循环 - 从关联数组中选择语句
【发布时间】:2021-03-31 05:14:38
【问题描述】:

我有一个函数,它接受关联数组作为参数。函数 - 在插入/更新之前 - 需要检查表中是否存在记录,所以我需要遍历数组。

既然 FORALL 不允许 SELECT 语句,那么正确的方法是什么?

功能(只是我需要修复的部分 - 这是一个示例!!):

 type t_name is table of MySchema.Orders.NAME%type index by pls_integer;
 type t_year is table of MySchema.Orders.YEAR%type index by pls_integer;
 type t_month is table of MySchema.Orders.MONTH%type index by pls_integer;

 FUNCTION Check_records (name_in IN  t_name, year_in IN  t_year, month_in IN  t_month) RETURN INTEGER
 IS
  
 record_exists INTEGER;
 
 BEGIN
    
      FORALL i in name_in.FIRST..name_in.LAST
      SELECT COUNT(*) INTO record_exists 
      FROM MySchema.Orders@link_to_table
      WHERE name= name_in(i)
      AND year= year_in(i)
      AND month= month_in(i);
     
      return record_exist
         
 END Check_records;

【问题讨论】:

  • 对于任何想知道为什么的人 - 这将是一个在插入之前检查记录是否存在的函数。如果是这样,将再次调用函数来批量删除记录。因为我正在通过 OracleBulkCopy 类进行 BULK 插入(包括 BLOB) - 它直接插入记录而无需任何 PL\SQL... 换句话说,为了避免 BulkCopyClass 出现问题...
  • 你希望你的函数返回什么?匹配的总数(即对 i 的所有值求和 count(*))?或者是其他东西?如果您只是要删除所有匹配的数据,为什么还要先进行检查?只需发出删除(如果您关心那里是否有数据,则返回删除的行数)。没有理由承担两次上桌的费用。
  • @JustinCave,在执行新的插入之前,用户需要被告知记录已经在那里,这只是一个应用程序设计。如果我已经在进行批量插入以提高速度并减少网络流量,我创建了这个函数。 BLOB 是个问题,在执行常规插入时会降低性能。
  • 好的。所以你不一定要批量删除那里的记录?你希望你的函数返回什么?匹配的总数(即对 i 的所有值求和 count(*))?还是别的什么?
  • @JustinCave,是的,我想返回所有值的匹配总数(i)。

标签: plsql oracle11g


【解决方案1】:

最简单的方法就是使用for 循环

DECLARE
  l_total_records pls_integer;
  l_count         pls_integer;
BEGIN
  l_total_records := 0;

  FOR i in name_in.FIRST..name_in.LAST
  LOOP
    SELECT COUNT(*) 
      INTO l_count 
      FROM MySchema.Orders@link_to_table
     WHERE name= name_in(i)
       AND year= year_in(i)
       AND month= month_in(i);

    l_total_count := l_total_count + l_count;
  END LOOP;
END;

如果您正在查询本地表并且可以使用单个集合(即具有nameyearmonth 字段的对象类型的集合),您可以使用@ 做一些更优雅的事情987654326@ 函数,但我不确定它是否适用于数据库链接,并且目前没有可用于测试的链接。

【讨论】:

  • 谢谢,它有效。你甚至帮助我解决了两个问题 - 即使对于 DELETE,DB 链接也不支持 FORALL,所以我将其更改为循环,与 SELECT 相同。
猜你喜欢
  • 2015-11-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-27
  • 1970-01-01
  • 2019-03-07
  • 1970-01-01
相关资源
最近更新 更多