我正在尝试将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()
分配变量但无效。
答案 0 :(得分:2)
看看这是否适合你:
SELECT SUBSTR(file_spec, 1, INSTR(file_spec, '\', -1, 2) -1)
FROM dba_libraries
WHERE library_name = 'DBMS_SUMADV_LIB';
这将以编程方式为您提供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;
/
答案 1 :(得分:1)
CREATE OR REPLACE DIRECTORY LISTENERDIR AS
'%ORACLE_HOME%/ NETWORK / ADMIN /';
我们不能这样做。我们在创建目录对象时必须指定绝对OS路径。这就是你使用完整路径时它起作用的原因。它在文档中。 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来执行此操作。我总是赞成尽可能多地使用数据库,但这让我觉得它是一种执行简单操作系统副本的过于复杂的方式。