我的问题很简短。我创建了一个游标来从我的表中获取一些值。我想获取光标的当前记录(获取的记录)和光标中的下一条记录而不提取它,因为我想对当前记录和下一条记录进行计算。在传统的编程中,它是一个简单的操作;你可以通过将它增加1来使用for索引来实现。
你有什么建议吗?
答案 0 :(得分:6)
我想对此进行计算 当前记录和下一条记录。
假设您使用的是Oracle,可以使用分析函数(特别是lead()
函数)在SQL中完成此操作。这将从下一个第n条记录中检索列的值(默认n = 1)。
SQL> select empno
2 , sal as this_sal
3 , lead(sal) over (order by empno) as next_sal
4 from emp
5 order by empno
6 /
EMPNO THIS_SAL NEXT_SAL
---------- ---------- ----------
7369 800 1600
7499 1600 1250
7521 1250 2975
7566 2975 1250
7654 1250 2850
7698 2850 2450
....
此查询可用于游标或任何其他机制以检索记录。
答案 1 :(得分:1)
我不确定你可以在不移动光标的情况下做到这一点,但你应该能够像这样完成相同的目标(伪造代码):
open cursor;
fetch cursor to rec1;
if cursor%found then
loop
fetch cursor to rec2;
exit when cursor%notfound;
perform calculations with rec1 and rec2;
rec1 := rec2;
end loop;
end if;
答案 2 :(得分:0)
要回答您的具体问题,您可以将BULK COLLECT及其限制子句用于集合(表)变量。
DECLARE
CURSOR my_cursor IS
[YOUR SQL HERE];
TYPE t_my_type IS TABLE OF my_cursor%ROWTYPE INDEX BY BINARY_INTEGER;
v_my_var t_my_type;
BEGIN
FETCH my_cursor BULK COLLECT INTO v_my_var LIMIT 2;
dbms_output.put_line('My first value: ' || v_my_var(1).some_column);
dbms_output.put_line('My second value: ' || v_my_var(2).some_column);
END;
limit子句将仅导致提取和存储前两个记录。第一个记录的索引为1,第二个记录的索引为2.
答案 3 :(得分:0)
您可以通过将一个变量保存到本地来比较两个变量,然后将其与光标值进行比较,例如
declare
l_local1 table_name%type := null;
begin
for c1 in (select
*
from
table_name
where some clause)
loop
-- do comparation
if l_local1 is not null and c1.field_value is not null then
-- do something to compare
.
.
.
-- empty local1 variable
l_local1 := null;
end if;
-- get the value of loop in local variable
l_local1 := c1.field_value;
end loop;
end;