Гость
Форумы / Oracle APEX [игнор отключен] [закрыт для гостей] / Как загнать строки выборки в массив? / 22 сообщений из 22, страница 1 из 1
24.03.2010, 16:53
    #36540326
Foxter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как загнать строки выборки в массив?
Как загнать строки выборки в массив (или коллекцию)?

Пытался :( сделать так

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
DECLARE 

QUR varchar2( 1000 );

BEGIN

QUR:='select templ_id into gen_arr from tc_templs_user where user_id =ALT';
--HTP.P(TO_CHAR(QUR));

APEX_COLLECTION.CREATE_COLLECTION_FROM_QUERY(
p_collection_name => ‘IR_TEST’,
p_query => QUR );


END;

Ругается на p_collection_name => ‘IR_TEST’,
Как правильно это оформить?
...
Рейтинг: 0 / 0
24.03.2010, 16:54
    #36540333
Foxter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как загнать строки выборки в массив?
Сорри, очепятка. Верно:

Код: plaintext
QUR:='select templ_id from tc_templs_user where user_id =ALT';

Но итог не меняется :(
...
Рейтинг: 0 / 0
24.03.2010, 18:50
    #36540641
Poyasnoy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как загнать строки выборки в массив?
А так

Код: plaintext
QUR:='select templ_id from tc_templs_user where user_id =''ALT''';
...
Рейтинг: 0 / 0
25.03.2010, 08:46
    #36541289
Foxter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как загнать строки выборки в массив?
PoyasnoyА так

Код: plaintext
QUR:='select templ_id from tc_templs_user where user_id =''ALT''';


А не имеет значения. Мне главное чтобы результат запроса записывался в массив или коллекцию. То есть набор записей.
...
Рейтинг: 0 / 0
25.03.2010, 09:03
    #36541310
Foxter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как загнать строки выборки в массив?
APEX_COLLECTION.CREATE_COLLECTION_FROM_QUERY(
p_collection_name => ‘IR_TEST’,
p_query => QUR );

?
...
Рейтинг: 0 / 0
25.03.2010, 09:05
    #36541313
Foxter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как загнать строки выборки в массив?
И возникает такая ошибка

авторORA-20104: create_collection_from_query Error:ORA-20001: Invalid parsing schema for current workspace ID
ORA-06512: íà "APEX_030200.WWV_FLOW_COLLECTION", line 716
ORA-06512: íà line 9
...
Рейтинг: 0 / 0
25.03.2010, 09:20
    #36541331
Foxter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как загнать строки выборки в массив?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
DECLARE
QUR VARCHAR2( 1000 );
gen_arr apex_application_global.vc_arr2; -- äëÿ ids òåìïëåéòîâ

BEGIN

select templ_id into QUR  from tc_templs_user where user_id ='ALT';

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 вместо нее ...
...
Рейтинг: 0 / 0
25.03.2010, 12:35
    #36541909
non-apexoid
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как загнать строки выборки в массив?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
declare
    gen_arr apex_application_global.vc_arr2;
    i pls_integer;
begin
  select templ_id bulk collect into gen_arr from tc_templs_user where user_id='ALT';
  for i in  1  .. gen_arr.count loop
    dbms_output.put_line(gen_arr(i));
  end loop;  
end;
...
Рейтинг: 0 / 0
25.03.2010, 14:17
    #36542290
Foxter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как загнать строки выборки в массив?
Спасибо. Получилось примерно вот-так:

Код: plaintext
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.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
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;

теперь остается только "изъять" номера из шаблонов пользователя
...
Рейтинг: 0 / 0
25.03.2010, 14:41
    #36542377
suPPLer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как загнать строки выборки в массив?
Вот оно, отсутствие правильного проектирования. Теперь, вместо простого
Код: plaintext
 delete usr_templates where usr_id = ... and ':'||templ_item||':' like del_string
нужно будет разбирать каждую строку и собирать заново... Нормализовали бы Вы всё это, пока не поздно.
-------------------------------------------------------
When I say "RTFM" or "STFF" or "STFW",
the third letter means "Following" or "Fine"...
...
Рейтинг: 0 / 0
25.03.2010, 15:43
    #36542621
non-apexoid
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как загнать строки выборки в массив?
Вообще, держать некие ID в виде строки с разделителями - идея не очень, мягко говоря.
...
Рейтинг: 0 / 0
26.03.2010, 09:24
    #36543725
Foxter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как загнать строки выборки в массив?
suPPLer Нормализовали бы Вы всё это, пока не поздно.


А что Вы имеете ввиду? Как это можно нормализовать?
...
Рейтинг: 0 / 0
26.03.2010, 09:25
    #36543727
Foxter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как загнать строки выборки в массив?
non-apexoidВообще, держать некие ID в виде строки с разделителями - идея не очень, мягко говоря.

Есть другие варианты? :)
...
Рейтинг: 0 / 0
26.03.2010, 14:03
    #36544643
suPPLer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как загнать строки выборки в массив?
FoxtersuPPLer Нормализовали бы Вы всё это, пока не поздно.


А что Вы имеете ввиду? Как это можно нормализовать?

RTFWiki Третья нормальная форма .

Ваше поле content должно быть отдельной таблицей (я б даже конкретизировал - IOT) с полями, определяющими шаблон и хранимый айдишник. В дополнение можно создать виртуальный столбец (если используется 11g) вида as ':' || <хранимый айдишник> || ':' и индекс по нему для ускорения поиска. Или просто соответствующий FBI.
...
Рейтинг: 0 / 0
26.03.2010, 14:59
    #36544847
Foxter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как загнать строки выборки в массив?
SuPPler, нормализация - это, конечно, необходимо, но раздувать таблицы из-за хранения шаблонов пользователя - это роскошь :)

В итоговом варианте получилось так:

Код: plaintext
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.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
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); -- N's 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; 
    
    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;

Осталось только убрать ':' на конце. Посоветовали substr, но там надо указывать номер позиции и длину. А нужен - то только последний символ. Я думал, что есть какая функция, например какой trim там - right_trim :)
...
Рейтинг: 0 / 0
26.03.2010, 15:19
    #36544893
suPPLer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как загнать строки выборки в массив?
FoxterSuPPler, нормализация - это, конечно, необходимо, но раздувать таблицы из-за хранения шаблонов пользователя - это роскошь :)

Вы бы посчитали, на сколько раздуете Ваши таблицы...

FoxterОсталось только убрать ':' на конце. Посоветовали substr, но там надо указывать номер позиции и длину. А нужен - то только последний символ. Я думал, что есть какая функция, например какой trim там - right_trim :) Название практически угадано - RTFM RTRIM .
...
Рейтинг: 0 / 0
26.03.2010, 16:01
    #36545038
Foxter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как загнать строки выборки в массив?
С Вашей помощью получилась вот такая конструкция:

Код: plaintext
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.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
declare
    sels apex_application_global.vc_arr2; 
    tmp VARCHAR2( 1000 ); 
    gen_arr apex_application_global.vc_arr2;
    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 ):=  121 ;
  sample_arr( 4 ):=  81 ;
  sample_arr( 5 ):=  121 ;
-- Later, it needs to fill from shuttle

  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;

Правда, когда переношу ее в апекс, он почему - то принимает for за переменную привязки и пишет
автор
ORA-20001: Unable to bind :FOR verify length of item is 30 bytes or less. Use v() syntax to reference items longer than 30 bytes. ORA-01006: переменной привязки не существует
...
Рейтинг: 0 / 0
29.03.2010, 11:05
    #36547667
Foxter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как загнать строки выборки в массив?
Ух, избавился от этой ошибки. Так и не понял правда где была, но закоментил DBG блок (в коде) и ошибка исчезла.

И еще хотел поинтересоваться, чтобы тему новую не начинать по поводу такого вопроса

Пишу:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
DECLARE
TMP_VCH VARCHAR2( 100 ) DEFAULT 'WHERE USER_ID=:P4_USER_ID AND TEMPL_ID=GEN_ARR(I)'; -- general condition of request

BEGIN

IF new_templ is null then
dbms_output.put_line('Erasing record');
DELETE FROM TC_TEMPLS_USER WHERE WHR;

ELSE

dbms_output.put_line('Updating record');
-- иначе говоря 
UPDATE TC_TEMPLS_USER SET CONTENT=NEW_TEMPL WHERE WHR;

END IF;

Претнзии оры:

авторORA-06550: Строка 63, столбец 37: PL/SQL: ORA-00920: неверен реляционный оператор ORA-06550: Строка 63, столбец 1: PL/SQL: SQL Statement ignored ORA-06550: Строка 67, столбец 54: PL/SQL: ORA-00920: неверен реляционный оператор ORA-06550: Строка 67, столбец 1: PL/SQL: SQL Statement ignored

Разве так нельзя сделать в пл/скл ?
...
Рейтинг: 0 / 0
29.03.2010, 12:21
    #36547837
suPPLer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как загнать строки выборки в массив?
Foxter...
Разве так нельзя сделать в пл/скл ?

Oracle Application Express - Getting Started ( http://www.oracle.com/technology/products/database/application_express/html/getting_started.html) To do advanced development using Application Express, a good knowledge of SQL and PL/SQL are important .
RTFMe уже, наконец. :)
...
Рейтинг: 0 / 0
29.03.2010, 14:31
    #36548163
Foxter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как загнать строки выборки в массив?
Да, пост, как всегда, неплохой, но ... очень уж большой :) Не всегда есть время перечитать все FM :) для того, чтобы найти решение задачи.

Все равно необходима "начальная детализация" :) - хотя бы примерное направление поиска :)

Я думал, что как в ПЛ можно вернуть\использовать текстовую строку как запрос или его часть. С запросами в виде текста в ПЛ - это понятно (там все - таки функции), но для чистого СКЛ надо что-то иное?
...
Рейтинг: 0 / 0
29.03.2010, 15:00
    #36548250
suPPLer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как загнать строки выборки в массив?
Foxter,

0. Что такое WHR, которое Вы используете? Переменную-то Вы объявили с именем TMP_VCH.
1. То, что Вы пытаетесь сделать, называется Dynamic SQL. Но в Вашем случае это будет попыткой сэкономить спичку, используя боевой лазер - неэффективно. Напишите условие дважды, или используйте FOR + WHERE CURRENT OF, или используйте MERGE.
...
Рейтинг: 0 / 0
29.03.2010, 16:58
    #36548664
Foxter
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как загнать строки выборки в массив?
suPPLerFoxter,

0. Что такое WHR, которое Вы используете? Переменную-то Вы объявили с именем TMP_VCH.



Опечатался ужже в форуме (др. переменную "держал" в голове :))

suPPLer
1. То, что Вы пытаетесь сделать, называется Dynamic SQL. Но в Вашем случае это будет попыткой сэкономить спичку, используя боевой лазер - неэффективно. Напишите условие дважды, или используйте FOR + WHERE CURRENT OF, или используйте MERGE.

Я понимаю, интересен сам механизм ... может пригодится :) Да и, кажется, граммотнее так :)
...
Рейтинг: 0 / 0
Форумы / Oracle APEX [игнор отключен] [закрыт для гостей] / Как загнать строки выборки в массив? / 22 сообщений из 22, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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