我需要在oracle安装文件夹中创建一个oracle目录。就我而言,这条路径是D:\app\Administrator\product\11.2.0\dbhome_1
。我尝试了create directory ora_dir as '\'
,但这引用了D:\
。
有没有办法创建指向oracle_home的目录?
问候。
答案 0 :(得分:4)
如果您已经从一个过程动态执行此操作,则可以通过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
,在这种情况下您已经拥有了。{/ p>
不幸的是,这在Windows中并不像ORACLE_HOME is set in the registry, not the environment那样有效;可能get information from the registry但您可能还有多个Oracle主目录,因此您必须确定要使用的注册表项。
还有(如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)。
在寻找DBMS_SYSTEM
引用的My Oracle Support时,我也偶然发现了这个选项:
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,但您需要足够的权限才能查看数据字典条目。
答案 1 :(得分:0)
您需要提供完整路径:
CREATE DIRECTORY ORA_DIR AS 'D:\app\Administrator\product\11.2.0\dbhome_1';