PL / SQL Oracle_home目录内容listener.ora

时间:2011-06-02 02:59:57

标签: oracle file-io plsql oracle11g home-directory

我正在尝试将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 个答案:

答案 0 :(得分:2)

看看这是否适合你:

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

找到它here。并here

这将以编程方式为您提供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 :(得分:1)

CREATE OR REPLACE DIRECTORY LISTENERDIR AS
     

'%ORACLE_HOME%/ NETWORK / ADMIN /';

我们不能这样做。我们在创建目录对象时必须指定绝对OS路径。这就是你使用完整路径时它起作用的原因。它在文档中。 Find out more

如果你真的想动态创建库,你可以这样做:

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来执行此操作。我总是赞成尽可能多地使用数据库,但这让我觉得它是一种执行简单操作系统副本的过于复杂的方式。