Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Oracle > Как загнать результат выборки в массив?


Автор: alt5000 25.3.2010, 09:45
Код

DECLARE
QUR VARCHAR2(1000);
gen_arr apex_application_global.vc_arr2; -- äëÿ ids òåìïëåéòîâ

BEGIN

--dbms_output.put_line('!!!');

select templ_id into gen_arr(1)  from tc_templs_user;

gen_arr(1):= QUR;

FOR z IN 1..gen_arr.count LOOP

dbms_output.put_line(gen_arr(z));
          
END LOOP;

/*APEX_COLLECTION.CREATE_COLLECTION_FROM_QUERY(
p_collection_name => 'IR_TEST',
p_query => QUR );*/


END;


Не могу понять как заполнить массив gen_arr

Автор: azesmcar 25.3.2010, 09:52
alt5000

А зачем? Итерацию можно и по запросу сделать
Код

FOR z IN (select templ_id from tc_templs_user) LOOP
...
END LOOP;

Автор: Zloxa 25.3.2010, 09:53
а я не могу понять что вы пытаетесь сделать.

А массив gen_arr вы таки смогли заполнить. smile  Правда чем - не понятно.

Автор: alt5000 25.3.2010, 11:50
Цитата(Zloxa @ 25.3.2010,  09:53)
а я не могу понять что вы пытаетесь сделать.

А массив gen_arr вы таки смогли заполнить. smile  Правда чем - не понятно.

smile

Автор: Zloxa 25.3.2010, 11:53
Цитата(alt5000 @  25.3.2010,  11:50 Найти цитируемый пост)
  smile 

Определенно это внесло полную ясность по сути вопроса. Дополнительных вопросов к Вам не имею. smile 

Автор: DimW 25.3.2010, 14:16
Цитата(azesmcar @  25.3.2010,  09:52 Найти цитируемый пост)
А зачем? Итерацию можно и по запросу сделать

а зачем делать итерацию по запросу когда можно использовать BULK COLLECT smile

Автор: azesmcar 25.3.2010, 14:22
Цитата(DimW @  25.3.2010,  14:16 Найти цитируемый пост)
а зачем делать итерацию по запросу когда можно использовать BULK COLLECT smile 

не знаю, для чего-то же придумали циклы, зависит от задачи. Я не совсем понял как может BULK COLLECT решить задачу, которую решают циклы?

Автор: DimW 25.3.2010, 14:28
azesmcar, это:
Код

declare
  n pls_integer := 1;
begin  
  for z in (select templ_id from tc_templs_user) loop
    gen_arr(n) := z.templ_id;
    n := n + 1; 
  end loop; 
end; 


эквивалентно этому:
Код

begin
  select templ_id
    bulk collect into gen_arr
    from tc_templs_user;
end; 

Автор: azesmcar 25.3.2010, 14:32
DimW

Это понятно, ты меня не понял. Автор заливал данные в массив, а потом делал по ним итерацию, я так понял что конечная цель итерация, потому предложил сразу ее же делать, без массива (а зачем он нужен?).

Автор: DimW 25.3.2010, 14:38
я просто расценил последнюю итерацию как проверку содержимого в массиве.
в этом то мы и разошлись smile

Автор: azesmcar 25.3.2010, 14:40
Цитата(DimW @  25.3.2010,  14:38 Найти цитируемый пост)
я просто расценил последнюю итерацию как проверку содержимого в массиве.
в этом то мы и разошлись smile 

да в этом вопросе вообще много неясности, и насколько я понимаю у автора нет никакого желания прояснять smile 

Автор: DimW 25.3.2010, 14:45
некогда ему, доку читает наверное... 

Автор: alt5000 26.3.2010, 13:10
Спасибо за терпение. Почитал доку smile На выходе получилась сия конструкция на "балках"

Код

declare
    sels apex_application_global.vc_arr2; -- ÷èñëà èç content çàïèñè
    tmp VARCHAR2(1000); -- ïåðåìåííàÿ ïîëÿ content
    gen_arr apex_application_global.vc_arr2;-- íàáîð id çàïèñåé
    sample_arr apex_application_global.vc_arr2; -- âûáîð øàòòëà
    i pls_integer;
    cnt pls_integer default 0;
begin
  
  /* IDS */
  
  sample_arr(1):= 67;
  sample_arr(2):= 73;
  sample_arr(3):= 69;
  sample_arr(4):= 81;
  sample_arr(5):= 121;
  
  
  select templ_id bulk collect into gen_arr from tc_templs_user where user_id='ALT'; -- Âûáèðàåò ids øàáëîíîâ
  
  for i in 1 .. gen_arr.count loop  
  dbms_output.put_line(gen_arr(i));
  
    select content into tmp from tc_templs_user where user_id = 'ALT' and templ_id = gen_arr(i);-- ñ÷èòûâàåò ïîëå content êîíêðåòíîãî id
        sels:=APEX_UTIL.STRING_TO_TABLE(tmp); -- Âûáèðàåì ÷èñëà èç ïîëÿ content â ìàññèâ
        --dbms_output.put_line(gen_arr(i));
              
              for a in 1..sels.count loop 
            
              /* Îáðàáîòêà ñîâïàäåíèé */
            
              for s in 1..sample_arr.count loop
            
              if sels(a)=sample_arr(s) then
              cnt:=cnt+1;
              dbms_output.put_line('cnt: '||cnt);
              end if;
            
              end loop;
            
            dbms_output.put_line('sels'||' _ '||sels(a));-- âûâîä ìàññèâà
            --dbms_output.put_line('sels'||' _ '||gen_arr(i));
            end loop;
        --dbms_output.put_line(tmp);
        end loop; 
    --dbms_output.put_line(gen_arr(i));

   

  
end;


Теперь как бы еще вопросик. Что-то поискал - не нашел. Как мне убрать последний символ из строки вида 12:54:898: ?

Автор: azesmcar 26.3.2010, 13:14
Цитата(alt5000 @  26.3.2010,  13:10 Найти цитируемый пост)
Как мне убрать последний символ из строки вида 12:54:898: ? 

т.е. функция substr тебе не знакома? smile 

Автор: alt5000 26.3.2010, 14:29
Цитата(azesmcar @  26.3.2010,  13:14 Найти цитируемый пост)
substr 


В общем... этой функции нужна позиция (1) и длина (2)

И каким образом удалить последний символ?

Я думал есть ф-ция типа trim, там right_trim, например...

Автор: azesmcar 26.3.2010, 14:34
Цитата(alt5000 @  26.3.2010,  14:29 Найти цитируемый пост)

В общем... этой функции нужна позиция (1) и длина (2)

И каким образом удалить последний символ?

а функция length и арифметическая операция - (минус)?

Цитата(alt5000 @  26.3.2010,  14:29 Найти цитируемый пост)
Я думал есть ф-ция типа trim, там right_trim, например... 

trim удаляет все символы а не 1, если я не ошибаюсь там нельзя указать количество удаляемых символов. Если это устраивает - тогда RTRIM.
А вообще такие вопросы решаются с помощью документации
http://psoug.org/reference/string_func.html

так намного быстрее, чем ждать ответа на форуме

Автор: alt5000 26.3.2010, 15:05
Да, Вы правы. Спасибо, Вы мне очень помогли. Закончу - отпишусь как все получилось.

Добавлено через 6 минут и 1 секунду
Получилось вот так:

Код

declare
    sels apex_application_global.vc_arr2; -- ÷èñëà èç content çàïèñè
    tmp VARCHAR2(1000); -- ïåðåìåííàÿ ïîëÿ content
    gen_arr apex_application_global.vc_arr2;-- íàáîð id çàïèñåé
    sample_arr apex_application_global.vc_arr2; -- âûáîð øàòòëà
    i pls_integer;
    cnt pls_integer default 0;
    new_templ varchar2(1000); -- "ïåðåñòðîåííûé" òåìïëåéò
    collect_tmpl apex_application_global.vc_arr2; -- íàáîð ãîòîâûõ ïðîâåðåííûõ øàáëîíîâ
    tmp_A varchar2(1000); -- :)
    digits_arr apex_application_global.vc_arr2;
begin

  /* IDS Resolve */
  sample_arr(1):= 67;
  sample_arr(2):= 73;
  sample_arr(3):= 69;
  sample_arr(4):= 81;
  sample_arr(5):= 121;


  select templ_id bulk collect into gen_arr from tc_templs_user where user_id='ALT'; -- Âûáèðàåò ids øàáëîíîâ


-- DBG Sector
for i in 1..gen_arr.count loop
tmp:= tmp||gen_arr(i)||':';
end loop;

for a in 1..sample_arr.count loop
tmp_A:=tmp_A||sample_arr(a)||':';
end loop;

dbms_output.put_line('ID Recs user: '||tmp);
dbms_output.put_line('Sample: '||tmp_A);
dbms_output.put_line('----------');
-- DBG Sector

for i in 1..gen_arr.count loop -- in the IDS Mains

   select content into tmp from tc_templs_user where user_id = 'ALT' and templ_id = gen_arr(i); -- Ns id
   dbms_output.put_line('for id: '||gen_arr(i)||' tmp: '||tmp);
   Digits_arr:= APEX_UTIL.STRING_TO_TABLE(tmp); -- ids from current CONTENT
    
    for s in 1..Digits_arr.count loop
    
        for a in 1..sample_arr.count loop -- iterations by sample
        if digits_arr(s)=sample_arr(a) then
        new_templ:=new_templ||sample_arr(a)||':';
        end if;
        end loop;
    
    end loop; 
    
     new_templ:=RTRIM(new_templ,':');
    dbms_output.put_line('for # '||i||' are new_tmpl: '||new_templ);
   
   

-- Execution erase or update 

if new_templ is null then
dbms_output.put_line('Erasing record');
else
dbms_output.put_line('Updating record');
end if;

 dbms_output.put_line('===========================');
 
 new_templ:=null;
end loop;

end;


Вроде как правильно формирует новые строки шаблонов... осталось добавить строки реального удаления и апдейта для записей...

Добавлено через 14 минут и 39 секунд
Да, подошло, просто указываешь "конструкцию обрезки" smile

Код

new_templ:=RTRIM(new_templ,':');

Автор: Zloxa 26.3.2010, 16:08
Цитата(alt5000 @  26.3.2010,  13:10 Найти цитируемый пост)
 на "балках"

использование балков без лимитов признак либо глупости либо самоуверенности.

Не уверен что постиг великую премудрость, но вот этот огород из циклов не эквивалентен ли:
Код

SQL> with tc_templs_user as
  2   (select 'ALT' user_id, '10:11:67:30' content  from dual
  3    union all select 'ALT' user_id, '4:90:69:11' content  from dual
  4    )
  5  select
  6   replace(
  7    replace(
  8       replace(xmlagg(xmlelement("a",extractValue(value(t),'/a'))).getstringval(),'</a><a>',':')
  9       ,'<a>'
 10     )
 11   ,'</a>') new_content
 12  from tc_templs_user u
 13        ,table(xmlsequence( XMLType('<b><a>'||replace(content ,':','</a><a>')||'</a></b>').extract('/b/a'))) t
 14  where user_id='ALT'
 15    and extractValue(value(t),'/a') in ('67','73','69','81','121')
 16  ;
 
NEW_CONTENT
--------------------------------------------------------------------------------
67:69


Добавлено через 8 минут и 28 секунд
хотя таки да. тже огород. Но зато не унылый, что ни наесть творческий  smile 

Автор: alt5000 26.3.2010, 16:19
Цитата(Zloxa @  26.3.2010,  16:08 Найти цитируемый пост)
использование балков без лимитов признак либо глупости либо самоуверенности.


А какие могут быть неблагоприятные последствия?

Автор: Zloxa 26.3.2010, 16:45
Цитата(alt5000 @  26.3.2010,  16:19 Найти цитируемый пост)
последствия

может статься так, что запрашиваемый набор даных засрет всю оперативу

Автор: ToshaCh 26.3.2010, 17:07
Цитата(alt5000 @  26.3.2010,  16:19 Найти цитируемый пост)
А какие могут быть неблагоприятные последствия?

Анальная кара от вашего dba! 

Данная операция это фактически загон напрямую в память всего результата работы курсора. А в базах данных объёмы могут быть весьма впечатляющими. Ты ведь не станешь работая на Си с файлом полностью читать его с диска, или станешь?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)