我使用util_file.fopen将.txt文件导入数据库。但是,我不想硬编码目录。有没有办法将当前目录保存到变量或记录路径?这样我就可以创建一个当前目录的oracle目录,而util_file.fopen将始终打开我运行pl / sql的目录中的.txt文件
我知道“主机CD”会显示我当前的目录,但我无法将其保存到变量或记录它
由于
答案 0 :(得分:2)
创建多个目录对象:
CREATE DIRECTORY DIRECTORY_1 AS '/some/path';
CREATE DIRECTORY DIRECTORY_2 AS '/some/other/path';
CREATE DIRECTORY DIRECTORY_3 AS '/yet/another/path';
将目录名称分配给变量:
strDirectory_to_use := 'DIRECTORY_1';
打开文件时使用变量:
-- References /some/path/filename.txt
aFile := UTL_FILE.FOPEN(strDirectory_to_use, 'filename.txt', 'r');
更改变量以包含其他目录对象的名称:
strDirectory_to_use := 'DIRECTORY_2';
现在,当您在调用UTL_FILE.FOPEN
时使用该变量时,它将查看目录对象DIRECTORY_2
指向的目录:
-- References /some/other/path/filename.txt
aFile := UTL_FILE.FOPEN(strDirectory_to_use, 'filename.txt', 'r');
祝你好运。
答案 1 :(得分:0)
如果要使用当前工作目录,可以使用dinamically创建该目录。问题是当多个进程尝试访问您的过程时。
如果您可以确保只有一个进程同时使用过程,则可以执行以下操作:
create or replace procedure (mypath varchar2) as
begin
execute immediate 'CREATE OR REPLACE DIRECTORY DIRECTORY_1 AS ' || mypath;
aFile := UTL_FILE.FOPEN(DIRECTORY_1, 'filename.txt', 'r');
end;
/
如果你不能确保只有一个线程会同时调用过程,那就很棘手了。您可以尝试查找目录。
create or replace procedure (mypath varchar2) as
dirname varchar2;
begin
select DIRECTORY_NAME into dirname from dba_directories where DIRECTORY_PATH = mypath;
if (dirname is null) then
dirname := substr(replace(replace(replace(replace(dirname,'\',''),':',''),'/',''),'.',''),1,30);
execute immediate 'CREATE OR REPLACE ' || dirname || ' AS ' || mypath;
end if;
aFile := UTL_FILE.FOPEN(dirname, 'filename.txt', 'r');
end;
/