【问题标题】:Oracle - Create text file using stored procedureOracle - 使用存储过程创建文本文件
【发布时间】:2012-03-22 20:18:39
【问题描述】:

在使用 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;

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

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

【问题讨论】:

    标签: oracle utl-file


    【解决方案1】:

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

    您的代码(将出错):

    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 包规范。它们提供了很好的文档,其中包含足够多的 cmets 来说明过程调用中所做的事情)

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

    【讨论】:

    • 这段代码是否意味着如果文件不存在会自动创建?以及如何访问 oracle 服务器中的文件列表?我只知道 SELECT * FROM ALL_DIRECTORIES。这只会检索目录列表,我也想知道每个目录中的文件(虽然我应该在不同的线程中问这个......)我只是想确保文件是否被创建。虽然我仍然有同样的错误..无效的文件操作...sys.utl_file...非常感谢!
    • 使用 oracle 10g。这是我的代码: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; / 错误是“ORA-29283:无效文件操作 | ORA-06512:在 SYS.UTL_FILE,第 475 行”| ORA-29283: 无效的文件操作 | ORA-06512 在 SCHEMA_NAME.REFCURSORKIM,第 9 行 | OR-06512:在第 2 行
    • 您可以访问'UTL_DIR' 吗?可以试试写'/tmp'吗?
    • 我试着写了,但我仍然遇到同样的错误......好吧,我想我只能使用 UTL_FILE 以外的另一种方法。非常感谢您的宝贵时间。如果我有更多的时间,我会更多地研究 UTL_FILE。 :) 上帝保佑!
    • 您能否分享一些在 AWS S3 上创建文件的方向?
    【解决方案2】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-05-01
      • 1970-01-01
      • 1970-01-01
      • 2018-04-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多