Содержимое каталога PL / SQL Oracle_home файла listener.ora - PullRequest
1 голос
/ 02 июня 2011

Я пытаюсь записать содержимое файла listener.ora в другой файл без жесткого кодирования в каталоге.

Первоначально это работало, когда я указывал каталог как:

'C:\app\OracleDB11g\product\11.2.0\dbhome_1\NETWORK\ADMIN'

Но я не хочу жестко кодировать, потому что этот скрипт будет использоваться на разных машинах / БД.

CREATE OR REPLACE DIRECTORY LISTENERDIR AS '%ORACLE_HOME%/NETWORK/ADMIN/';
declare
f utl_file.file_type;
fOUT utl_file.file_type;
s varchar2(200);
begin
f := utl_file.fopen('LISTENERDIR','listener.ora','R');
loop
    utl_file.get_line(f,s);
    fOUT := utl_file.fopen('OUTPUT','oraDBoutput.txt','A');
    utl_file.put_line(fOUT,s);
    utl_file.fclose(fOUT);
end loop;
exception
when NO_DATA_FOUND then
    utl_file.fclose(f);
end;
/

drop directory LISTENERDIR;

Я пытался использовать другие косые черты, маленькие заглавные буквы, различные варианты, например \NETWORK\ADMIN, и даже назначать переменную из dbms_system.get_env(), но безрезультатно.

Ответы [ 2 ]

2 голосов
/ 02 июня 2011

Посмотрите, работает ли это для вас:

SELECT SUBSTR(file_spec, 1, INSTR(file_spec, '\', -1, 2) -1)
FROM dba_libraries
WHERE library_name = 'DBMS_SUMADV_LIB';

Нашли здесь здесь .

Это программно даст вам ORACLE_HOME, оттуда вы можете создать свой объект каталога Oracle:

DECLARE
  dir VARCHAR2(2000);
BEGIN
   SELECT 'CREATE OR REPLACE DIRECTORY  LISTENERDIR AS '''||
          SUBSTR(file_spec, 1, INSTR(file_spec, '\', -1, 2) -1) ||''''
    INTO dir
    FROM dba_libraries
    WHERE library_name = 'DBMS_SUMADV_LIB';

   EXECUTE IMMEDIATE dir;
   ... do your stuff here...
   EXECUTE IMMEDIATE 'DROP DIRECTORY LISTENERDIR';
END;
/
1 голос
/ 02 июня 2011
CREATE OR REPLACE DIRECTORY LISTENERDIR AS

'% ORACLE_HOME% / NETWORK / ADMIN /';

Мы не можем этого сделать. Мы должны указать абсолютный путь к ОС при создании объекта каталога. Вот почему это сработало, когда вы использовали полный путь. Это в документации. Узнайте больше .

Если вы действительно хотите создать библиотеку динамически, вы можете сделать это следующим образом:

SQL> conn / as sysdba
Connected.    

SQL> declare
  2      l_home varchar2(255);
  3  begin
  4      dbms_system.get_env('ORACLE_HOME', l_home);
  5
  6      execute immediate 'create directory listenerdir as '''
  7          ||l_home||'\NETWORK\ADMIN''';
  8  end;
  9  /

PL/SQL procedure successfully completed.

SQL>
SQL> select directory_path
  2  from all_directories
  3  where directory_name = 'LISTENERDIR'
  4  /

DIRECTORY_PATH
--------------------------------------------------------------------------------
C:\app\oracle\product\11.1.0\db_1\NETWORK\ADMIN

SQL>

DBMS_SYSTEM.GET_ENV () гарантированно вернет правильный каталог для $ ORACLE_HOME, используемого для запуска экземпляра; других методов нет. Только пользователь SYS имеет права на DBMS_SYSTEM по умолчанию, но тогда только ограниченные учетные записи должны иметь привилегию CREATE ANY DIRECTORY.


Не уверен, почему вы используете PL / SQL для этого. Я всегда за использование базы данных, чтобы сделать как можно больше, но это кажется мне слишком сложным способом выполнения простой копии ОС.

...