1

我正在尝试将 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,甚至从 the 中分配一个变量,dbms_system.get_env()但无济于事。

4

2 回答 2

2

看看这是否适合你:

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;
/
于 2011-06-02T05:33:39.610 回答
1
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 来执行此操作。我总是赞成尽可能多地使用数据库,但这让我觉得这是一种执行简单操作系统副本的过度精细的方式。

于 2011-06-02T05:38:12.690 回答