powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как прокрутить реф-курсор в цикле ?
3 сообщений из 53, страница 3 из 3
Как прокрутить реф-курсор в цикле ?
    #39638412
Фотография Fogel
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОкеанНадеждызачем надо?
результирующий набор селекта одинаковый, а немного различаются фильтры. Не хочется прям внутри блока прописывать, хотела в секции объявлений описать все вариантры курсоров, чтобы не прыгать потом по всей проге и искать
Если в реальности именно так и
ОкеанНадеждыя хотела что-то типа

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
-- цель- одну курсорную переменную открыть из разных запросов 
-- в зависимости от условий

-- желательно в команду открытия не передавать select  в виде плохо отлаживаемой текстовой строки
-- или огромного селекта посреди проги
declare
  cursor c is(
    select 1 from dual);
  cursor b is(
    select 2 from dual);

  n number;
  type t is ref cursor;
  t_cur t;
begin
  -- как-то манипулируем с n

  if n = 1 then
    open t for c;
  else
    open t for b;
  end if;

  loop
    fetch rc
      into < куда - нить записали >;
    exit when rc%notfound;
  end loop;

  close t;
end;




то данная тема избыточна - достаточно использовать 1 курсор, в котором будут применены все фильтры подобным образом:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
declare
  cursor c (n2 number) is with cte1(num, s, s2) as 
(select 1, 'qw', null from dual
union all
select 2,'zx', 'n' from dual
union all
select 5,'qw', 'a' from dual)
select num, s, s2 from cte1 
where (s2 is null and n2=1) 
or (s='zx' and n2=2) 
or (num =5 and n2=3);

  n number;

begin
  -- как-то манипулируем с n

open c(n);
  loop
    fetch c
      into < куда - нить записали >;
    exit when c%notfound;
  end loop;

  close c;
end;
...
Рейтинг: 0 / 0
Как прокрутить реф-курсор в цикле ?
    #39638428
Фотография Elic
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev https://docs.oracle.com/cd/B28359_01/appdev.111/b28419/d_sql.htm#CHDJDGDG
ни разу не использовал, нужды не было. Но вроде по описанию то, что надоИ где там что-нибудь про PL/SQL-ный курсор?
...
Рейтинг: 0 / 0
Как прокрутить реф-курсор в цикле ?
    #39638917
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ОкеанНадеждыandrey_anonymousпропущено...

Покажите пожалуйста способ, которым Вы предполагаете выбирать конкретный вариант курсора.

да он не работает,

я хотела что-то типа

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
-- цель- одну курсорную переменную открыть из разных запросов 
-- в зависимости от условий

-- желательно в команду открытия не передавать select  в виде плохо отлаживаемой текстовой строки
-- или огромного селекта посреди проги
declare
  cursor c is(
    select 1 from dual);
  cursor b is(
    select 2 from dual);

  n number;
  type t is ref cursor;
  t_cur t;
begin
  -- как-то манипулируем с n

  if n = 1 then
    open t for c;
  else
    open t for b;
  end if;

  loop
    fetch rc
      into < куда - нить записали >;
    exit when rc%notfound;
  end loop;

  close t;
end;



імхо, Ваш варіант из доки
https://blogs.oracle.com/oraclemagazine/working-with-cursors
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
Code Listing 2: Block and description of the names_for function, which returns a cursor variable

1  CREATE OR REPLACE FUNCTION names_for (
 2        name_type_in IN VARCHAR2)
 3     RETURN SYS_REFCURSOR
 4  IS
 5     l_return   SYS_REFCURSOR;
 6  BEGIN
 7     CASE name_type_in
 8        WHEN 'EMP'
 9        THEN
10           OPEN l_return FOR
11                SELECT last_name
12                  FROM employees
13              ORDER BY employee_id;
14        WHEN 'DEPT'
15        THEN
16           OPEN l_return FOR
17                SELECT department_name
18                  FROM departments
19              ORDER BY department_id;
20     END CASE;
21
22     RETURN l_return;
23  END names_for;



зы
вместо
type t is ref cursor;
t_cur t;
писал t_cur sys_refcursor; меньше буковок
.....
stax
...
Рейтинг: 0 / 0
3 сообщений из 53, страница 3 из 3
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Как прокрутить реф-курсор в цикле ?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]