-
2021-01-28 04:09:47
dbms_output作为ORACLE的一个内置包,是作为输出信息的集合包:
如果想要dbms_output.put_line()等方法的输出能够在客户端看见的话,请
set serverouput on;
例子:
declare
empname emp.ename%type;
sno emp.empno%type;
iCount int:=0;
begin
sno:='7369';
empname:='jade';
dbms_output.put_line('employee no is '||sno||' employee name is '||empname);
select empno,ename into sno,empname from emp where empno='7369';
dbms_output.put_line('employee no is '||sno||' employee name is '||empname);
select count(*) into iCount from emp where sal>2000;
if iCount>0 then
dbms_output.put_line('有工资大于2000的人的信息'||iCount);
else
dbms_output.put_line('没有');
end if;
end;
异常
如同JVM一样,Oralce是最终异常处理人员;但是他们的处理结果对用户而言是不好理解的,因为他们的语言是如此地不友好,如此的ugly;
所以我们最好是自己捕获处理异常;
步骤:
1.声明异常
2.引发异常
3.处理异常
类型:
1, 预定义的异常:不需要显式声明;dbms_standard程序包里有定义;
例子: dbms_output.put_line('employee job is '||empjob);
exception
when no_data_found then
dbms_output.put_line('no data return');
如果不处理异常,程序就会报告Error而不是异常,不同于Java;
但是程序流程是一样的,出错后,后面的代码都不再执行,直接退出;
用户处理的话,出错后,处理后,其他的可以继续执行错误处理后面的代码,这和Java一样;
When others then
处理动作;
这里的others表示未知的异常发生时;这是个很保险的方法,类似用Exception的效果;其他的异常都是others的一个子类型;
2, 非预定义的异常:数据库本身不知道不能控制的,比如操作系统崩溃;
Oralce服务器错误
网络或者机器I/O错误
3, 用户定义的异常:有个类型叫exception类型
例子:
1 declare
2 dup_value exception;
3 icount int:=0;
4 begin
5 select count(*) into icount from place
6 where placeid='001';
7 if icount>0 then
8 raise dup_value;
9 end if;
10 exception
11 when dup_value then
12 dbms_output.put_line('already have the note');
13* end;
already have the note
更多相关内容 -
dbms_output.put_line的用法(Oracle)
2022-04-11 10:38:59dbms_output.put_line的用法 涉及到的知识点如下: 1、enable: 在serveroutput on的情况下,用来使dbms_output生效(默认即打开) set serveroutput on --将output 服务打开 2、disable: 在serveroutput on...dbms_output.put_line的用法
涉及到的知识点如下:
1、enable:
在serveroutput on的情况下,用来使dbms_output生效(默认即打开)
set serveroutput on --将output 服务打开
2、disable:
在serveroutput on的情况下,用来使dbms_output失效
set serveroutput off --将output 服务关闭
3、put:
将内容写到内存,等到put_line时一起输出,new_line的时候也可以输出。
begin dbms_output.put_line('hello world1111111'); dbms_output.new_line(); dbms_output.put('Hello, Lao An '); dbms_output.put('Hello, Lao An '); dbms_output.new_line(); dbms_output.put_line('Hello, Lao An '); end; /
输出:
4、put_line:
不用多说了,输出字符,并刷新buffer,前提是set severoutput on;
exec dbms_output.put_line('hello world1111111');
5、new_line:
作为一行的结束,可以理解为写入buffer时的换行符
set serveroutput on begin dbms_output.put_line('hello world1111111'); dbms_output.put('Hello, Lao An'); dbms_output.new_line(); dbms_output.put_line('Hello, Lao An'); end; /
这里运用了begin+/来执行PL/SQL过程,我解释一下oracle中斜杠(/)的含义
斜杠就是让服务器执行前面所写的sql脚本。如果是普通的select语句,一个分号,就可以执行了。但是如果是存储过程,那么遇到分号,就不能马上执行了。这个时候,就需要通过斜杠(/)来执行。6、get_line(value, index):
获取缓冲区的单行信息。
注:使用get_line时不能用put_line输出,因为put_line之后会将buffer清空。(当然在serveroutput off的情况下put_line是不影响buffer的)。
7、get_lines(array, index):
以数组形式来获取缓冲区的多行信息
declare v_data dbms_output.chararr; --先声明局部变量 v_numlines number; begin --enable the buffer first. dbms_output.enable(1000000); --设置缓冲区的大小 dbms_output.put_line('line one'); dbms_output.put_line('line two'); dbms_output.put_line('line three'); v_numlines := 3; dbms_output.get_lines(v_data, v_numlines); --array, index for v_counter in 1..v_numlines loop dbms_output.put_line(v_data(v_counter)); end loop; end; /
输出:
-
oracle-如何将DBMS_OUTPUT.PUT_LINE的输出重定向到文件?
2021-05-01 06:46:54oracle-如何将DBMS_OUTPUT.PUT_LINE的输出重定向到文件?我需要在pl / sql中进行调试以计算过程次数,我想使用:SELECT systimestamp FROM dual INTO time_db;DBMS_OUTPUT.PUT_LINE('time before procedure ' || ...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的DBMS_OUTPUT.PUT_LINE用法
2021-05-03 05:07:13打印至控制台(有显示):SET SERVEROUTPUT ONBEGINDBMS_.../如果想要dbms_output.put_line()等方法的输出能够在客户端看见的话,请set serverouput on;例子:declareempname emp.ename%type;sno emp.empno%type;iCount...打印至控制台(有显示):
SET SERVEROUTPUT ON
BEGIN
DBMS_OUTPUT.PUT_LINE('Hey look, Ma!');
END;
/
如果想要dbms_output.put_line()等方法的输出能够在客户端看见的话,请
set serverouput on;
例子:
declare
empname emp.ename%type;
sno emp.empno%type;
iCount int:=0;
begin
sno:='7369';
empname:='jade';
dbms_output.put_line('employee no is '||sno||' employee name is '||empname);
select empno,ename into sno,empname from emp where empno='7369';
dbms_output.put_line('employee no is '||sno||' employee name is '||empname);
select count(*) into iCount from emp where sal>2000;
if iCount>0 then
dbms_output.put_line('有工资大于2000的人的信息'||iCount);
else
dbms_output.put_line('没有');
end if;
end;
异常
如同JVM一样,Oralce是最终异常处理人员;但是他们的处理结果对用户而言是不好理解的,因为他们的语言是如此地不友好,如此的ugly;
所以我们最好是自己捕获处理异常;
步骤:
1.声明异常
2.引发异常
3.处理异常
类型:
1,预定义的异常:不需要显式声明;dbms_standard程序包里有定义;
例子: dbms_output.put_line('employee job is '||empjob);
exception
when no_data_found then
dbms_output.put_line('no data return');
如果不处理异常,程序就会报告Error而不是异常,不同于Java;
但是程序流程是一样的,出错后,后面的代码都不再执行,直接退出;
用户处理的话,出错后,处理后,其他的可以继续执行错误处理后面的代码,这和Java一样;
When others then
处理动作;
这里的others表示未知的异常发生时;这是个很保险的方法,类似用Exception的效果;其他的异常都是others的一个子类型;
2,非预定义的异常:数据库本身不知道不能控制的,比如操作系统崩溃;
Oralce服务器错误
网络或者机器I/O错误
3,用户定义的异常:有个类型叫exception类型
例子:
1 declare
2 dup_value exception;
3 icount int:=0;
4 begin
5 select count(*) into icount from place
6 where placeid='001';
7 if icount>0 then
8raise dup_value;
9 end if;
10 exception
11 when dup_value then
12 dbms_output.put_line('already have the note');
13* end;
already have the note
-
oracle DBMS_OUTPUT.PUT_LINE()
2021-05-01 11:06:12oralce在执行存储过程时如果要显示DBMS_OUTPUT.PUT_LINE()的输出信息,要在开启serveroutput。在sqlplus中set serveroutput on即可。DBMS_OUTPUT.PUT_LINE()输出信息分割符为||。CREATE OR REPLACE PROCEDURE stu_... -
dbms_output.put_line使用方法 | 学步园
2021-03-03 18:12:57begindbms_output.put_line('a') ;end;---------------------------------------------------------------------------------------------------------------------------------------------------如果你是再SQL*... -
postgresql兼容Oracle dbms_output.put_line
2020-12-24 17:12:56Oracle dbms_output.put_line用于输出打印信息 postgresql使用raise notice打印信息 改写例子: Oracle原写法 DBMS_OUTPUT.PUT_LINE('PROCEDURE [P_ASD] BEGIN … ’ || TO_CHAR(SYSDATE, ‘YYYY-MM-DD HH24:MI:SS’... -
[Oracle]解决dbms_output.put_line输出长度限制
2021-02-03 14:41:15解决dbms_output.put_line输出长度限制 设置dbms_output.enable(n); n为一个比较大的数值,即长度大于即将输出的内容。 如下函数是将输出的长段内容逐行输出的存储过程,可替代dbms_output.put_line使用。 ... -
oracle定义游标cursor遍历sql查询结果,通过dbms_output.put_line在output输出
2020-09-27 10:58:09declare cursor x is with v1 as (select * from 表名 where rownum<11) select * from v1;begin for y in x loop dbms_output.put_line (y.字段名); end loop;end; -
Oracle数据库中 dbms_output.put_line 不显示的问题解决方案
2018-08-27 14:35:24在学习Oracle的过程中学到匿名语句块在执行过程中发现控制台打印输出DBMS_OUTPUT.PUT_LINE(vename||’过节费’||vmsg);的时候并不显示。 一下是我的数据库代码 declare vename varchar2(20); vsal_comm emp.sal... -
ORACLE中dbms_output.put_line输出问题
2019-06-12 11:18:33ORACLE中dbms_output.put_line输出问题1. 开启oracle输出2. 用sqlplus 登陆oracle3. pl/sql执行输出语句 最近写了oracle过程,有个ORACLE中dbms_output.put_line输出不了的问题。 花了近一个小时。下面描述一个这... -
Oracle - dbms_output.put_line()
2019-04-22 23:57:51--SET SERVEROUTPUT ON; DECLARE SENTENSE VARCHAR(30); BEGIN SENTENSE := 'Hello SQL!... dbms_output.put_line(SENTENSE||'--->'||'Pass!'); dbms_output.put_line('Hello Oracle!'||'--->... -
PostgreSQL Oracle 兼容性之 - DBMS_OUTPUT.PUT_LINE
2019-04-14 11:22:52PostgreSQL , Oracle , DBMS_OUTPUT.PUT_LINE , raise , notice 背景 在函数、存储过程中需要进行一些debug,输出一些过程变量的值时,PG中使用raise notice可以非常方便的得到。 Oracle put_line在存储过程、... -
Oracle SQL Developer 调用dbms_output.put_line(); 不出结果
2018-07-29 12:13:37最近在学习PL/SQL 初期遇到的...dbms_output.put_line('hello world'); end; / 运行程序无结果输出: 调用DBMS输出窗口依然无结果: 程序在SQL命令行可以执行: 程序无错误,尝试更换Oracle SQL Develo... -
DBMS_OUTPUT.PUT_LINE()方法的简单介绍
2019-09-21 19:13:531.最基本的DBMS_OUTPUT.PUT_LINE()方法。 随便在什么地方,只要是BEGIN和END之间,就可以使用DBMS_OUTPUT.PUT_LINE(output);然而这会有一个问题,就是使用该函数一次最多只可以显示255个字符,否则缓冲区会溢出。 ... -
关于oracle sql developer使用dbms_output.put_line无法显示输出结果的解决办法
2020-05-08 10:06:381.网上常用的办法,使用 set serveroutput on;...3.我试了以上两种办法,都没效果,然后最后发现将DBMS_OUTPUT.PUT_LINE换成小写即可输出结果 结语:说实话sql developer不如pl/sql developer好用 ... -
使用dbms_output.put_line打印异常所在的行
2019-10-02 10:02:14dbms_output.put_line(dbms_utility.format_error_stack); dbms_output.put_line(dbms_utility.format_call_stack); dbms_output.put_line(dbms_utility.format_error_backtrace... -
PL/SQL的dbms_output.put_line不显示结果解决方法
2019-11-22 09:23:29用dbms_output.put_line来输出变量的一些信息,却总是看不到结果 解决方法: 再执行存储过程之前,需要在SQL>中先执行下面这行代码: set serveroutput on; 使用 set serveroutput on 命令设置环境变量... -
Oracle测试输出 dbms_output.put_line
2019-05-29 16:46:37BEGIN --输出 dbms_output.put_line(v_MEMBERID||'-'||V_MEMBERNAMECN||'-'||V_BIRTHDAY||'-'||V_CERTCODE); END; BEGIN --输出 dbms_output.put_line('V_XB='||V_XB); END; -
Oracle中调用dbms_output.put_line()不显示输出结果
2019-05-14 16:00:58Oracle中调用dbms_output.put_line()不显示输出结果: 输入SQL语句:set serveroutput on; -
pl/sql下DBMS_OUTPUT.PUT_LINE的输出位置
2018-11-12 14:54:00项目里存储过程中用到DBMS_OUTPUT.PUT_LINE进行输出日志,一开始不知道在哪里看,网上很多都是直接运行后的位置。但是储过程中的日志找了好一会,记录一下。 1、运行时输出位置。 declare in_interval_... -
oracle命令窗口中dbms_output.put_line不显示问题
2018-12-19 20:47:15DECLARE v_count NUMBER; BEGIN ... DBMS_OUTPUT.put_line('SQL%ROWCOUNT=' || SQL%ROWCOUNT); DBMS_OUTPUT.put_line('xxxxxxxxxxxx'); END; / 在输出窗口看不到输出结果,执行SQL语句:s... -
DBMS_OUTPUT.PUT_LINE没有输出
2018-07-19 16:17:46解决方法:打开打印输出 set serveroutput on; 只有在调用 存储过程的时候,才会打印出来。在创建编译的时候,是不会打印出来的。 存储过程: ...如果直接运行,是打印不出的,只会打印出:PZ_S1INITCTXSETUPREQ_... -
oracle DBMS_OUTPUT.PUT_LINE输出
2018-05-01 11:33:27declarepSname varchar2(20);pSage varchar2(20);beginsearchS('002',pSname...dbms_output.put_line(pSname);dbms_output.put_line(pSage);end;刚开始没输出找不到原因,只要运行下 ,就OKset serveroutput on; ... -
plsql中输出函数dbms_output.put_line(v_result);发生buffer overflow,limit of 2000 bytes.的解决方案
2019-09-16 20:05:36写存储过程时遇到一个问题,执行dbms_output.putline(变量名)的时候,报错 ORA-20000:ORU-10027:buffer overflow,limit of 2000 bytes. 解决办法: 在begin后面加上DBMS_OUTPUT.ENABLE(buffer_size => null)... -
dbms_output.put_line&longValue
2015-11-13 18:02:03dbms_output.put_line长度限制问题 对于10g以上版本(包括10g), dbms_output.put_line的最大长度限制是32767. 如果报错buffer overflow, 执行如下语句即可: set serveroutput ON SIZE UNLIMITED FORMAT WORD_WRAPPED... -
oracle PL/SQL输出语句 dbms_output.put_line
2018-07-16 15:09:25java中可以输出,oracle中也可以,在PL/SQL中可以用 dbms_output.put_line输出。也可以拼接字符串输出。begin dbms_output.put_line(sqlStr);end;//输出语句,可以在PL/SQL查询窗口的输出中看到输出的内容。begin... -
plsql中dbms_output.put_line使用
2017-08-23 11:33:59今天刚学习写了存储过程,首先要注意的是;的使用,从begin开始后的每句...再就遇到明明在sql中写了dbms_output.put_line,但是在控制台上一直都没哟输出结果,百度了后来发现是要开启oracle控制台的输出服务 set server -
DB2 存储过程 - 利用 dbms_output.put_line 输出至屏幕
2015-06-22 08:49:54优点: 可以调用 oracle 的 put_line 方法来执行,并将结果打印在屏幕上, 无需再调用 shell 脚本. 缺点: 在存储过程正在执行的过程中, 无法实时监控到追踪的结果. ## 设置注册变量 打开兼容性开关 DB2_...