PL/SQL Oracle Directory

3
我正在使用util_file.fopen将一个.txt文件导入到数据库中。然而,我不想硬编码目录。有没有一种方法可以将当前目录保存到变量中或记录路径?这样,我就可以创建一个Oracle目录,它是当前目录,并且util_file.fopen将始终打开我从其中运行pl / sql的目录中的.txt文件。
我知道"HOST CD"会显示我的当前目录,但我无法将其保存到变量或日志中。
谢谢。

你如何将目录传递给程序?fopen函数需要一个目录作为参数。您可以首先将其保存到变量,然后将其传递给fopen函数,最后再使用该变量。 - Kacper
嗨,我目前是使用Bob的方法(创建具有硬编码路径的目录)进行传递。我的问题是,我不想将路径硬编码,我希望它是我正在运行的当前目录。 - JMan
2个回答

4
创建多个目录对象:
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');

祝你好运。


不要忘记授予有关Oracle目录的读写权限。 - wieseman
嗨 Bob - 感谢您的回复!不过,这已经是我目前正在做的事情了。我创建一个目录,然后像您上面所做的那样在 utl_file.fopen 中使用变量。我想要消除的部分是在创建目录时硬编码路径。类似于:Create directory directory_1 as [current directory];我一直在尝试以下操作,但没有成功:create directory diretory_1 as host cd; - JMan
很抱歉要告诉你,但是没有办法做到那样。祝你好运。 - Bob Jarvis - Слава Україні
糟糕...你知道是否有一种方法可以记录“Host CD”命令吗?我无法通过 spooling 和打开 feedback 或通过使用 dbms_output.put_line 进行创意操作来记录它。 - JMan

0
如果你想使用当前工作目录,你可以动态地创建该目录。问题是当多个进程尝试访问你的过程时会出现问题。
如果你能确保只有一个进程在同一时间使用该过程,你可以这样做:
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;
    /

替换和生成子字符串应该更好地完成。 - Kacper

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接