Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Oracle [игнор отключен] [закрыт для гостей] / result execute immediate into array in loop cursor / 12 сообщений из 12, страница 1 из 1
04.08.2016, 12:34:00
    #39286141
Dima DI
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
result execute immediate into array in loop cursor
Кто подскажет че не так делаю , функция
Код: 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
04.08.2016, 13:22:43
    #39286199
-2-
-2-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
result execute immediate into array in loop cursor
Dima DIче не так делаювопрос-то в чем?
И сразу поясни, зачем весь этот огород с функцией, чем просто селект из целевой таблицы не устраивает.
...
Рейтинг: 0 / 0
04.08.2016, 13:33:03
    #39286209
Dima DI
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
result execute immediate into array in loop cursor
Всего 5 итераций в каждом из 5-ти запросов есть данные, результат функции возвращает результат только последней итерации (первые 4 не возвращаются, такое ощущение что
Код: plsql
1.
v_type_gsn_tmp:=v_type_gsn_tmp multiset union all v_type_gsn;

не работает корректно )
...
Рейтинг: 0 / 0
05.08.2016, 10:09:06
    #39286908
Dima DI
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
result execute immediate into array in loop cursor
Вот пример по проще :
Код: 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
05.08.2016, 10:26:38
    #39286930
123йй
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
result execute immediate into array in loop cursor
Dima DI,
инициализация v_obj_tmp ?
...
Рейтинг: 0 / 0
05.08.2016, 10:29:02
    #39286934
123йй
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
result execute immediate into array in loop cursor
Dima DI,

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

что хотел то и получил
...
Рейтинг: 0 / 0
05.08.2016, 10:31:47
    #39286938
Dima DI
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
result execute immediate into array in loop cursor
Да ) , но все равно результат не тот что я хочу :
Код: 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
05.08.2016, 10:43:19
    #39286947
result execute immediate into array in loop cursor
вместо
multiset union all
нужно
multiset union

(для отбора только уникальных значений используется multiset union distinct)
...
Рейтинг: 0 / 0
05.08.2016, 11:33:32
    #39286991
result execute immediate into array in loop cursor
элементарно, ватсонвместо
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
05.08.2016, 11:56:13
    #39287019
123йй
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
result execute immediate into array in loop cursor
элементарно, ватсон,

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

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



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


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