Ссылаясь на курсор в анонимном блоке - PullRequest
6 голосов
/ 25 февраля 2012

Как вы можете обратиться к конкретному значению курсора, если возвращено несколько значений?

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;

1 Ответ

13 голосов
/ 25 февраля 2012

Зачем вам это нужно?Предположительно, если вы выбираете три столбца в объявлении курсора, вам нужны все три столбца в коде, поэтому вам нужно будет извлечь все три столбца в три отдельные локальные переменные, то есть

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...