如何在 UTL_FILE 过程中包含一个巨大的 SQL 语句?
Posted
技术标签:
【中文标题】如何在 UTL_FILE 过程中包含一个巨大的 SQL 语句?【英文标题】:How to include a huge SQL statement into UTL_FILE procedure? 【发布时间】:2012-04-09 12:34:22 【问题描述】:我使用 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(和日志)。先感谢您。
【问题讨论】:
你做了什么,试图找出问题所在? Toad 有没有告诉您哪一行包含问题或任何进一步的细节? 【参考方案1】:TOAD 应该为您提供编译错误 - 它们可能位于单独的选项卡上(我使用该特定 IDE 已经有一段时间了)。
但是,很容易发现一个大器:我们不能为在 IN 模式中定义的参数赋值。这些参数的目的是调用程序分配它们的值。
但是,在这种情况下,我认为您需要分配ddate
和filename
,因此您应该将它们从过程的签名中移出并移到其声明部分。
sep
我会保留作为参数但给它一个默认值。
请记住,SQL 将我们限制为每列 4000 个字符。因此,如果 'HUGE SQL STATEMENT' 超过 3993 个字符,您的代码将抛出运行时错误。
如果您犯了这些类型的错误,您可能没有跟上从 PL/SQL 编写文件的复杂性。我建议你阅读this previous answer of mine 和this one 关于这个话题。
【讨论】:
【参考方案2】:您应该能够将其附加到脚本的末尾以获取错误(我不使用 TOAD,但我希望它能够支持它)。它在最后一个结尾之后;。
/
show errors;
令我印象深刻的编译错误 -
-
正在分配参数。这作为“in”参数是非法的。它们似乎不用于输入,因此可能应该从签名中删除它们。如果这是一个代码 sn-p 并且他们确实提供了
【讨论】:
以上是关于如何在 UTL_FILE 过程中包含一个巨大的 SQL 语句?的主要内容,如果未能解决你的问题,请参考以下文章
如何在我的 Eloquent ORM laravel 选择中包含一个过程?