从 SQLPlus 程序写入 Oracle 并发请求输出/日志
Write to Oracle concurrent request output / log from a SQLPlus program
我有一个调用 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 脚本写入请求输出或日志?
首先,您的 SQL*Plus 脚本甚至 运行 没有您尝试记录。
dbms_output enable(...)
缺少一个点 ('.')。
- 您的匿名 PL/SQL 区块没有
end;
声明
- @"path/file.SQL` 是一个 SQL*Plus 命令 -- 它不能嵌入匿名 PL/SQL 块中。
抛开这些基本问题,FND_FILE.PUT_LINE
仅适用于 PL/SQL 并发程序。也就是说,可执行文件指向 PL/SQL 程序包过程并且 不是 .sql 文件的并发程序 $APPL_TOP.
对于 SQL*Plus 并发程序,即 运行ning $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并发程序了,我一直在写并发程序。
正如 Matthew 提到的,登录 SQL*Plus 可执行文件效果不佳。如果您出于某种原因无法将代码移动到 PL/SQL 存储过程,则主机脚本可能适合您。从那里,您可以执行 SQL,例如sqlplus -s $FCP_LOGIN ... 并根据需要写入日志信息。
如果您只需要通过PLSQL准备数据,然后通过SQL将其假脱机成CSV,您可以使用我们公司的Blitz Report,它更方便,而且是免费的。它还使用主机类型的可执行文件并从那里调用 sqlplus。
我已经解决了这个问题。解决方案非常简单 - 现在我已经变形了,因为花了很长时间才意识到。
第 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";
/
这正是我要找的。也许这对另一个星系的人有用。
如果这是为了 testing/debugging 目的,您可以使用例程指定日志和输出文件的位置:FND_FILE.PUT_NAMES 一旦您记录了所有需要的信息,您就需要关闭文件:FND_FILE.CLOSE
我有一个调用 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 脚本写入请求输出或日志?
首先,您的 SQL*Plus 脚本甚至 运行 没有您尝试记录。
dbms_output enable(...)
缺少一个点 ('.')。- 您的匿名 PL/SQL 区块没有
end;
声明 - @"path/file.SQL` 是一个 SQL*Plus 命令 -- 它不能嵌入匿名 PL/SQL 块中。
抛开这些基本问题,FND_FILE.PUT_LINE
仅适用于 PL/SQL 并发程序。也就是说,可执行文件指向 PL/SQL 程序包过程并且 不是 .sql 文件的并发程序 $APPL_TOP.
对于 SQL*Plus 并发程序,即 运行ning $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并发程序了,我一直在写并发程序。
正如 Matthew 提到的,登录 SQL*Plus 可执行文件效果不佳。如果您出于某种原因无法将代码移动到 PL/SQL 存储过程,则主机脚本可能适合您。从那里,您可以执行 SQL,例如sqlplus -s $FCP_LOGIN ... 并根据需要写入日志信息。 如果您只需要通过PLSQL准备数据,然后通过SQL将其假脱机成CSV,您可以使用我们公司的Blitz Report,它更方便,而且是免费的。它还使用主机类型的可执行文件并从那里调用 sqlplus。
我已经解决了这个问题。解决方案非常简单 - 现在我已经变形了,因为花了很长时间才意识到。
第 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";
/
这正是我要找的。也许这对另一个星系的人有用。
如果这是为了 testing/debugging 目的,您可以使用例程指定日志和输出文件的位置:FND_FILE.PUT_NAMES 一旦您记录了所有需要的信息,您就需要关闭文件:FND_FILE.CLOSE