【问题标题】:What is the replacement of cursor foreach in oracle pl/sql?oracle pl/sql中cursor foreach的替换是什么?
【发布时间】:2015-03-04 21:57:46
【问题描述】:

以下是示例场景

 CURSOR cur
    IS
    SELECT Comments,
              Assignee,
              Case_Info,
              Users
            FROM sometable
            where id=:id
OPEN cur 
    LOOP
      v_comments  := NULL;
      v_assignee  := NULL;
      v_case_info := NULL;
      v_users     := NULL;
      FETCH cur INTO v_comments, v_assignee, v_case_info, v_users;
      EXIT

   /* here lopping through each row and get non-null Comments,Assignee,Case_Info,Users values and return one row  */

    END LOOP;
    CLOSE cv_mng_data;

整个代码都在一个函数中,用于与另一个表连接。这会导致性能问题。我想知道其他方法来做到这一点

【问题讨论】:

  • “这会导致性能问题。我想知道其他方法来做到这一点” - 不要使用光标......
  • 在我给出的示例中,我必须遍历每条记录以找出非空注释、case_info、assignee.. 所以我使用了游标。请告诉我我们可以使用哪些其他方法来解决这个问题
  • SQL做,不需要PL/SQL
  • 是的,在 SQL 中执行以避免频繁的上下文切换。这些对性能有很大的影响。如果您确实需要 PL/SQL 进行转换,请考虑使用 BULK COLLECT 和 FORALL 来减少上下文切换的数量。

标签: oracle plsql


【解决方案1】:

这里遍历每一行并获取非空 Comments、Assignee、Case_Info、Users 值并返回一行

这不是简单地在普通的SQL 中找到NOT NULL 值吗-

SELECT comments, 
       assignee, 
       case_info, 
       users 
FROM   sometable 
WHERE  id = :id 
       AND comments IS NOT NULL 
       AND assignee IS NOT NULL 
       AND case_info IS NOT NULL 
       AND users IS NOT NULL

整个代码都在一个函数中,用于与另一个表连接。这会导致性能问题。我想知道其他方法来做到这一点

为什么要将它包装在 function 中?为什么使用LOOP逐行逐行缓慢。当您可以在 SQL 中执行相同操作时,不需要 PL/SQL

使用上述查询与其他表连接。如果您发现性能瓶颈,则生成explain plan 并执行必要的操作。

【讨论】:

  • 感谢您的回复。对于一个 id,可以有 10 条记录匹配。在 10 条记录中,1 条记录可能 cmets 为 null 且 case_info 不为 null,另一条记录的受理人为 null,cmets 为非 null。所以我将不得不从一条记录中选择 case_info,从另一条记录中选择 cmets。条件 cmets IS NOT NULL AND assignee IS NOT NULL AND case_info IS NOT NULL AND users IS NOT NULL 可能不会返回任何匹配记录
  • 是什么样的逻辑和设计?没有意义。没有数据完整性。您从任何行的任何列中随机选择任何 NOT NULL 值。
  • 它不是随机选择任何 NOT NULL 值。我们将按日期时间列排序并从最新记录中选择值。如果最新记录有空值,那么我们将从下一个最新记录中选择非值。希望您对逻辑有所了解
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-18
  • 2018-06-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多