我正在比较两个光标。我会比较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;
/
我认为你的逻辑可能不正确。如果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;
数据库将在几毫秒内完成这样的查询,即使是数百万行。