引用匿名块中的游标

bre*_*dan 6 sql oracle cursor

如果返回多个值,如何引用游标的特定值?

DECLARE
  X INTEGER;
  CURSOR c1 IS SELECT col1, col2, col3.....;
BEGIN
  OPEN c1;
  LOOP
    EXIT WHEN c1%NOTFOUND;
    FETCH (col2 from c1) INTO X;
  END LOOP;
END;
Run Code Online (Sandbox Code Playgroud)

Jus*_*ave 13

你为什么想要?据推测,如果您在游标声明中选择了三列,则需要在代码中使用所有三列,因此您需要将所有三列提取到三个单独的局部变量中,即

DECLARE
  x      integer;
  y      integer;
  z      integer;
  CURSOR c1
      IS SELECT column1, column2, column3
           FROM some_table;
BEGIN
  OPEN c1;
  LOOP
    FETCH c1 
     INTO x, y, z;
    EXIT WHEN c1%NOTFOUND;
  END LOOP;
  CLOSE c1;
END;
Run Code Online (Sandbox Code Playgroud)

或者,您可以根据游标声明声明一个记录类型并获取它

DECLARE
  CURSOR c1
      IS SELECT column1, column2, column3
           FROM some_table;
  c1_rec c1%ROWTYPE;
BEGIN
  OPEN c1;
  LOOP
    FETCH c1 
     INTO c1_rec;
    dbms_output.put_line( c1_rec.column2 );
    EXIT WHEN c1%NOTFOUND;
  END LOOP;
  CLOSE c1;
END;
Run Code Online (Sandbox Code Playgroud)

您也可以摆脱完全明确的循环通常是因为你不必担心光标泄漏和首选的方法(在现代版本)的Oracle可以自动为你做批量收集

DECLARE
  CURSOR c1
      IS SELECT column1, column2, column3
           FROM some_table;
BEGIN
  FOR c1_rec IN c1
  LOOP
    dbms_output.put_line( c1_rec.column2 );
  END LOOP;
END;
Run Code Online (Sandbox Code Playgroud)