Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Что сделать!? / 15 сообщений из 15, страница 1 из 1
16.01.2017, 14:59
    #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
16.01.2017, 15:15
    #39385483
учащийся
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что сделать!?
А не проще от первого курсора отказаться и запихнуть сразу во второй в те скобки?
...
Рейтинг: 0 / 0
16.01.2017, 15:19
    #39385487
Что сделать!?
учащийся,

Нет. Именно нужна такая конструкция. Эта задача только в качестве примера..
...
Рейтинг: 0 / 0
16.01.2017, 15:20
    #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
16.01.2017, 15:20
    #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
16.01.2017, 15:20
    #39385493
Что сделать!?
учащийся,

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

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

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

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

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

Ок, я понял. Спасибо. Т.е. в рамках таких задач лучше решать через создание временной таблички.
...
Рейтинг: 0 / 0
16.01.2017, 15:36
    #39385514
n0rd1c.c0ld
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что сделать!?
Джонни_Инглиш , тут
...
Рейтинг: 0 / 0
16.01.2017, 15:40
    #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
18.01.2017, 08:45
    #39386596
arlx
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Что сделать!?
Почитайте про bulk collect
В коллекцию из курсора можно сразу все/по частям записи запихнуть
...
Рейтинг: 0 / 0
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Что сделать!? / 15 сообщений из 15, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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