#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. Удивительные. Огромное спасибо.