Объединение операторов выбора SQL с оператором in для групп дисков ASM - PullRequest
0 голосов
/ 03 ноября 2018

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

Итак, в этом процессе - я хочу создать динамический sql из v$asm_disk, v$asm_diskgroup.

SQL:

select d.path, d.FAILGROUP,d.os_mb/1024 GB
from v$asm_disk d, v$asm_diskgroup dg
where d.group_number = dg.group_number and dg.name='Test_archive'
order by DISK_GROUP_NAME;

Динамический SQL-выход должен выглядеть следующим образом:

ALTER DISKGROUP Test_archive DROP DISK mnc1, mnc2, mnc3;

Не могли бы вы, пожалуйста, дать мне знать, как добиться вышеуказанного вывода?

Ответы [ 2 ]

0 голосов
/ 03 ноября 2018

Вы можете использовать такой механизм как ниже

(но будьте осторожны с этой критической и опасной операцией, перед использованием выполните немедленное , просто отправьте результаты с помощью dbms_output. put_line ) :

SQL> set serveroutput on;
SQL> declare
  v_command varchar2(5000);
begin
    for c in 
    ( 
      select failgroup, listagg(name, ',') within group(order by name) as disks
        from (select d.failgroup, dg.name
                from v$asm_disk d
                join v$asm_diskgroup dg
                  on (d.group_number = dg.group_number)
               where dg.name = 'Test_archive'
               group by d.failgroup, dg.name)
       group by failgroup 
    )
    loop
     begin      
         v_command := 'ALTER DISKGROUP  '||c.failgroup||' DROP DISK '||c.disks||';';
         dbms_output.put_line( v_command );
        --execute immediate v_command; --firstly comment this line out to see
                                       --whether the result as you want, then
                                       --open for the operation.
      exception when others then 
        begin
         dbms_output.put_line( sqlerrm );
        end; 
     end;  
    end loop;
end;
0 голосов
/ 03 ноября 2018

Это вам помогает? Дайте мне знать, если вы хотите что-нибудь объяснить:

select 
       'ALTER DISKGROUP Test_archive DROP DISK'
    || chr(10)
    || listagg(dg_name,','||chr(10)) within group (order by dg_name)
    ||';'
from
-- your query here, placeholder with test data:
(select 'mnc1' dg_name from dual union all select 'mnc2' from dual union all select 'mnc3' from dual)
;

Выход:

ALTER DISKGROUP Test_archive DROP DISK
mnc1,
mnc2,
mnc3;
...