Как проверить, есть ли в базе данных oracle несколько PDB, а затем распечатать данные на экран

#oracle

#Oracle

Вопрос:

Моя конечная цель-запросить базу данных, проверить, существует ли v$pdb, а затем, если да, запросить ее. Если этого не произойдет, двигайтесь дальше и займитесь чем-нибудь другим. В принципе, мне нужен скрипт, который работает с 11g и более поздними версиями. Я действительно падаю у первого забора. Я просто хочу, чтобы это выводилось на экран. Все, что он выводит, — это «v_str».

 SET FEEDBACK OFF; SET SERVEROUTPUT ON; declare v_str varchar2(200); v_str1 varchar2(200); begin v_str := 'select dbid, con_id, name into v_str1 from v$pdbs'; v_str1 := q'!begin dbms_output.put_line('v_str'); end;!'; Execute immediate v_str; begin dbms_output.put_line(v_str1); end; /  

Может ли кто-нибудь помочь мне вывести вывод на экран…? Спасибо!

Ответ №1:

Небольшая условная компиляция должна помочь здесь

 SQLgt; declare  2 has_container varchar2(1);  3 in_container varchar2(1);  4 begin  5 $IF DBMS_DB_VERSION.VER_LE_11_2  6 $THEN  7 has_container := 'N';  8 in_container := 'N';  9 $ELSE  10 has_container := case when to_number(sys_context('USERENV','CON_ID')) = 0 then 'N' else 'Y' end;  11 in_container := case when to_number(sys_context('USERENV','CON_ID')) gt; 1 then 'Y' else 'N' end;  12 $END  13 dbms_output.put_line('has_container='||has_container);  14 dbms_output.put_line('in_container='||in_container);  15  16 end;  17 / has_container=Y in_container=N  

В этом коде

  • has_container = является мультитенантом базы данных (Y/N)
  • is_container = если база данных ЯВЛЯЕТСЯ мультитенантной, нахожусь ли я в данный момент в корневой или подключаемой

Затем, если вам нужен список, вы можете использовать цикл курсора

 SQLgt; declare  2 has_container varchar2(1);  3 in_container varchar2(1);  4 begin  5 $IF DBMS_DB_VERSION.VER_LE_11_2  6 $THEN  7 has_container := 'N';  8 in_container := 'N';  9 $ELSE  10 has_container := case when to_number(sys_context('USERENV','CON_ID')) = 0 then 'N' else 'Y' end;  11 in_container := case when to_number(sys_context('USERENV','CON_ID')) gt; 1 then 'Y' else 'N' end;  12 if has_container = 'Y' and in_container = 'N' then  13 for i in ( select name from v$pdbs )  14 loop  15 dbms_output.put_line(i.name);  16 end loop;  17 end if;  18 $END  19 dbms_output.put_line('has_container='||has_container);  20 dbms_output.put_line('in_container='||in_container);  21  22 end;  23 / PDB$SEED PDB1 PDB2 has_container=Y in_container=N SQLgt;  

Комментарии:

1. Удивительные. Огромное спасибо.