您如何从通过数据库链接执行的存储过程中进行假脱机?
Posted
技术标签:
【中文标题】您如何从通过数据库链接执行的存储过程中进行假脱机?【英文标题】:how do you spool from a stored procedure that is executed through a database link? 【发布时间】:2012-01-27 21:16:34 【问题描述】:我正在使用 UNIX 脚本运行通过数据库链接启动存储过程的 sql 代码。我可以成功完成该过程,但是没有一个 DBMS 输出被假脱机到指定的 SPOOL 文件。
UNIX 中的 SQL:
set feedback off;
set linesize 500;
set serveroutput on size 1000000;
set serveroutput on format wrapped;
spool $SQLspool;
whenever oserror exit;
whenever sqlerror exit sql.sqlcode;
DECLARE
retcode integer :=0;
BEGIN
owner.procedure@db;
dbms_output.put_line('');
dbms_output.put_line('return code: ' || retcode);
dbms_output.put_line('');
EXCEPTION
WHEN OTHERS THEN
RAISE;
END;
/
EXIT;
假脱机文件内容:
return code: 0
我在存储过程中列出了一堆 DMBS 输出,但没有任何内容写入假脱机文件。
我怎样才能让它输出到假脱机文件?
我尝试使用 IN OUT 变量,但由于该过程包含 COMMIT,因此由于它正在通过 DB Link...
【问题讨论】:
您是否在 SQL*PLUS 中看到 owner.procedure@db 的输出,并且它没有被写入假脱机文件。还是根本不显示输出? 您是否检查过程序中没有“dbms_output.disable”调用? @Shannon Severance:所以我得到的唯一 dbms 输出来自 unix 脚本,它“返回代码:0”没有任何输出被存储到存储过程指示的假脱机文件中。 @A.B.Cade:程序中没有这样的调用。存储过程是一个简单的删除语句,每 10k 行提交一个循环。 【参考方案1】:PUT 和 PUT_LINE 的输出被缓冲。来自Oracle docs :
在 PL/SQL 程序完成之前,SQL*Plus 不会显示 DBMS_OUTPUT 消息。在 PL/SQL 程序中没有刷新 DBMS_OUTPUT 缓冲区的机制。
因此,如果您正在寻找流式响应,您将需要编写一个不缓冲输出的小程序。
【讨论】:
以上是关于您如何从通过数据库链接执行的存储过程中进行假脱机?的主要内容,如果未能解决你的问题,请参考以下文章
在没有假脱机或 utl_file 的 PL/SQL 中写入文件