从前一段时间,我们公司一直在对 Oracle 目录名称使用小技巧。
在 Oracle 目录之前,我们必须通过 utl_file_dir 参数显式设置 pfile 上的目录。要添加新目录,我们必须重新启动实例。
在 Oracle 目录之后,一切都变得更容易了!
但是一些遗留脚本仍然使用旧样式,使用utl_File.Fopen('/path',...)
而不是utl_File.Fopen('DIRECTORY',...)
小技巧是创建一个目录,其中的名称是所需目录的确切路径。在一个简单的例子中:
create or replace directory "/tmp" as '/tmp';
select * from dba_directories ;
OWNER DIRECTORY_NAME DIRECTORY_PATH
------------------------------ ------------------------------ ---------------------
SYS /tmp /tmp
因此,用户通常可以使用这样的命令:
l_file_handle := UTL_FILE.FOPEN('/tmp','file.txt','W');
这是非常好的。
但是当使用这样的目录作为 EXPDP 转储的输出时,我遇到了一个问题。EXPDP 解析器似乎忽略了任何引号,并且正在解析大写的目录名称。
$expdp \"/ as sysdba\" parfile= parfile.par
Export: Release 10.2.0.3.0 - 64bit Production on Thursday, 05 April, 2018 10:50:19
Copyright (c) 2003, 2005, Oracle. All rights reserved.
Connected to: Oracle Database 10g Enterprise Edition Release 10.2.0.3.0 - 64bit Production
With the Partitioning, OLAP and Data Mining options
ORA-39002: invalid operation
ORA-39070: Unable to open the log file.
ORA-39087: directory name /TMP is invalid
[oracle@brux0009 P00OMS /EXPORT/spool]$ cat parfile.par
DIRECTORY='/tmp'
DUMPFILE=dual.dmp
LOGFILE=dual.log
TABLES=SYS.dual
有小费吗?