powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / result execute immediate into array in loop cursor
12 сообщений из 12, страница 1 из 1
result execute immediate into array in loop cursor
    #39286141
Dima DI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Кто подскажет че не так делаю , функция
Код: plsql
1.
select * from table (tmp ('123456789') )  ;

возвращает последнею итерацию execute immediate

Код: 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.
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.
76.
77.
CREATE OR REPLACE TYPE type_gsn IS TABLE OF obj_gsn;
/

CREATE OR REPLACE TYPE obj_gsn as   object (
--SOURCE_TABLE	VARCHAR2 (250 ),
a1		VARCHAR2 (250 ),
a2		DATE,
a3		VARCHAR2 (250 ),
a4		VARCHAR2 (250 ),
a5		NUMBER,
a6		NUMBER,
a7		NUMBER
);
/


CREATE OR REPLACE function tmp (msisdn in varchar2)  return type_gsn as 

v_type_gsn type_gsn;
v_type_gsn_tmp type_gsn;


type rec_xml is record (table_owner varchar2(31),
                        table_name varchar2(31), 
                        partition_name varchar2(31),
                        date# date,
                        high_value varchar2(1000)
                        );
                        
type  obj_xml is table of rec_xml;                   
v_obj_xml obj_xml;

begin 


WITH xml AS 
(SELECT xmltype(DBMS_XMLGEN.getxml('SELECT table_owner,table_name, partition_name, high_value 
                                      FROM dba_tab_partitions
                                     WHERE table_owner = ''TEST''  and table_name=''TEST''
                                       ')) AS xml
   FROM DUAL),
    parsed_xml AS
(SELECT EXTRACTVALUE (xs.object_value, '/ROW/TABLE_OWNER')    AS table_owner,
        EXTRACTVALUE (xs.object_value, '/ROW/TABLE_NAME')     AS table_name,
        EXTRACTVALUE (xs.object_value, '/ROW/PARTITION_NAME') AS partition_name,
        EXTRACTVALUE (xs.object_value, '/ROW/HIGH_VALUE')    AS high_value
   FROM xml x, table (XMLSEQUENCE (EXTRACT (x.xml, '/ROWSET/ROW'))) xs)
SELECT table_owner,table_name, partition_name,to_date( substr(high_value,11,19)  , 'yyyy-mm-dd hh24:mi:ss') date#, high_value  bulk collect into v_obj_xml  FROM parsed_xml
where to_date( substr(high_value,11,19)  , 'yyyy-mm-dd hh24:mi:ss')  between sysdate-5 and sysdate
order by high_value;


 for i in  v_obj_xml.first..v_obj_xml.last
  
loop




execute immediate 'select /*+ parallel(4) */ obj_gsn(a1,a2,a3,a4,a5,a6,a7) from '||
v_obj_xml(i).table_owner ||'.'||v_obj_xml(i).table_name||' partition('||v_obj_xml(i).partition_name||') where msisdn=:1' 
                    bulk collect  into v_type_gsn  using   msisdn;



v_type_gsn_tmp:=v_type_gsn_tmp multiset union all v_type_gsn;

  

 end loop;                  
                                                                          


return v_type_gsn_tmp; 

end;
/
...
Рейтинг: 0 / 0
result execute immediate into array in loop cursor
    #39286199
Фотография -2-
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima DIче не так делаювопрос-то в чем?
И сразу поясни, зачем весь этот огород с функцией, чем просто селект из целевой таблицы не устраивает.
...
Рейтинг: 0 / 0
result execute immediate into array in loop cursor
    #39286209
Dima DI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всего 5 итераций в каждом из 5-ти запросов есть данные, результат функции возвращает результат только последней итерации (первые 4 не возвращаются, такое ощущение что
Код: plsql
1.
v_type_gsn_tmp:=v_type_gsn_tmp multiset union all v_type_gsn;

не работает корректно )
...
Рейтинг: 0 / 0
result execute immediate into array in loop cursor
    #39286908
Dima DI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Вот пример по проще :
Код: 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.
drop type rec force;
create or replace type rec as  object  (id number, name varchar2(10));

drop type obj force;
create or replace type obj is table of rec;

create or replace function test_collection_r1 return obj  as 
v_obj obj;
v_obj_tmp  obj;

begin

for c in 1..5 
loop
--v_obj_tmp:=v_obj;

execute immediate 'select  rec(to_number(1), to_char(''a'') )from dual ' bulk collect into v_obj;

v_obj_tmp:=v_obj_tmp multiset union all  v_obj;

end loop;

return v_obj;

end;



Функция возвращает 1 строчку, а надо 5 :
Код: plsql
1.
2.
3.
4.
5.
6.
SQL> select  * from table( test_collection_r1() )

        ID NAME      
---------- ----------
         1 a         
1 row selected.
...
Рейтинг: 0 / 0
result execute immediate into array in loop cursor
    #39286930
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima DI,
инициализация v_obj_tmp ?
...
Рейтинг: 0 / 0
result execute immediate into array in loop cursor
    #39286934
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima DI,

хотя тут все нормально
Код: plsql
1.
return v_obj;

что хотел то и получил
...
Рейтинг: 0 / 0
result execute immediate into array in loop cursor
    #39286938
Dima DI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да ) , но все равно результат не тот что я хочу :
Код: 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.
SQL> create or replace function test_collection_r1 return obj  as 
v_obj obj;
v_obj_tmp  obj;

begin

for c in 1..5 
loop
v_obj_tmp:=v_obj;

execute immediate 'select  rec(to_number(1), to_char(''a'') )from dual ' bulk collect into v_obj;

v_obj_tmp:=v_obj_tmp multiset union all  v_obj;

end loop;

return v_obj_tmp;

end;
Function created.
SQL> select  * from table( test_collection_r1() )

        ID NAME      
---------- ----------
         1 a         
         1 a         

2 rows selected.
...
Рейтинг: 0 / 0
result execute immediate into array in loop cursor
    #39286947
вместо
multiset union all
нужно
multiset union

(для отбора только уникальных значений используется multiset union distinct)
...
Рейтинг: 0 / 0
result execute immediate into array in loop cursor
    #39286991
элементарно, ватсонвместо
multiset union all
нужно
multiset union

(для отбора только уникальных значений используется multiset union distinct)

впрочем, это не критично.

первоначально перед циклом нужно наполнять ("инициализировать", как подсказал 123йй) переменную
v_obj_tmp

то есть для последнего вашего примера работать будет, если попробовать так:
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
create or replace function test_collection_r1 return obj  as 
v_obj obj;
v_obj_tmp  obj;

begin

execute immediate 'select  rec(to_number(1), to_char(''a'') )from dual ' bulk collect into v_obj_tmp;
for c in 2..5 
loop
execute immediate 'select  rec(to_number(1), to_char(''a'') )from dual ' bulk collect into v_obj;

v_obj_tmp:=v_obj_tmp multiset union all  v_obj;

end loop;

return v_obj_tmp;

end;
...
Рейтинг: 0 / 0
result execute immediate into array in loop cursor
    #39287019
123йй
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
элементарно, ватсон,

а так
Код: plsql
1.
declare v_obj_tmp  obj :=obj()
...
Рейтинг: 0 / 0
result execute immediate into array in loop cursor
    #39287051
123ййэлементарно, ватсон,

а так
Код: plsql
1.
declare v_obj_tmp  obj :=obj()



или так (с)
...
Рейтинг: 0 / 0
result execute immediate into array in loop cursor
    #39287058
Dima DI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Да, это оно , спасибо всем кто откликнулся!
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / result execute immediate into array in loop cursor
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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