Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Использование коллекции. Подскажите как правильно?  [new]
isdenno
Member

Откуда:
Сообщений: 92
Хочу использовать коллекцию в которую буду выгружать ид. для дальнейшего использования в выборке основной таблице.
Хочу сделать так
declare 
 type t_collect is table of pls_integer;
 vcollect t_collect;
 i integer;
begin
 for r in select id from table loop
 vcollect(i):=r.id;
 i:=i+1;
 end loop;

 for r2 in select * from table2 where id in vcollect loop
 null;
 end loop;

end;
не получается, подскажите как можно создать коллекцию и использовать ее?
19 май 10, 14:16    [8800083]     Ответить | Цитировать Сообщить модератору
 Re: Использование коллекции. Подскажите как правильно?  [new]
Askerus
Member

Откуда:
Сообщений: 1
А существует ли самоучитель по Oracle?
19 май 10, 14:24    [8800180]     Ответить | Цитировать Сообщить модератору
 Re: Использование коллекции. Подскажите как правильно?  [new]
SQL*Plus
Member

Откуда: Россия, Москва
Сообщений: 8136
А не проще ли обойтись вообще без коллекции...
begin
 for r2 in (select * from table2 where id in (SELECT select id from table)) loop
    null; -- Обработка данных
 end loop;
end;
19 май 10, 14:26    [8800212]     Ответить | Цитировать Сообщить модератору
 Re: Использование коллекции. Подскажите как правильно?  [new]
Andrey.L
Member

Откуда: Харьков
Сообщений: 1546
isdenno,

примерно так:
eclare 
 type t_collect is table of NUMBER;
 vcollect t_collect;
begin
  select id bulk collect into vcollect from table;
  for i in 1..vcollect.count loop
  null;
  end loop;
end;

Твой пример можно переписать (упростить) так, возможно натолкнет тебя на мысли об отказе от коллекций
begin
 for r2 in select * from table2 where id in (select id from table)
 loop
 null;
 end loop;

end;
19 май 10, 14:26    [8800214]     Ответить | Цитировать Сообщить модератору
 Re: Использование коллекции. Подскажите как правильно?  [new]
*Tank*
Member

Откуда: Москва
Сообщений: 10641
Askerus
А существует ли самоучитель по Oracle?
судя по вопросу -самоучителей не видали пока)
19 май 10, 14:40    [8800373]     Ответить | Цитировать Сообщить модератору
 Re: Использование коллекции. Подскажите как правильно?  [new]
isdenno
Member

Откуда:
Сообщений: 92
1. Самоучитель существует, и я его упорно изучаю, но решение в нем не нашел (самоучитель примерно такой RUS - Feuerstein - Oracle PL_SQL Programming).
2. Не проще т.к. коллекция заполняется из выборки по условию like+или, делается для того чтобы не писать один и тот-же запрос с разными выборками.
3. Методом научного тыка и повторного изучения самоучителя дошел до такого варианта
 declare 
  type tselect is ref cursor;
  cur_vselect tselect;

  type tcollect is table of pls_integer;
  vcollect tcollect:=tcollect();
begin
 ... 
 vcollect.extend;
 fetch cur_vselect into vcollect(vcollect.last);
  exit when  cur_vselect%notfound;
 end loop;
end;
4. Может быть кто-то, из тех кто уже изучил инструкцию, подскажет какой конструкций втулить коллекцию в выборку, надо получить что-то типа
select * from table where id in коллекция
, если так прямо писать ругается на то что коллекция не может быть использоване в SQL запросе
19 май 10, 15:11    [8800811]     Ответить | Цитировать Сообщить модератору
 Re: Использование коллекции. Подскажите как правильно?  [new]
Denis Popov
Member

Откуда: Санкт-Петербург
Сообщений: 7862
isdenno

4. Может быть кто-то, из тех кто уже изучил инструкцию, подскажет какой конструкций втулить коллекцию в выборку, надо получить что-то типа
select * from table where id in коллекция
, если так прямо писать ругается на то что коллекция не может быть использоване в SQL запросе

create or replace type T_COLLECT as table of integer
/
declare
 vcollect T_COLLECT;
 i integer;
begin
 select empno
 bulk collect into vcollect
 from scott.EMP
 where mod(empno, 2) = 0;

 for r2 in (
   select * from scott.EMP where empno in (select column_value from table(vcollect))
 ) loop
   null;
 end loop;
end;
/
19 май 10, 15:18    [8800878]     Ответить | Цитировать Сообщить модератору
 Re: Использование коллекции. Подскажите как правильно?  [new]
GL
Member

Откуда: Харьков
Сообщений: 1513
isdenno
4. Может быть кто-то, из тех кто уже изучил инструкцию, подскажет какой конструкций втулить коллекцию в выборку
Только если объявить SQL-тип (create or replace type ...) - is member of ...
Но мой вам совет - лучше дайте сюда задачу целиком, потому как, на мой непросвящённый взгляд, вы забираетесь не в те дебри...
19 май 10, 15:19    [8800907]     Ответить | Цитировать Сообщить модератору
 Re: Использование коллекции. Подскажите как правильно?  [new]
dmidek
Member

Откуда: Киев - Дортмунд
Сообщений: 116338
GL
Но мой вам совет - лучше дайте сюда задачу целиком, потому как, на мой непросвящённый взгляд, вы забираетесь не в те дебри...


+1
Возможно коллекция здесь вообще не нужна.
19 май 10, 15:21    [8800929]     Ответить | Цитировать Сообщить модератору
 Re: Использование коллекции. Подскажите как правильно?  [new]
AlexFF__|
Member

Откуда:
Сообщений: 2855
Denis Popov
isdenno

4. Может быть кто-то, из тех кто уже изучил инструкцию, подскажет какой конструкций втулить коллекцию в выборку, надо получить что-то типа
select * from table where id in коллекция
, если так прямо писать ругается на то что коллекция не может быть использоване в SQL запросе

create or replace type T_COLLECT as table of integer
/
declare
 vcollect T_COLLECT;
 i integer;
begin
 select empno
 bulk collect into vcollect
 from scott.EMP
 where mod(empno, 2) = 0;

 for r2 in (
   select * from scott.EMP where empno in (select column_value from table(vcollect))
 ) loop
   null;
 end loop;
end;
/


+ cast
19 май 10, 15:25    [8801001]     Ответить | Цитировать Сообщить модератору
 Re: Использование коллекции. Подскажите как правильно?  [new]
isdenno
Member

Откуда:
Сообщений: 92
Есть две таблички, в отношении один ко многим, нужно их объединить и вывести данные, но нужно объединять по следующему условию: выбрать из родительской таблички все записи которые удовлетворяют требованию like ('w%') или like ('x%').
Количество like зависит от условия, к примеру, условие 1- два like, условие 2 - 1 like ну и т.д., но количество условий предопределено.
Решил делать так case условие -> получаю список id (он всегда будет <~500 записей) и по этому списку делаю выборку.
19 май 10, 15:33    [8801105]     Ответить | Цитировать Сообщить модератору
 Re: Использование коллекции. Подскажите как правильно?  [new]
JaRo
Member

Откуда:
Сообщений: 1659
isdenno
Есть две таблички, в отношении один ко многим, нужно их объединить и вывести данные, но нужно объединять по следующему условию: выбрать из родительской таблички все записи которые удовлетворяют требованию like ('w%') или like ('x%').
Количество like зависит от условия, к примеру, условие 1- два like, условие 2 - 1 like ну и т.д., но количество условий предопределено.
Решил делать так case условие -> получаю список id (он всегда будет <~500 записей) и по этому списку делаю выборку.
А зачем коллекции? Просто связывать таблицы - не модно или что?
19 май 10, 15:42    [8801196]     Ответить | Цитировать Сообщить модератору
 Re: Использование коллекции. Подскажите как правильно?  [new]
GL
Member

Откуда: Харьков
Сообщений: 1513
isdenno,

with t1 as (
  select 1 id, 'wra-la-la' name, 1 cond from dual union all
  select 2, 'xe-be-be', 2 cond from dual
)
, t2 as (
  select 1 id, 1 parent, 'bla-bla-bla' name from dual union all
  select 2, 1, 'tru-lala' from dual union all
  select 3, 2, 'bu-bu-bu' from dual
)
select *
from t1, t2
where t2.parent=t1.id and
(
    (t1.cond=1 and (t1.name like 'w%' or t1.name like 'x%'))
 or (t1.cond=2 and t1.name like 'x%')
 or (t1.cond=3 and t1.name like 'w%')   
)
Ничего другого от вашего описания в голову не пришло. Давайте свои примеры (в with) и что должно получиться.
19 май 10, 15:51    [8801298]     Ответить | Цитировать Сообщить модератору
 Re: Использование коллекции. Подскажите как правильно?  [new]
isdenno
Member

Откуда:
Сообщений: 92
GL,

Необходимо в зависимости от входящего параметра сделать условие и потом объеденить данные из двух таблиц.

Ну вообщем есть вот такое чудо:

create or replace procedure proc_ (param_ in varchar(3))
as 
begin
 case param_
  when param_='S' then select id from table_ where name_ like 'X%' or 'Y%';
  when param_='L' then select id from table_ where name_ like 'Z%';
  when param_='F' then select id from table_ where name_ like 'Z%' or 'Y%';
 end if;
 insert into temptable select name_ from subtable_ where id in (а тут должны быть ид. table_)
end;

Чудо появилось из-за того что не охота писать, ну и учиться надо ))
case 
1: select * from table_ t join subtable_ s on t.id=s.tid where s.name_ like  'X%' or 'Y%'
2: select * from table_ t join subtable_ s on t.id=s.tid where s.name_ like  'Z%'
ну и т.д.
19 май 10, 16:20    [8801619]     Ответить | Цитировать Сообщить модератору
 Re: Использование коллекции. Подскажите как правильно?  [new]
isdenno
Member

Откуда:
Сообщений: 92
JaRo,

Интересно, а почему локальную коллекцию нельзя использоватье в SQL конструкции?
19 май 10, 16:22    [8801639]     Ответить | Цитировать Сообщить модератору
 Re: Использование коллекции. Подскажите как правильно?  [new]
JaRo
Member

Откуда:
Сообщений: 1659
isdenno
GL,

Необходимо в зависимости от входящего параметра сделать условие и потом объеденить данные из двух таблиц.

Ну вообщем есть вот такое чудо:
Ну так и что этому чуду мешает быть переписанным, как написано выше:
insert into temptable select name_ from subtable_ where id in (
select id from table_ 
where param_ in ('S') and name_ like 'X%'
or param_ in ('L', 'F') and name_ like 'Z%'
or param_ in ('S', 'F') name_ like 'Y%')
19 май 10, 16:25    [8801668]     Ответить | Цитировать Сообщить модератору
 Re: Использование коллекции. Подскажите как правильно?  [new]
JaRo
Member

Откуда:
Сообщений: 1659
isdenno
JaRo,
Интересно, а почему локальную коллекцию нельзя использоватье в SQL конструкции?
Потому что есть различие между типами SQL и PLSQL (SQL PLSQL-ые типы не видит и не принимает)
19 май 10, 16:27    [8801688]     Ответить | Цитировать Сообщить модератору
 Re: Использование коллекции. Подскажите как правильно?  [new]
GL
Member

Откуда: Харьков
Сообщений: 1513
isdenno
Необходимо в зависимости от входящего параметра
И процедура с временной таблицей вам тоже не нужны

select * 
from table_ t join subtable_ s on t.id=s.tid 
where (
       :param_='S' and (t.name_ like 'X%' or t.name_ like 'Y%')
   or  :param_='L' and t.name_ like 'Z%'
   or  :param_='F' and (t.name_ like 'Z%' or t.name_ like 'Y%')
)
19 май 10, 16:28    [8801697]     Ответить | Цитировать Сообщить модератору
 Re: Использование коллекции. Подскажите как правильно?  [new]
isdenno
Member

Откуда:
Сообщений: 92
JaRo,

Ну уже ничего, Спасибо
19 май 10, 16:28    [8801699]     Ответить | Цитировать Сообщить модератору
 Re: Использование коллекции. Подскажите как правильно?  [new]
isdenno
Member

Откуда:
Сообщений: 92
GL,

наличие временной таблицы зависит не от меня.
19 май 10, 16:30    [8801710]     Ответить | Цитировать Сообщить модератору
 Re: Использование коллекции. Подскажите как правильно?  [new]
Pavel Ghost
Member

Откуда: UK
Сообщений: 151
А ещё если база 10g и выше, то несколько like-ов я бы объединил одним regexp_like.
19 май 10, 16:47    [8801882]     Ответить | Цитировать Сообщить модератору
 Re: Использование коллекции. Подскажите как правильно?  [new]
Pavel Ghost
Member

Откуда: UK
Сообщений: 151
И тогда пользуясь вариантом:
GL

select * 
from table_ t join subtable_ s on t.id=s.tid 
where (
       :param_='S' and (t.name_ like 'X%' or t.name_ like 'Y%')
   or  :param_='L' and t.name_ like 'Z%'
   or  :param_='F' and (t.name_ like 'Z%' or t.name_ like 'Y%')
)

тут кстати со скобками в условиях ваще труба ;-) or-ы надо отделять-таки

можно сделать:

select * 
from table_ t join subtable_ s on t.id=s.tid 
where regexp_like(t.name_, decode(:param_, 'S', '^[XY].*', 'L', '^Z.*', 'F', '^[ZY].*'))

С regexp-ами давно не делал - мог накосячить, но идея, думаю, понятна
19 май 10, 16:53    [8801953]     Ответить | Цитировать Сообщить модератору
 Re: Использование коллекции. Подскажите как правильно?  [new]
Сергей Арсеньев
Member

Откуда:
Сообщений: 4118
Как-то так?
create type t_collect is table of NUMBER;
/

declare 
 vcollect t_collect;
 count_row number;
begin
 select level bulk collect into vcollect
   from dual connect by level<100;

 select count(*) into count_row
   from (select level*2 id from dual connect by level<100)
  where id in (select * from Table(vcollect));

 dbms_output.put_line(count_row);
 
end; 
/
19 май 10, 16:59    [8802006]     Ответить | Цитировать Сообщить модератору
 Re: Использование коллекции. Подскажите как правильно?  [new]
isdenno
Member

Откуда:
Сообщений: 92
Pavel Ghost,

Сейчас буду эксперементировать
19 май 10, 18:46    [8802673]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить