powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Что сделать!?
15 сообщений из 15, страница 1 из 1
Что сделать!?
    #39385465
Сильно не пинайте, ибо я новичок.

Есть к примеру курсор:

Код: plsql
1.
2.
3.
4.
DECLARE
  CURSOR t_data
  IS
    SELECT s.name FROM ships s ORDER BY S.Name DESC;



запиливаю намименования кораблей (s.name) в переменную v_ships_names VARCHAR2(250);:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
BEGIN
  OPEN t_data;
  LOOP
    FETCH t_data INTO v_ships_names;
 EXIT
  WHEN t_data%notfound;
  END LOOP;




необходимо все значения намименования кораблей (s.name) запилить передать во второй курсор:
Код: plsql
1.
2.
3.
 CURSOR t_data_o
  IS
    SELECT o.battle FROM outcomes o WHERE o.ship IN ( намименования кораблей (s.name) );



пробовал сделать через коллекцию, но не знаю как запилить теперь все значения!?:

Код: 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.
SET serveroutput ON;
DECLARE
  CURSOR t_data
  IS
    SELECT s.name FROM ships s ORDER BY S.Name DESC;
  v_ships_names VARCHAR2(250);
TYPE ship_variable
IS
  TABLE OF VARCHAR2(128) INDEX BY BINARY_INTEGER;
  names_ships ship_variable;
  q INTEGER := 0;
  CURSOR t_data_o
  IS
    SELECT o.battle FROM outcomes o WHERE o.ship IN (names_ships(22));
BEGIN
  OPEN t_data;
  LOOP
    FETCH t_data INTO v_ships_names;
    q := q + 1;
    names_ships(q) := v_ships_names;
    EXIT
  WHEN t_data%notfound;
  END LOOP;
  CLOSE t_data;
  FOR cur_rec IN t_data_o
  LOOP
    Dbms_Output.Enable;
    dbms_output.put_line (cur_rec.battle);
  END LOOP;
END;



Понимаю что на форуме задают более интересные вопросы, но всеже ответьте или скиньте где читать и обучаться.
...
Рейтинг: 0 / 0
Что сделать!?
    #39385483
учащийся
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А не проще от первого курсора отказаться и запихнуть сразу во второй в те скобки?
...
Рейтинг: 0 / 0
Что сделать!?
    #39385487
учащийся,

Нет. Именно нужна такая конструкция. Эта задача только в качестве примера..
...
Рейтинг: 0 / 0
Что сделать!?
    #39385490
учащийся
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Типа так:
Код: plsql
1.
2.
3.
 CURSOR t_data_o
  IS
    SELECT o.battle FROM outcomes o WHERE o.ship IN (SELECT name FROM ships);
...
Рейтинг: 0 / 0
Что сделать!?
    #39385492
Mishka999
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DECLARE
CURSOR battles_crs IS
SELECT s.name as SHIP, o.battle
FROM ships s
LEFT JOIN outcomes o ON o.ship = s.name
ORDER BY s.name DESC, o.battle;
BEGIN
FOR battles_rec IN battles_crs LOOP;
DBMS_OUTPUT.PUT_LINE ( battles_rec.ship || ' ' || battles_rec.battle );
END LOOP;
END;
...
Рейтинг: 0 / 0
Что сделать!?
    #39385493
учащийся,

Хочу научиться манипулировать данными, собранными в одном курсоре (например) и переданными в другой курсор.
...
Рейтинг: 0 / 0
Что сделать!?
    #39385496
Mishka999,

Нет, я понимаю что так можно сделать кстати
Код: plsql
1.
SELECT o.battle FROM outcomes o WHERE o.ship IN (SELECT name FROM ships);

- это еще легче.
...
Рейтинг: 0 / 0
Что сделать!?
    #39385497
учащийся
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Может тогда проще TMP табличку пользовать? Первый курсор закидывает в нее нужное, а второй смотрит что оттуда забирать.
...
Рейтинг: 0 / 0
Что сделать!?
    #39385499
учащийся,

Как по быстродействию, а если записей миллион? Это, я правильно понимаю, получается запись и чтение с диска (если запиливать в табл. TMP)?
...
Рейтинг: 0 / 0
Что сделать!?
    #39385505
учащийся
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Джонни_Инглишучащийся,

Как по быстродействию, а если записей миллион? Это, я правильно понимаю, получается запись и чтение с диска (если запиливать в табл. TMP)?
Это значительно быстрее, чем коллекция. Коллекции у оракла вообще тормозные. Когда-то тожы пытался в биллинге тарифицировать через коллекцию, думал, что будет так же быстро работать, как массив в Perl, но когда протестировал, то получилось, что с таблицей работает в десятки раз быстрее. ХЗ, почему, но проверялось неоднократно.
...
Рейтинг: 0 / 0
Что сделать!?
    #39385510
учащийся
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ну а TMP, чтобы данные иметь только в своей сессии и не засорять базу лишними данными.
...
Рейтинг: 0 / 0
Что сделать!?
    #39385513
учащийся,

Ок, я понял. Спасибо. Т.е. в рамках таких задач лучше решать через создание временной таблички.
...
Рейтинг: 0 / 0
Что сделать!?
    #39385514
n0rd1c.c0ld
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Джонни_Инглиш , тут
...
Рейтинг: 0 / 0
Что сделать!?
    #39385522
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
declare
  cursor cur1 is select level as rn from dual connect by level <= 5;
  cursor cur2(p_rn number) is select rn from (select level as rn from dual connect by level <= 5) where rn <= p_rn;
  l_rn number;
begin
  open cur1;
  loop
    fetch cur1 into l_rn;
    exit when cur1%notfound;
    --
    for i in cur2(l_rn) loop
      dbms_output.put(i.rn||' ');
    end loop;
    --
    dbms_output.new_line;
  end loop;
  close cur1;
end;
...
Рейтинг: 0 / 0
Что сделать!?
    #39386596
arlx
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Почитайте про bulk collect
В коллекцию из курсора можно сразу все/по частям записи запихнуть
...
Рейтинг: 0 / 0
15 сообщений из 15, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Что сделать!?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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