oracle-如何将DBMS_OUTPUT.PUT_LINE的输出重定向到文件?

我需要在pl / sql中进行调试以计算过程次数,我想使用:

SELECT systimestamp FROM dual INTO time_db;

DBMS_OUTPUT.PUT_LINE('time before procedure ' || time_db);

但我不知道输出将到达何处,以及如何将其重定向到包含我要收集的所有数据的日志文件?

10个解决方案

37 votes

DBMS_OUTPUT并不是最佳的调试工具,因为大多数环境都不是本地使用的。 但是,如果要捕获DBMS_OUTPUT的输出,则只需使用DBMS_OUTPUT.get_line过程。

这是一个小例子:

SQL> create directory tmp as '/tmp/';

Directory created

SQL> CREATE OR REPLACE PROCEDURE write_log AS

2 l_line VARCHAR2(255);

3 l_done NUMBER;

4 l_file utl_file.file_type;

5 BEGIN

6 l_file := utl_file.fopen('TMP', 'foo.log', 'A');

7 LOOP

8 EXIT WHEN l_done = 1;

9 dbms_output.get_line(l_line, l_done);

10 utl_file.put_line(l_file, l_line);

11 END LOOP;

12 utl_file.fflush(l_file);

13 utl_file.fclose(l_file);

14 END write_log;

15 /

Procedure created

SQL> BEGIN

2 dbms_output.enable(100000);

3 -- write something to DBMS_OUTPUT

4 dbms_output.put_line('this is a test');

5 -- write the content of the buffer to a file

6 write_log;

7 END;

8 /

PL/SQL procedure successfully completed

SQL> host cat /tmp/foo.log

this is a test

Vincent Malgrat answered 2020-07-06T02:11:24Z

31 votes

作为写文件的替代方法,写表如何? 除了调用DBMS_OUTPUT.PUT_LINE,您还可以调用自己的DEBUG.OUTPUT过程,例如:

procedure output (p_text varchar2) is

pragma autonomous_transaction;

begin

if g_debugging then

insert into debug_messages (username, datetime, text)

values (user, sysdate, p_text);

commit;

end if;

end;

自主事务的使用使您可以保留由回滚的事务(例如,引发异常后)产生的调试消息,就像使用文件时那样。

g_debugging布尔变量是一个程序包变量,可以在需要调试输出时将其默认设置为false并设置为true。

当然,您需要管理该表,以使其不会永远增长! 一种方法是每天/每周运行一次的作业,并删除所有“旧”的调试消息。

Tony Andrews answered 2020-07-06T02:11:57Z

14 votes

用将serveroutput设置为on;

例如:

set serveroutput on;

DECLARE

x NUMBER;

BEGIN

x := 72600;

dbms_output.put_line('The variable X = '); dbms_output.put_line(x);

END;

Mahmoud Hanafy answered 2020-07-06T02:12:21Z

14 votes

如果您只是在SQL Plus中测试PL / SQL,则可以将其定向到以下文件:

spool output.txt

set serveroutput on

begin

SELECT systimestamp FROM dual INTO time_db;

DBMS_OUTPUT.PUT_LINE('time before procedure ' || time_db);

end;

/

spool off

像Toad和SQL Developer这样的IDE可以通过其他方式捕获输出,但是我不熟悉该怎么做。

Tony Andrews answered 2020-07-06T02:12:46Z

5 votes

除了Tony的答案之外,如果您想查找PL / SQL程序在哪里花时间,也值得一看Oracle PL / SQL文档的这一部分。

Ian Carpenter answered 2020-07-06T02:13:07Z

3 votes

使用UTL_FILE而不是DBMS_OUTPUT将输出重定向到文件:

[HTTP://哦Reilly.com/catalog/Oracle把IP/chapter/吃06.HTML]

Rafa de Castro answered 2020-07-06T02:13:31Z

3 votes

另外,请记住,所有这些输出都是在服务器端生成的。

使用DBMS_OUTPUT,文本将在执行查询时在服务器中生成并存储在缓冲区中。 服务器完成查询数据检索后,它将重定向到您的客户端应用程序。 也就是说,仅在查询结束时才获得此信息。

使用UTL_FILE,所有记录的信息将存储在服务器中的文件中。 执行完成后,您将必须导航至该文件以获取信息。

希望这可以帮助。

Juan Calero answered 2020-07-06T02:14:05Z

1 votes

可以将文件直接写入托管数据库的DB服务器,并且随着PL / SQL程序的执行而改变。

这使用Oracle目录TMP_DIR; 您必须声明它,并创建以下过程:

CREATE OR REPLACE PROCEDURE write_log(p_log varchar2)

-- file mode; thisrequires

--- CREATE OR REPLACE DIRECTORY TMP_DIR as '/directory/where/oracle/can/write/on/DB_server/';

AS

l_file utl_file.file_type;

BEGIN

l_file := utl_file.fopen('TMP_DIR', 'my_output.log', 'A');

utl_file.put_line(l_file, p_log);

utl_file.fflush(l_file);

utl_file.fclose(l_file);

END write_log;

/

这里是如何使用它:

1)从您的SQL * PLUS客户端启动它:

BEGIN

write_log('this is a test');

for i in 1..100 loop

DBMS_LOCK.sleep(1);

write_log('iter=' || i);

end loop;

write_log('test complete');

END;

/

2)在数据库服务器上,打开一个shell并

tail -f -n500 /directory/where/oracle/can/write/on/DB_server/my_output.log

J. Chomel answered 2020-07-06T02:14:42Z

-1 votes

旧线程,但是还有另一种选择。

从9i开始,您可以使用流水线表功能。

首先,创建一个类型作为varchar表:

CREATE TYPE t_string_max IS TABLE OF VARCHAR2(32767);

其次,将代码包装在流水线函数声明中:

CREATE FUNCTION fn_foo (bar VARCHAR2) -- your params

RETURN t_string_max PIPELINED IS

-- your vars

BEGIN

-- your code

END;

/

将所有DBMS_OUTPUT.PUT_LINE替换为PIPE ROW。

最后,这样称呼它:

SELECT * FROM TABLE(fn_foo('param'));

希望能帮助到你。

Felypp Oliveira answered 2020-07-06T02:15:28Z

-4 votes

试试这个:

SELECT systimestamp INTO time_db FROM dual ;

DBMS_OUTPUT.PUT_LINE('time before procedure ' || time_db);

Mark answered 2020-07-06T02:15:48Z

oracle 源代码输出,oracle-如何将DBMS_OUTPUT.PUT_LINE的输出重定向到文件?相关推荐

  1. pl/sql下DBMS_OUTPUT.PUT_LINE的输出位置

    项目里存储过程中用到DBMS_OUTPUT.PUT_LINE进行输出日志,一开始不知道在哪里看,网上很多都是直接运行后的位置.但是储过程中的日志找了好一会,记录一下. 1.运行时输出位置. decla ...

  2. Oracle SQL Developer使用dbms_output.put_line显示输出

    dbms输出 点击DBMS输出左侧的+号,选择需要输出的数据库,点击确定 与步骤2选择相同数据库,右击数据库,选择打开SQL工作表(T) 在工作表中执行语句 declare --定义,相当于声明属性. ...

  3. 怎么看oracle定时作业,Oracle 定时作业Job详解

    Oracle 定时作业Job :用于安排和管理作业队列,通过使用作业,可以使Oracle数据库定期执行特定的任务.而且Oracle重新启动后,Job会继续运行,不用重新启动. 场景: (1)后台业务统 ...

  4. 3.PL_SQL——创建第一个匿名块(set,l,DBMS_OUTPUT.PUT_LINE())

    一.编写匿名块并执行 前文中介绍了PL/SQL的几种块的类型,其中匿名块是一种即时创建即时执行的块,下面使用sql*plus来演示一下如何创建一个匿名块: SQL> show user -- 显 ...

  5. oracle declare赋值,oracle 写declare例子

    注意: 1.赋值要用 := 2.或的关系用 or 表示 declare prefix VARCHAR2(2); --主表前缀 res_value VARCHAR2(20); sysdate_char ...

  6. 关于Oracle Developer 的 DBMS_OUTPUT.PUT_LINE 输出问题

    在 Oracle Developer 中想用 DBMS_OUTPUT.PUT_LINE  输出信息,但是 只见Script Output 输出 anonymous block completed,而没 ...

  7. oracle dbms_output.put不输出

    用dbms_output.put没有输出. 原因: dbms_output.put后必须再调用dbms_output.put_line才能将结果显示,因为put是没有输出回车,也就是说这一行还没结束, ...

  8. oracle存储过程dbms_output.put_line()显示打印结果

    2019独角兽企业重金招聘Python工程师标准>>> 1:在command命令窗口下 Sql代码 set serveroutput on  set serveroutput on ...

  9. 关于Oracle中varchar2和dbms_output.put_line的长度限制问题小结

    一. varchar2长度限制问题 1) 表字段创建最大长度:4000 SQL> CREATE TABLE t_test1(a VARCHAR2( 4000 )); --正确 Table cre ...

最新文章

  1. Docker安装和helloworld
  2. 选择更安全的方式执行你的puppet更新
  3. AM335x(TQ335x)学习笔记——GPIO关键驱动移植
  4. redhat 6.5怎么安装mysql5.6_centos 6.5安装mysql5.6
  5. jQuery选择器理解
  6. 最新隐马尔可夫模型HMM详解
  7. 麒麟系统linux内核,麒麟Linux操作系统内核简介(14页)-原创力文档
  8. 从Internet上下载ActiveX(转)
  9. worder字体网页字体对照表
  10. JSP技术:表单及 POST 方法提交参数
  11. 全国各地知名互联网公司内推QQ群
  12. 大型即时通讯系统微信、陌陌架构分析全记录!
  13. PATA1034题解
  14. 不患人之不己知,患不知人也。
  15. docker实战学习2022版本(四)之不灭星辰
  16. ios屏幕尺寸和分辨率
  17. 配置Web.config文件显示错误信息
  18. 图解 802.11wifi协议
  19. freeswitch语音识别一系列干货
  20. Unity3d实现阿拉伯语适配,不规则特殊字符的处理

热门文章

  1. 在c 语言中 一个函数由函数头和,C语言程序设计基础教程_习题答案
  2. php5安装mysql拓展_PHP7安装mysql的扩展让老版本PHP程序继续服役
  3. getallheaders函数在服务器报500错误_C语言服务器编程必备常识
  4. eclipse 项目 链接 oracle 空指针,Eclipse 常用配置技巧
  5. php tipask yii 单点登录_php实现单点登录实例
  6. Winform开发框架中工作流模块的动态处理
  7. jquery $(function(){}) $(document).ready(function(){}); (function(){}); 的区别以及作用
  8. vim golang 插件
  9. Apache的Mod_rewrite学习(RewriteRule重写规则的语法)
  10. [转贴]JAVA:RESTLET开发实例(三)基于spring的REST服务