2015-04-23 2 views
0

Я хочу получить первое значение для всех подчастей всех таблиц в моей базе данных Oracle. Из моего набора результатов я хочу обновить другую таблицу с возвращаемыми значениями и вставить комментарий (например, «Нет значения») для дочерних элементов, которые пусты.Извлечь первую строку из всех дочерних разделов во всех таблицах в базе данных Oracle

Я написал код, чтобы начать с одной таблицы. Не могли бы вы сказать, правильно ли я использую алгоритм и почему нет выхода?

DECLARE 

BEGIN 


for i in (select table_name, subpartition_name 
from dba_tab_subpartitions 
where table_name ='my_table' 
order by 1) 

loop 

execute immediate ' insert into bkp_part (partition_name) values('||i.subpartition_name||')'; 

commit; 

execute immediate 'select * 
from '|| i.table_name||' subpartition('||i.subpartition_name||') 
where rownum < 2'; 

end loop; 

end; 


END; 
/
+0

Информация о вашей схеме может быть полезно. –

ответ

0

Нет вывода, потому что вы его не создаете. Ваш динамический запрос не будет выполнен, потому что вы не выбираете столбцы ни во что; если вам действительно нужна целая строка, вам понадобится переменная %rowtype для выбора, но я не уверен, действительно ли вам нужна целая строка или только одно значение. И, выбрав в чем-то, вам нужно использовать эту переменную - положить ее в таблицу из того, что вы сказали, или отобразить для отладочной информации через dbms_output.

Ваш оператор вставки не обязательно должен быть динамическим; вы можете просто сделать:

insert into bkp_part (partition_name) values (i.subpartition_name); 

Чтобы получить первую строку из каждого подраздела, необходимо установить, что вы имеете в виду под «первым». В этом примере я использую хеш-подразделение, поэтому для аргумента я решу, что «первая» строка является наименьшим значением в этом хэш-ведре, а чтобы сохранить ее просто, меня интересует только одна колонка ,

Я создал фиктивную таблицу:

create table my_table (id number, part_date date) 
partition by range (part_date) 
subpartition by hash (id) 
subpartition template (
    subpartition subpart_1, 
    subpartition subpart_2, 
    subpartition subpart_3) 
(
    partition part_1 values less than (date '2015-01-01') 
); 

insert into my_table values (1, date '2014-12-29'); 
insert into my_table values (2, date '2014-12-30'); 
insert into my_table values (4, date '2014-12-31'); 

Глядя на то, как распределены данные, у меня нет ничего в первом подразделу, идентификаторы 1 и 4 во втором, и ID 2 в в третьих.

Это означает, что я могу сделать:

set serveroutput on 
declare 
    l_id my_table.id%type; 
begin 
    for i in (
    select table_name, subpartition_name 
    from user_tab_subpartitions 
    where table_name = 'MY_TABLE' 
    order by table_name, subpartition_position 
) loop 

    -- skipping because I don't have that table 
    -- insert into bkp_part (partition_name) values (i.subpartition_name); 

    execute immediate 'select min(id) from ' || i.table_name 
     || ' subpartition(' || i.subpartition_name || ')' 
     into l_id; 

    -- just for debugging/demo 
    dbms_output.put_line('Subpartition ' || i.subpartition_name 
     || ' minimum ID is ' || l_id); 

    -- do something else with the value; update or insert... 
    -- update bkp_part set min_id = l_id 
    -- where partition_name = i.subpartition_name; 
    end loop; 
end; 
/

anonymous block completed 
Subpartition PART_1_SUBPART_1 minimum ID is 
Subpartition PART_1_SUBPART_2 minimum ID is 1 
Subpartition PART_1_SUBPART_3 minimum ID is 2 

Вы можете адаптировать, что, чтобы получить столбцы, которые вы заинтересованы и сделать что-то более полезное с ними (например, вставка/обновление вашей bkp_part таблицы)

Смежные вопросы