【问题标题】:Pl SQL reading text file from directory on databasePl SQL 从数据库目录中读取文本文件
【发布时间】:2016-11-16 11:28:10
【问题描述】:

我必须阅读我在数据库中创建的文本文件。我不确定UTL_FILE.FOPEN 目录参数的适当路径是什么。我很困惑,因为路径不在我的本地电脑上。

我找到这个文件的路径类似于

\\{something here}\winixdb$\{schema here I think}\dev\data

这是我当前的代码。

Declare

f UTL_FILE.FILE_TYPE;
s VARCHAR2(200);

begin

  f:= UTL_FILE.FOPEN({path_here}, 'certs_file.txt', 'R');
  UTL_FILE.GET_LINE(f,s);
  UTL_FILE.FCLOSE(f);
  dbms_output.put_line(s);

end;

现在如果我把确切的路径放在那里就会出错:

ORA-2928: Invalid Directory Path

我尝试查看其他资源,但他们谈论的是在您的本地环境中找到的路径。另外,我不太了解您的数据库中的文件的想法。

我希望看到这个文件被输出到 DBMS。

【问题讨论】:

  • 也许question 的答案会对您有所帮助。 directory 是您需要创建的数据库对象(就像创建表或索引一样)。该位置在 db 服务器计算机上,而不是在客户端上。
  • 我可以通过使用 toad、导航到架构、目录并在那里找到它来访问该位置吗?编辑:我这样做并输入了确切的目录路径,但我似乎仍然得到错误
  • 我猜我们所说的路径是 UNC 路径,并且数据库在 Windows 上运行(如果我错了,请纠正我)。您是否将完整的 UNC 路径放入 fopen 调用中?您的utl_file_dir 设置中有该路径吗?或者您是否创建了指向该 UNC 路径的目录对象?运行 Oracle 服务的操作系统用户是否有权访问该 UNC 路径?

标签: oracle plsql oracle11g utl-file


【解决方案1】:

你必须先声明你要访问的目录{path_here}:

CREATE OR REPLACE DIRECTORY  MY_PATH_ON_DBMS as '{path_here}';

(如果已经存在,你应该用select * from dba_directories;找到它)

;确保oracle 用户可以在 DBMS 上读取它;

然后在你的代码中通过它的名字来调用它:

Declare
  f UTL_FILE.FILE_TYPE;
  s VARCHAR2(200);
begin
  f:= UTL_FILE.FOPEN('MY_PATH_ON_DBMS', 'certs_file.txt', 'R');
  UTL_FILE.GET_LINE(f,s);
  UTL_FILE.FCLOSE(f);
  dbms_output.put_line(s);
end;

【讨论】:

  • oracle用户也应该有写权限还是读权限足够?
  • 只读权限应该足够了。谢谢我更新了这个。
  • 一定要申报吗?我在其他模式中看到一些未声明(或声明为变量)的包。
  • 您在数据库中声明它,而不是在包中。检查它是否已经存在 select * from dba_directories;
  • 是的。我在那里看到了目录的名称 V_COP。如果我在我的 plsql 文件中创建它,我会收到一个权限不足的错误,但这没有任何意义,因为我可以导航到目录并读/写文件。此外,我看到人们在不声明目录的情况下读取文件。
猜你喜欢
  • 2016-03-17
  • 2014-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-30
  • 2019-05-14
相关资源
最近更新 更多