您不能提前查看以后的游标记录,并且多次运行游标会很昂贵,而且可能无论如何都没有帮助。
您可以对游标中的数据进行排序,以便您的'A'
记录始终排在第一位,然后使用跟踪变量查看您是否有'A'
当前name
/test_field
组合的记录:
DECLARE
last_name test.name%TYPE := null;
last_test_field test.test_field%TYPE := null;
has_a BOOLEAN := false;
CURSOR cur IS
SELECT name, test_field, test_field2
FROM test
WHERE name='x'
ORDER BY name, test_field, test_field2;
-- assumes 'A' actually comes first
BEGIN
FOR rec IN cur LOOP
-- reset tracking variables if major values change
IF last_name IS NULL OR last_name != rec.name
OR last_test_field != rec.test_field
THEN
last_name := rec.name;
last_test_field := rec.test_field;
has_a := (rec.test_field2 = 'A');
END IF;
IF has_a THEN
DBMS_OUTPUT.PUT_LINE('name ' || rec.name || ' test_field '
|| rec.test_field || ' test_field2 ' || rec.test_field2
|| ' matched condition');
END IF;
END LOOP;
END;
/
name x test_field 101 test_field2 A matched condition
name x test_field 101 test_field2 ROL matched condition
PL/SQL procedure successfully completed.
一种更简洁的方法可能是为游标中的每条记录添加一个标志,使用分析函数来“窥视”结果集中的前方;再次假设您的'A'
值实际上是按字母顺序排列的,如果不是,则需要调整该函数以首先获得您的实际值:
SELECT name, test_field, test_field2,
first_value(test_field2)
over (partition by name, test_field
order by test_field2) as has_a
-- assumes 'A' actually comes first
FROM test;
NAME TEST_FIELD TEST_FIELD HAS_A
---------- ---------- ---------- ----------
x 101 A A
x 101 ROL A
x 102 ROL ROL
x 103 ROL ROL
...甚至更好,因为这不依赖于目标值的字母顺序,并且还可以为您提供更清晰的结果:
SELECT name, test_field, test_field2,
MAX(CASE WHEN test_field2 = 'A' THEN 'true' END)
OVER (PARTITION BY name, test_field) AS has_a
FROM test;
NAME TEST_FIELD TEST_FIELD HAS_
---------- ---------- ---------- ----
x 101 ROL true
x 101 A true
x 102 ROL
x 103 ROL
把它放在光标中给出:
DECLARE
CURSOR cur IS
SELECT name, test_field, test_field2,
MAX(CASE WHEN test_field2 = 'A' THEN 'true' END)
OVER (PARTITION BY name, test_field) AS has_a
FROM test
WHERE name='x'
ORDER BY name, test_field, test_field2 DESC;
-- forcing us to see ROL first, just to show it works
BEGIN
FOR rec IN cur LOOP
IF rec.has_a = 'true' THEN
DBMS_OUTPUT.PUT_LINE('name ' || rec.name || ' test_field '
|| rec.test_field || ' test_field2 ' || rec.test_field2
|| ' matched condition');
END IF;
END LOOP;
END;
/
name x test_field 101 test_field2 ROL matched condition
name x test_field 101 test_field2 A matched condition
PL/SQL procedure successfully completed.
请注意,这也不会强迫您'A'
首先在循环中处理记录,这可能很重要,也可能不重要 - 可能不是因为您在示例中根本没有订购。