oracle 源代码输出,oracle-如何将DBMS_OUTPUT.PUT_LINE的输出重定向到文件?
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的输出重定向到文件?相关推荐
- pl/sql下DBMS_OUTPUT.PUT_LINE的输出位置
项目里存储过程中用到DBMS_OUTPUT.PUT_LINE进行输出日志,一开始不知道在哪里看,网上很多都是直接运行后的位置.但是储过程中的日志找了好一会,记录一下. 1.运行时输出位置. decla ...
- Oracle SQL Developer使用dbms_output.put_line显示输出
dbms输出 点击DBMS输出左侧的+号,选择需要输出的数据库,点击确定 与步骤2选择相同数据库,右击数据库,选择打开SQL工作表(T) 在工作表中执行语句 declare --定义,相当于声明属性. ...
- 怎么看oracle定时作业,Oracle 定时作业Job详解
Oracle 定时作业Job :用于安排和管理作业队列,通过使用作业,可以使Oracle数据库定期执行特定的任务.而且Oracle重新启动后,Job会继续运行,不用重新启动. 场景: (1)后台业务统 ...
- 3.PL_SQL——创建第一个匿名块(set,l,DBMS_OUTPUT.PUT_LINE())
一.编写匿名块并执行 前文中介绍了PL/SQL的几种块的类型,其中匿名块是一种即时创建即时执行的块,下面使用sql*plus来演示一下如何创建一个匿名块: SQL> show user -- 显 ...
- oracle declare赋值,oracle 写declare例子
注意: 1.赋值要用 := 2.或的关系用 or 表示 declare prefix VARCHAR2(2); --主表前缀 res_value VARCHAR2(20); sysdate_char ...
- 关于Oracle Developer 的 DBMS_OUTPUT.PUT_LINE 输出问题
在 Oracle Developer 中想用 DBMS_OUTPUT.PUT_LINE 输出信息,但是 只见Script Output 输出 anonymous block completed,而没 ...
- oracle dbms_output.put不输出
用dbms_output.put没有输出. 原因: dbms_output.put后必须再调用dbms_output.put_line才能将结果显示,因为put是没有输出回车,也就是说这一行还没结束, ...
- oracle存储过程dbms_output.put_line()显示打印结果
2019独角兽企业重金招聘Python工程师标准>>> 1:在command命令窗口下 Sql代码 set serveroutput on set serveroutput on ...
- 关于Oracle中varchar2和dbms_output.put_line的长度限制问题小结
一. varchar2长度限制问题 1) 表字段创建最大长度:4000 SQL> CREATE TABLE t_test1(a VARCHAR2( 4000 )); --正确 Table cre ...
最新文章
- Docker安装和helloworld
- 选择更安全的方式执行你的puppet更新
- AM335x(TQ335x)学习笔记——GPIO关键驱动移植
- redhat 6.5怎么安装mysql5.6_centos 6.5安装mysql5.6
- jQuery选择器理解
- 最新隐马尔可夫模型HMM详解
- 麒麟系统linux内核,麒麟Linux操作系统内核简介(14页)-原创力文档
- 从Internet上下载ActiveX(转)
- worder字体网页字体对照表
- JSP技术:表单及 POST 方法提交参数
- 全国各地知名互联网公司内推QQ群
- 大型即时通讯系统微信、陌陌架构分析全记录!
- PATA1034题解
- 不患人之不己知,患不知人也。
- docker实战学习2022版本(四)之不灭星辰
- ios屏幕尺寸和分辨率
- 配置Web.config文件显示错误信息
- 图解 802.11wifi协议
- freeswitch语音识别一系列干货
- Unity3d实现阿拉伯语适配,不规则特殊字符的处理
热门文章
- 在c 语言中 一个函数由函数头和,C语言程序设计基础教程_习题答案
- php5安装mysql拓展_PHP7安装mysql的扩展让老版本PHP程序继续服役
- getallheaders函数在服务器报500错误_C语言服务器编程必备常识
- eclipse 项目 链接 oracle 空指针,Eclipse 常用配置技巧
- php tipask yii 单点登录_php实现单点登录实例
- Winform开发框架中工作流模块的动态处理
- jquery $(function(){}) $(document).ready(function(){}); (function(){}); 的区别以及作用
- vim golang 插件
- Apache的Mod_rewrite学习(RewriteRule重写规则的语法)
- [转贴]JAVA:RESTLET开发实例(三)基于spring的REST服务