Как напечатать значения курсора в oracle? - PullRequest
3 голосов
/ 29 сентября 2019

Я новичок в oracle и изучаю курсоры. В моей таблице City есть два столбца city_id, city_name.So, вот что я пытался:

DECLARE
  CURSOR city_list is
  SELECT * from OT.City;

  v_list SYS_REFCURSOR;
BEGIN
  OPEN city_list FOR
   v_list := city_list;
   DBMS_OUTPUT.PUT_LINE(v_list.city_id);
   EXIT WHEN city_list%NOTFOUND;
  CLOSE city_list;
END;
/

Я пытаюсь назначить данные курсорак недавно объявленному значению v_list SYS_REFCURSOR;. Но вывод поступает как ошибка в v_list := city_list;. Как я могу назначить все значения курсоров непосредственно другому курсору или есть какие-либо другие методы?

Ответы [ 3 ]

2 голосов
/ 29 сентября 2019

Есть много проблем с вашим кодом, например:

  • v_list должен быть объявлен как city_list%ROWTYPE
  • вам нужно OPEN курсор и затем LOOP
  • , чтобы назначить текущую запись для city_list, вы хотите использовать FETCH INTO

Рассмотрите эту новую версию вашего кода:

DECLARE
    CURSOR city_list IS SELECT * from city ORDER BY city_id;
    v_list city_list%ROWTYPE;
BEGIN
    OPEN city_list;
    LOOP
        FETCH city_list INTO v_list;
        EXIT when city_list%notfound;
        DBMS_OUTPUT.PUT_LINE(v_list.city_id);
    END LOOP;
    CLOSE city_list;

END;
/

В эта демонстрация на DB Fiddle , с учетом следующего содержания для таблицы city:

CITY_ID | CITY_NAME  
------: | :----------
      1 | New York   
      2 | Los Angeles

Код выводит:

1 rows affected

dbms_output:
1
2
2 голосов
/ 29 сентября 2019

Вы по-прежнему можете использовать SYS_REFCURSOR, находя между OPEN и FOR предложениями, после чего следует курсор, а затем

необходимо добавить LOOP FETCH INTO... END LOOP шаблон и закрыть открытый курсор после того, как вытекущий код:

DECLARE
  v_list SYS_REFCURSOR;
  v_city_id   city.city_id%TYPE;
  v_city_name city.city_name%TYPE;
BEGIN 
  OPEN v_list FOR
    SELECT city_id, city_name FROM City;

  LOOP 
    FETCH v_list
    INTO  v_city_id, v_city_name;
    EXIT WHEN v_list%NOTFOUND;
    DBMS_OUTPUT.PUT_LINE(v_city_id || ' - ' || v_city_name);
  END LOOP;
  CLOSE v_list;  
END;
/

Демо

1 голос
/ 29 сентября 2019

Этот вопрос помечен оракулом 11g, но позвольте мне предоставить новый способ возврата результата, который представлен в oracle 12c.

DBMS_SQL.RETURN_RESULT(l_cursor) можно использовать для печати результата в oracle 12c.

DECLARE
 v_list SYS_REFCURSOR
BEGIN
 Open v_list for
 SELECT * from OT.City;

 DBMS_SQL.RETURN_RESULT(v_list);
END;
/

Ура !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...