PL SQL无法从文件中读取

时间:2011-04-01 05:20:28

标签: sql oracle plsql

我是PL / SQL的新手,我正试图通过PL / SQL从文件中读取,如下所示。我一直得到“ORA-20000”。我在做什么问题?

declare

  output_file  utl_file.file_type;
  firstline    VARCHAR2(1000);
  secondline   VARCHAR2(1000);

BEGIN
  output_file := utl_file.fopen (&1,&2, 'W');
  utl_file.fclose(output_file);
EXCEPTION
  WHEN utl_file.invalid_path THEN
  RAISE_APPLICATION_ERROR(-20000, 'ERROR: INVALID PATH FOR FILE.');
END;
/

2 个答案:

答案 0 :(得分:5)

据推测,这是一个SQL * Plus脚本,对吧?您为两个替换变量提供了什么值?

您是否尝试在服务器上读取文件?或者在您的本地客户端计算机上?

您是否创建了一个与运行时输入的目录对象名称相匹配的Oracle目录对象?

答案 1 :(得分:5)

  

“我已经为当地人提供了道路   客户机“

PL / SQL在数据库服务器上运行,它只能看到从该框中可见的目录。这通常只是本地到服务器的目录,除非您还有映射的网络驱动器。因此,除非您与数据库服务器共享本地PC驱动器,否则PL / SQL将无法访问您的文件。

请记住目录权限也适用;如果操作系统oracle用户或dba组(或Windows等效组)可以读取和写入,则数据库只能读取和写入目录。 Find out more


请注意,OS用户权限仅构成可能可访问的目录池。默认情况下,数据库无权访问任何操作系统目录。

首次引入UTL_FILE时(我认为是Oracle 7),其可访问的目录路径由init.ora文件中的UTL_FILE_DIR参数定义。这既不方便 - 我们不得不重新启动数据库以应用更改 - 而且还不安全,因为读取和写入访问权限是全局授予所有用户的所有目录。

在Oracle 9i中,我们获得了数据库DIRECTORY对象。这很简洁,因为我们可以使用直接DDL创建或删除DIRECTORY,因此不需要重新启动。更好的是,DIRECTORY的权限被授予命名用户,我们可以区分READ或WRITE权限。

但是在这两种情况下我们都必须使用绝对文件路径。没有相对路径,没有通配符。

Oracle的在线文档中介绍了该语法。 Find out more


  

“那我怎么能在我的本地访问文件   客户端机器?“

一种解决方案是与网络共享本地驱动器。这很少是可取的。

更实用的解决方案是使用ftp之类的东西将文件从本地驱动器移动到数据库服务器。您如何实施这取决于您的具体情况。如果这是临时要求,那么命令行ftp或旧的WinSCP就足够了。如果这是普通用户所需要的,那么您可能希望在应用程序中构建一个包含的功能。