2

需要有关在 oracle 10 中使用存储过程创建文本文件的帮助。我对此很陌生,所以请从一开始就指导我。

我找到了代码并将其创建为存储过程。我运行它,它是有效的。但是我执行了它,我得到了错误"INVALID FILE NAME... AT SYS.UTL_FILE..."

我首先创建了一个目录,该目录授予对目录的读、写权限。

CREATE OR REPLACE PROCEDURE refcursorkim IS
   l_file      utl_file.file_type;
   l_file_name VARCHAR2(60);
BEGIN
l_file := utl_file.fopen('UTL_DIR', l_file_name, 'w');          
   SELECT 'KY' || TO_CHAR(SYSDATE, 'yyyymmdd') || '1.txt' INTO l_file_name  FROM dual;
   utl_file.putf(l_file,l_file_name);
   utl_file.fclose(l_file);
END refcursorkim;

我不知道我错过了什么,因为我对此一点也不熟悉。另一件事,文件是在指定的目录中自动创建的吗?

希望你能帮助我。谢谢你,上帝保佑!

4

2 回答 2

5

您应该使用正确的文件名打开文件。

您的代码(将出错):

CREATE OR REPLACE PROCEDURE refcursorkim
IS
   l_file        UTL_FILE.file_type;
   l_file_name   VARCHAR2 (60);
BEGIN
   l_file := UTL_FILE.fopen ('UTL_DIR', l_file_name, 'w');

   SELECT 'KY' || TO_CHAR (SYSDATE, 'yyyymmdd') || '1.txt'
     INTO l_file_name
     FROM DUAL;

   UTL_FILE.putf (l_file, l_file_name);
   UTL_FILE.fclose (l_file);
END refcursorkim;

应该是(更正):

CREATE OR REPLACE PROCEDURE refcursorkim
IS
   l_file        UTL_FILE.file_type;
   l_file_name   VARCHAR2 (60);
BEGIN

   SELECT 'KY' || TO_CHAR (SYSDATE, 'yyyymmdd') || '1.txt'
     INTO l_file_name
     FROM DUAL;

   l_file := UTL_FILE.fopen ('UTL_DIR', l_file_name, 'w');

   UTL_FILE.putf (l_file, l_file_name);
   UTL_FILE.fclose (l_file);
END refcursorkim;

更多信息:http: //docs.oracle.com/cd/B19306_01/appdev.102/b14258/u_file.htm#i1004619

编辑1:

  1. 如果文件不存在,将创建一个新文件。如果存在,它将替换为新文件。如果您需要保留文件,请以'A'附加模式打开。
  2. UTL_FILE 中没有用于浏览目录内容的选项。但是,Oracle 11g 中还有其他选项。您使用的是哪个版本的 Oracle?(我还会告诉你一个内部秘密,它可以帮助你快速学习 Oracle 标准库函数。打开 UTL_FILE 包规范。它们提供了很好的文档,并对过程调用中所做的事情提供了足够的注释)

你得到什么错误?你能粘贴你正在使用的代码和你得到什么吗?完整的运行细节?

于 2012-03-05T10:53:24.930 回答
0

'UTL_DIR' 需要在目录中创建。

因此,还需要在所需位置生成输出文件所需的权限。

于 2020-12-04T13:53:52.317 回答