-1

我使用 UTL_FILE 编写了一个程序:

CREATE OR REPLACE PROCEDURE UTL_CREATE_FILE 
(
       output_file in  UTL_FILE.file_type,
       log_file    in UTL_FILE.file_type,
       filename    in VARCHAR2 (64),
       ddate       in VARCHAR2 (19),
       sep         in NVARCHAR2 (3)

)


  IS

   BEGIN


           sep := Chr(9);
           ddate := TO_CHAR (SYSDATE, 'YYYYMMDD');
           filename := 'EXT' || ddate || '.dat';
           output_file := UTL_FILE.fopen ('C:/home/S/', filename, 'w', 32000);
           log_file := UTL_FILE.fopen ('C:/home/S/', 'WEEKLY.log', 'a', 32000);

           UTL_FILE.put_line (log_file, TO_CHAR (SYSDATE, 'DD-MM-YYYY HH24:MI:SS') || 'Started with file ' || filename);

   select 'HUGE SQL STATEMENT'|| sep || 'Anykey' as OUTLINE from DUAL;
          UTL_FILE.put_line (output_file, OUTLINE);
          UTL_FILE.fclose (output_file);
          UTL_FILE.put_line (log_file, TO_CHAR (SYSDATE, 'DD-MM-YYYY HH24:MI:SS') || 'Finished for file ' || filename);
          UTL_FILE.fclose (log_file);
  END;

但 Toad 返回警告:已编译但存在编译错误。

有人可以帮助我吗?

因此,我想在 C:/home/S/ 目录中接收 EXT.DAT(和日志)。先感谢您。

4

2 回答 2

1

TOAD 应该给你编译错误——它们可能在一个单独的选项卡上(我已经有一段时间没有使用那个特定的 IDE了)。

但是,很容易发现一个大器:我们不能为在 IN 模式中定义的参数赋值。这些参数的目的是调用程序分配它们的值。

但是,在这种情况下,我认为您需要分配ddateand filename,因此您应该将它们移出过程的签名并进入其声明部分。

sep我会保留作为参数,但给它一个默认值。

请记住,SQL 将我们限制为每列 4000 个字符。因此,如果 'HUGE SQL STATEMENT' 超过 3993 个字符,您的代码将抛出运行时错误。


如果您犯了这些类型的错误,您可能没有跟上从 PL/SQL 编写文件的复杂性。我建议您阅读我以前的答案以及有关主题的答案。

于 2012-04-09T15:21:20.993 回答
0

您应该能够将其附加到脚本的末尾以获取错误(我不使用 TOAD,但我希望它能够支持它)。它在最后一个结束之后;。

/
show errors;

对我来说突出的编译错误 -

  1. 正在分配参数。这作为“in”参数是非法的。它们似乎不用于输入,因此应该将它们从签名中删除。如果这是一个代码片段并且他们确实提供
于 2012-04-12T14:29:10.980 回答