比较游标值是否存在于另一个游标中 - oracle plsql

问题描述 投票:0回答:1

我正在比较两个光标。我会比较cursor1是否存在于cursor2的所有行中。我在下面尝试过,但似乎在第一场比赛就停止了。

  CURSOR cursor1 IS
  SELECT col1, col2 FROM table1;
  CURSOR cursor2 IS
  SELECT col1, col3 FROM table2;
  c1_rec cursor1%ROWTYPE;
  c2_rec cursor2%ROWTYPE;
BEGIN
  OPEN cursor1;
  OPEN cursor2;
  LOOP
    FETCH cursor1 INTO c1_rec;
    FETCH cursor2 INTO c2_rec;
    EXIT WHEN cursor1%NOTFOUND OR cursor2%NOTFOUND; 

    IF c1_rec.col1 = c2_rec.col1 OR c1_rec.col2 = c2_rec.col3 THEN
      DBMS_OUTPUT.PUT_LINE('Match in row: ' || SQL%ROWCOUNT);
    END IF;
  END LOOP;
  CLOSE cursor1;
  CLOSE cursor2;
END;
/
plsql
1个回答
0
投票

我认为你的逻辑可能不正确。如果cursor2 的所有行中都存在cursor1,则循环不会比较cursor1。它仅与cursor2 的一行进行比较,然后移动到两个游标的下一行。我想你想要一个循环中的循环。

这将执行您所描述的操作:

  CURSOR cursor1 IS
  SELECT col1, col2 FROM table1;
  CURSOR cursor2 IS
  SELECT col1, col3 FROM table2;
  c1_rec cursor1%ROWTYPE;
  c2_rec cursor2%ROWTYPE;
BEGIN
  OPEN cursor1;
  LOOP
    FETCH cursor1 INTO c1_rec;
    OPEN cursor2;
    LOOP   
       FETCH cursor2 INTO c2_rec;
       EXIT WHEN cursor1%NOTFOUND OR cursor2%NOTFOUND; 

       IF c1_rec.col1 = c2_rec.col1 OR c1_rec.col2 = c2_rec.col3 THEN
         DBMS_OUTPUT.PUT_LINE('Match in row: ' || SQL%ROWCOUNT);
       END IF;
    END LOOP
    CLOSE cursor2;
  END LOOP;
  CLOSE cursor1;
END;
/

但是,我必须警告您,对于超过 1000 行的数据,这会带来糟糕的性能。通过执行 JOIN,您会获得更好的性能。

示例:

SELECT t1.col1, t1.col2, t2.col1, t2.col3
FROM table1, table2
WHERE t1.col1 = t2.col1
   OR t1.col2 = t2.col3;

数据库将在几毫秒内完成这样的查询,即使是数百万行。

© www.soinside.com 2019 - 2024. All rights reserved.