从PLSQL游标中获取两条记录

时间:2010-05-14 17:31:22

标签: plsql

我的问题很简短。我创建了一个游标来从我的表中获取一些值。我想获取光标的当前记录(获取的记录)和光标中的下一条记录而不提取它,因为我想对当前记录和下一条记录进行计算。在传统的编程中,它是一个简单的操作;你可以通过将它增加1来使用for索引来实现。

你有什么建议吗?

4 个答案:

答案 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;