如何在 oracle home 中创建目录

how to create directory in oracle home

我需要在oracle 安装文件夹中创建一个oracle 目录。在我的例子中,这条路径是 D:\app\Administrator\product.2.0\dbhome_1。我试过 create directory ora_dir as '\',但这参考了 D:\。 有没有办法创建指向 oracle_home 的目录?

此致。

您需要提供完整路径:

CREATE DIRECTORY ORA_DIR AS 'D:\app\Administrator\product.2.0\dbhome_1';

如果您已经从过程中动态执行此操作,则可以通过 Java 调用获取 ORACLE_HOME 环境变量(因为它是在实例启动时设置的),但是您需要一个单独的功能:

create or replace function getenv(name varchar2) return varchar2
as language java
name 'java.lang.System.getenv(java.lang.String) return java.lang.String';
/

create or replace procedure p42 as
begin
  execute immediate q'[CREATE or replace DIRECTORY DIRECTORY_DIR AS ']'
    || getenv('ORACLE_HOME') || q'[']';
end;
/

假设两者都编译成功,执行时使用环境变量中的路径创建目录:

exec p42;

PL/SQL procedure successfully completed.

select directory_path
from all_directories
where directory_name = 'DIRECTORY_DIR';

DIRECTORY_PATH
----------------------------------------
/dboracle/orabase/product/11.2.0

如果您的程序在包中,函数也可以在包中,如果您愿意,可以私下使用。并且您不需要任何额外的权限来使用 Java 调用,只需 create procedure,在这种情况下您已经拥有。

不幸的是,这在 Windows 和 ORACLE_HOME is set in the registry, not the environment; it may be possible to get information from the registry 中不起作用,但您可能还有多个 Oracle Home,因此您必须确定要使用哪个注册表项。

还有一个(如 Aramillo 所发现的)[未记录] 内置 DBMS_SYSTEM package 可以提供相同的信息;你可以这样做:

create or replace procedure p42 as
  l_oracle_home varchar2(100);
begin
  dbms_system.get_env('ORACLE_HOME', l_oracle_home);
  execute immediate q'[CREATE or replace DIRECTORY DIRECTORY_DIR AS ']'
    || l_oracle_home || q'[']';
end;
/

但是您需要获得对该包的执行权限,并且它的未记录状态可能会让您暂停;无论如何,某些功能似乎仅限于 SYSDBA(注意 159968.1)。

在 My Oracle Support 中查找 DBMS_SYSTEM 参考资料时,我也偶然发现了这个选项:

select nvl(substr(file_spec, 1, instr(file_spec, 'lib') -2),
  substr(file_spec, 1, instr(lower(file_spec), 'bin') -2)) as oracle_home
from dba_libraries
where library_name='DBMS_SUMADV_LIB';

... 显然也适用于 Windows,但您需要足够的权限才能查看数据字典条目。