【问题标题】:PL/SQL Oracle_home directory contents of listener.oralistener.ora 的 PL/SQL Oracle_home 目录内容
【发布时间】:2011-06-02 02:59:56
【问题描述】:

我正在尝试将 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() 分配一个变量,但无济于事。

【问题讨论】:

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


    【解决方案1】:

    看看这是否适合你:

    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;
    /
    

    【讨论】:

    • 您提供的两个链接都指出这不一定是实际的 Oracle Home(尤其是在 XP 上)。
    • 没错,但这是我能找到的唯一可能有帮助的东西。另外,我以前从未听说过 dba_libraries,所以这是一个有用的练习;-)
    【解决方案2】:
    CREATE OR REPLACE DIRECTORY LISTENERDIR AS
    

    '%ORACLE_HOME%/NETWORK/ADMIN/';

    我们不能这样做。我们必须在创建目录对象时指定绝对操作系统路径。这就是为什么当您使用完整路径时它起作用的原因。它在文档中。 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 来执行此操作。我总是赞成尽可能多地使用数据库,但这让我觉得这是一种执行简单操作系统副本的过度精细的方式。

    【讨论】:

    • 谢谢!有效。我所要做的就是将内容假脱机到一个文件中:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-21
    • 1970-01-01
    • 1970-01-01
    • 2020-08-14
    • 1970-01-01
    • 2011-09-01
    • 1970-01-01
    相关资源
    最近更新 更多