PL SQL无法从文件中读取

PL SQL无法从文件中读取,sql,oracle,plsql,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(outpu

我是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;
/

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

您正在尝试读取服务器上的文件吗?或者在本地客户机上


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

这大概是一个SQL*Plus脚本,对吗?您为这两个替换变量提供了什么值

您正在尝试读取服务器上的文件吗?或者在本地客户机上

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


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

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

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


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

在首次引入UTL_文件时(我想是Oracle 7),其可访问的目录路径是由
init.ora
文件中的UTL_FILE_DIR参数定义的。这既不方便——我们必须重新启动数据库才能应用更改——也不安全,因为所有用户都被全局地授予所有目录上的读写权限

在Oracle9i中,我们获得了数据库目录对象。这很好,因为我们可以使用直接DDL创建或删除目录,所以不需要重新启动。更好的是,目录上的权限被授予命名用户,我们可以区分读权限和写权限

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

Oracle的在线文档中介绍了语法


“那么我如何访问本地服务器上的文件 客户机?”

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

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


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

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

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


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

在首次引入UTL_文件时(我想是Oracle 7),其可访问的目录路径是由
init.ora
文件中的UTL_FILE_DIR参数定义的。这既不方便——我们必须重新启动数据库才能应用更改——也不安全,因为所有用户都被全局地授予所有目录上的读写权限

在Oracle9i中,我们获得了数据库目录对象。这很好,因为我们可以使用直接DDL创建或删除目录,所以不需要重新启动。更好的是,目录上的权限被授予命名用户,我们可以区分读权限和写权限

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

Oracle的在线文档中介绍了语法


“那么我如何访问本地服务器上的文件 客户机?”

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


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

我已经给出了本地客户端计算机的路径。我不知道什么是Oracle目录对象。既然你提到了它,我在谷歌上看到,我需要创建一个目录对象,并将其映射到我的本地客户机。这是否正确?@Vabs-PL/SQL在数据库服务器上运行。这意味着它只能访问存储在数据库服务器上的文件。数据库中运行的代码无法访问存储在本地客户端计算机上的文件。@Vabs-请参阅APC的答案。通常,正如他所指出的,您希望首先将firr移动到服务器。我已经给出了本地客户机的路径。我不知道什么是Oracle目录对象。既然你提到了,我就在古看到了