如何在 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,但您需要足够的权限才能查看数据字典条目。
我需要在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,但您需要足够的权限才能查看数据字典条目。