从 SQLPlus 程序写入 Oracle 并发请求输出/日志
Posted
技术标签:
【中文标题】从 SQLPlus 程序写入 Oracle 并发请求输出/日志【英文标题】:Write to Oracle concurrent request output / log from a SQLPlus program 【发布时间】:2020-01-28 19:39:40 【问题描述】:我有一个调用 SQLPlus 程序的 Oracle 并发请求。程序本身工作正常,但我想在 EBS 中的并发请求输出/日志中添加一些日志信息。
我尝试了多种变体:
set heading off
--set pagesize 0 embedded on
set pagesize 50000
set linesize 32767
set feedback off
set verify off
set term off
set echo off
set newpage none
set serveroutput on
dbms_output.enable(1000000);
--prepare data
EXECUTE program (&1,&2,&3,&4,&5);
--extract data
@"path/file.SQL";
fnd_file.put_line(FND_FILE.LOG,'do some logging here');
fnd_file.put_line(FND_FILE.OUTPUT,'do some logging here');
/
但是到目前为止,我尝试过的所有结果都可以使用
没有向请求输出或日志添加日志记录 没有任何请求输出 错误如下:SP2-0734: unknown command beginning "dbms_outpu..." - rest of line ignored.
和
PLS-00103: Encountered the symbol "ENABLE" when expecting one of the following: := . ( @ % ;
是否可以从并发管理器调用的 SQLPlus 脚本写入请求输出或日志?
【问题讨论】:
“并发请求”是什么意思?如果要从 sqlplus 假脱机到日志文件,则需要添加 spool 命令。 @OldProgrammer 这是一个 Oracle e-Business Suite 问题。我已经更新了标签,虽然我经常想知道这些标签是否适合 SO。 【参考方案1】:首先,如果您不尝试记录,您的 SQL*Plus 脚本甚至无法运行。
dbms_output enable(...)
缺少一个点 ('.')。
您的匿名 PL/SQL 块没有 end;
语句
@"path/file.SQL` 是 SQL*Plus 命令 -- 它不能嵌入到匿名 PL/SQL 块中。
除了这些基本问题,FND_FILE.PUT_LINE
仅适用于 PL/SQL 并发程序。也就是说,其可执行文件指向 PL/SQL 包过程并且不是 $APPL_TOP 下的 .sql 文件的并发程序。
对于 SQL*Plus 并发程序,即在 $APPL_TOP 下运行 .sql 文件,FND_FILE.PUT_LINE
不起作用。相反,您的 SQL*Plus 输出会自动写入请求输出。没有标准的方式写入请求日志。
如果您真的需要写入请求日志,您可以调用FND_FILE.PUT_NAMES
以使FND_FILE.PUT_LINE
写入您命名的临时文件。然后,了解并发请求 ID 和 Oracle EBS 用于本地输出和日志文件的逻辑,执行 FND_FILE.CLOSE
和 host
命令将您指定的自定义命名文件移动到实际位置。这可能有效。
最好将并发程序重做为 PL/SQL 包。然后FND_FILE
工作得很好。如果您知道如何从数据库中调用 Java,那么您可以在 .sql 脚本中执行的操作很少,而您在 PL/SQL 包中无法执行。
我好多年没写过.sql并发程序了,一直在写并发程序。
【讨论】:
它运行。如果删除了 BEGIN、dbms_output 和 fnd_file 命令,程序将完全按照我的意愿执行。你说的 END 丢失是对的——我在有和没有 BEGIN 和 END 的情况下进行测试。是的,我错过了那个点——我会用那个点重试测试。通常我会在一个过程或包中完成所有这些工作,但是围绕这个程序有一些情有可原的情况使我朝着这个方向发展。这是一个有效的观点 - 现在它的工作也许我应该重新考虑将 SQLPlus 部分移回一个过程是否可行。谢谢。 删除 BEGIN 并添加 '.' 后程序以预期结果正常完成 - 假脱机 CSV 输出。在并发请求输出中显示错误 -SP2-0734: unknown command beginning "dbms_outpu..." - rest of line ignored.
我必须认为,如果它可以将这个错误放在那里,那么必须有一种方法可以在同一个地方添加用户定义的消息。
因为dbms_output
是一个PL/SQL 包。在 SQL*Plus 中,它必须是 EXECUTE dbms_output...
或 BEGIN dbms_output... END;
。与FND_FILE
的调用相同,尽管正如我所写,它们不会从 SQL*Plus 并发程序中执行您希望它们执行的操作。【参考方案2】:
我已经解决了这个问题。解决方案非常简单 - 现在我已经变形了,因为我花了很长时间才意识到。
第 1 步 - SET ECHO ON
第 2 步 - PROMPT whatever you want written to concurrent request output
以下示例将'Output is written to this folder
' 写入并发请求输出。
set heading off
--set pagesize 0 embedded on
set pagesize 50000
set linesize 32767
set feedback off
set verify off
set term off
set echo on
set newpage none
set serveroutput on
prompt Output is written to this folder
--prepare data
EXECUTE program (&1,&2,&3,&4,&5);
--extract data
@"path/file.SQL";
/
这正是我想要的。也许这对另一个星系的人有用。
【讨论】:
【参考方案3】:如果这是出于测试/调试目的,您可以使用例程:FND_FILE.PUT_NAMES 指定日志和输出文件的位置,并在记录完所有需要的信息后立即使用:FND_FILE 关闭文件。关闭
【讨论】:
【参考方案4】:正如 Matthew 所提到的,登录 SQL*Plus 可执行文件效果不佳。如果由于某种原因您无法将代码移动到 PL/SQL 存储过程中,则 Host 脚本可能会为您工作。从那里,您可以执行 SQL,例如sqlplus -s $FCP_LOGIN ... 并根据需要写入日志信息。 如果您只需要通过PLSQL准备数据,然后通过SQL将其spool到CSV,您可以使用我们公司的Blitz Report来代替,这样做更方便,而且是免费的。它还使用 Host 类型的可执行文件并从那里调用 sqlplus。
【讨论】:
以上是关于从 SQLPlus 程序写入 Oracle 并发请求输出/日志的主要内容,如果未能解决你的问题,请参考以下文章
oracle数据量巨大表查询时间太长,sqlplus有的不能spool出结果