【问题标题】:Referring to a cursor in an anonymous block引用匿名块中的游标
【发布时间】:2012-03-15 07:23:54
【问题描述】:

如果返回多个值,如何引用游标的具体值?

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;

【问题讨论】:

    标签: sql oracle database-cursor


    【解决方案1】:

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

    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;
    

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

    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;
    

    您还可以完全摆脱显式循环,这通常是首选方法,因为您不必担心游标泄漏,并且(在现代版本中)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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-14
      • 1970-01-01
      • 1970-01-01
      • 2023-01-11
      • 1970-01-01
      • 2014-04-19
      • 2016-04-27
      • 1970-01-01
      相关资源
      最近更新 更多