暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle UTL_FILE.FCOPY在FOR循环中不起作用 <文件读取错误>

askTom 2018-06-14
445

问题描述

你好,

我有一个流水线函数,它检索我的文件名,我馈送到UTL_FILE.FCOPY,如下所示:

DECLARE
   PROCEDURE copy_var_templates (p_var_report_name st_string)
   IS
      lkv_template_dir   CONSTANT st_string := 'TEMPLATES';
      lkv_working_dir    CONSTANT st_string := 'WORKING';
   BEGIN
      --Before generating PDF, We need to move the template files to working directory:
      FOR i
         IN (SELECT COLUMN_VALUE template_name
               FROM TABLE (fn_templates)) --This Pipelined SQL spits the filenames
      LOOP
         UTL_FILE.fcopy (
            lkv_template_dir,
            i.template_name,
            lkv_working_dir,
            replace (lv_file_name, 'TEMPLATE', var_file_name));
      END LOOP;
   END;
BEGIN
   copy_var_templates ('BUSINESS_REPORT');
END;
/

--The Above code throws the FILE READ Error.

--Strangely Enough, When I try to do a simple UTL_FILE.FCOPY like below it just works:

BEGIN
utl_file.fcopy ('TEMPLATES', 'TEMPLATE_rep.svg', 'DET_WORKING', 'BUSINESS_REPORT_rep.svg');
END;
/


关于为什么会发生这种情况有什么解释吗?

谢谢,

问候,
普拉文·库马尔。

专家解答

你的代码是合理的,例如

SQL> create or replace directory TEMP as 'c:\temp';

Directory created.

SQL> create or replace directory TMP as 'c:\tmp';

Directory created.

SQL>
SQL> host "echo Hello > c:\temp\file1.dat"

SQL> host "echo Hello > c:\temp\file2.dat"

SQL> host "echo Hello > c:\temp\file3.dat"

SQL> host "echo Hello > c:\temp\file4.dat"

SQL>
SQL>
SQL> DECLARE
  2     PROCEDURE copy_var_templates
  3     IS
  4        lkv_template_dir   CONSTANT varchar2(20) := 'TEMP';
  5        lkv_working_dir    CONSTANT varchar2(20) := 'TMP';
  6        fn_templates sys.odcivarchar2list := sys.odcivarchar2list('file1.dat','file2.dat','file3.dat','file4.dat');
  7     BEGIN
  8        FOR i
  9           IN (SELECT COLUMN_VALUE template_name
 10                 FROM TABLE (fn_templates)) --This Pipelined SQL spits the filenames
 11        LOOP
 12           UTL_FILE.fcopy (
 13              lkv_template_dir,
 14              i.template_name,
 15              lkv_working_dir,
 16              replace (i.template_name, 'file', 'newfile'));
 17        END LOOP;
 18     END;
 19  BEGIN
 20     copy_var_templates;
 21  END;
 22  /

PL/SQL procedure successfully completed.

SQL> host dir c:\tmp\new*
 Volume in drive C is OS
 Volume Serial Number is 66D0-4AB5

 Directory of c:\tmp

15/06/2018  01:25 PM                 8 newfile1.dat
15/06/2018  01:25 PM                 8 newfile2.dat
15/06/2018  01:25 PM                 8 newfile3.dat
15/06/2018  01:25 PM                 8 newfile4.dat
               4 File(s)             32 bytes
               0 Dir(s)  84,435,816,448 bytes free

SQL>


所以我可以假设你在文件上缺少一些权限,或者在文件名等方面有一些其他逻辑错误。我们需要看到一个更完整的测试用例。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论