PL / SQL Oracle目录

时间:2016-11-07 17:51:29

标签: sql oracle plsql cmd directory

我使用util_file.fopen将.txt文件导入数据库。但是,我不想硬编码目录。有没有办法将当前目录保存到变量或记录路径?这样我就可以创建一个当前目录的oracle目录,而util_file.fopen将始终打开我运行pl / sql的目录中的.txt文件

我知道“主机CD”会显示我当前的目录,但我无法将其保存到变量或记录它

由于

2 个答案:

答案 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;
    /