`

关于10g以下dbms_output.put_line超长的问题

阅读更多
关于10g以下dbms_output.put_line超长的问题

对于10gdbms_output.put_line的长度是没有限制
如果报错:buffer overflow,执行如下语句即可:
set serveroutput ON SIZE UNLIMITED FORMAT WORD_WRAPPED
由于10g以下dbms_output.put_line的长度有限制
所以今天特意写了一个按照回车符来截取字符串,也就是按行截取,然后打印出来的过程,希望对某些人有用!


create or replace procedure print_proc(str in varchar2) is
/*
--打印字符串,调试的时候用
--由于字符串过长,超过了dbms_output.put_line的长度,故采用本程序分行打印出来
--@auther:Z.X.T
--@date:2007-6-26
*/
begin
dbms_output.put_line('lengthb(str) =' || lengthb(str));
if (lengthb(str) < 255) then
dbms_output.put_line(str);
else
for i in 1 .. length(str) - length(replace(str, chr(10))) + 1
loop
dbms_output.put_line(substr(str, instr(chr(10) || str, chr(10), 1, i), instr(str ||
chr(10), chr(10), 1, i) -
instr(chr(10) || str, chr(10), 1, i)));
end loop;
end if;
exception
when others then
dbms_output.put_line(sqlerrm);
dbms_output.put_line(dbms_utility.format_call_stack);
end print_proc;

另一篇相关文章:
Dbms_Output.Put_Line字符超过255的解决方案
在Oracle 10g之前,使用Dbms_Output.Put_Line进行输出调试,如果输出信息单行超过255个字符,则会提示错误:ORA-20000: ORU-10028: line length overflow, limit of 255 chars per line,相当烦人的一个限制。

网上搜的解决方案,目前觉得还不错,使用起来也很方便。

-- 第一步
create or replace package my_output
as
     procedure put( s in varchar2 );
     procedure put_line( s in varchar2 );
     procedure new_line;

     function get_line( n in number ) return varchar2;
     pragma restrict_references( get_line, wnds, rnds );

     function get_line_count return number;
     pragma restrict_references( get_line_count, wnds, rnds, wnps );

     pragma restrict_references( my_output, wnds, rnds, wnps, rnps );
end;

-- 第二步
create or replace package body my_output
as
     type Array is table of varchar2(4000) index by binary_integer;
     g_data        array;
     g_cnt        number default 1;

     procedure put( s in varchar2 )
     is
     begin
         if ( g_data.last is not null ) then
             g_data(g_data.last) := g_data(g_data.last) || s;
         else
             g_data(1) := s;
         end if;
     end;

     procedure put_line( s in varchar2 )
     is
     begin
         put( s );
         g_data(g_data.last+1) := null;
     end;

     procedure new_line
     is
     begin
         put( null );
         g_data(g_data.last+1) := null;
     end;

     function get_line( n in number ) return varchar2
     is
         l_str varchar2(4000) default g_data(n);
     begin
         g_data.delete(n);
         return l_str;
     end;

     function get_line_count return number
     is
     begin
         return g_data.count+1;
     end;

end;

-- 第三步
create or replace view my_output_view
as
select rownum lineno, my_output.get_line( rownum ) text
   from all_objects
  where rownum < ( select my_output.get_line_count from dual );

-- 应用
使用my_output.put_line替换Dbms_Output.Put_Line进行输出,通过select * from my_output_view进行输出查询。
分享到:
评论
2 楼 wallimn 2009-10-29  
将回车符删掉。
以上方法我也没有仔细测试,当时是想写一个备份视图的方法,思考了一下,没有写出来。就放弃了。有人有好的办法吗?
1 楼 surfing 2009-10-20  
length(replace(str, chr(10)))  这有没问题,为什么这么替换?

相关推荐

    C# 访问Oracle示例+PL/SQL+存储过程+触发器 完整示例 测试可用 易懂

    dbms_output.put_line('价格在100以下'); elsif vprice&gt;100 and vprice dbms_output.put_line('价格在100—1000之间'); else dbms_output.put_line('价格在1000以上'); end if; end; --PL/SQL基础5 多...

    Oracle中PL/SQL中if语句的写法介绍

    代码如下:/*If语句:判断用户输入的数字。*/set serveroutput on –接收键盘输入accept num prompt ‘请输入一个数字:’; declare –将屏幕输入的数字付给... if pnum = 2 then dbms_output.put_line(‘您输入的是2’)

    动态sql语句动态处理输出列数

    DBMS_OUTPUT.new_line; --4.绑定变量 --dbms_sql.bind_variable(l_cursor,':ename',l_ename); --5.执行 l_retval := dbms_sql.execute(l_cursor); --6.取数 --6.1取列名 for i in 1..l_colcnt loop dbms_output....

    Oracle-03多表查询及编程

    --使用PLSQL输出三角形,只要是三个角 declare m number := 10; begin for x in reverse -m..m loop for y in -m..m loop if abs(y) + abs(x) &lt;= m and x&gt;=0 then ... dbms_output.new_line(); end loop; end;

    Oracle匿名块三种方法输出乘法表:loop/for/while

    Oracle用三种循环方法输出乘法表,比如loop的用法: m := 1; loop n := 1; loop dbms_output.put(m||'*'||n||'='||m*n||' ');... dbms_output.put_line(''); m := m + 1; exit when m&gt;9; end loop;

    oracle集合index-by表

    DECLARE TYPE num_tab IS TABLE OF ...dbms_output.put_line(to_char(v_example_tab2(1))||' '|| to_char(v_example_tab2(10))||' '|| to_char(v_example_tab2(-10))||' '|| to_char(v_example_tab2(v_num))); END;

    建立新年分区脚本.txt

    dbms_output.put_line('-------------' || v_minp_rec.table_name || v_part_key_value); end if; v_part_prefix := substr(v_part_name, 0, length(v_part_name) - v_part_key_length); DBMS_OUTPUT.put...

    oracle 输出显示

    用dbms_output.put_line 不显示

    如何使用Oracle数据库实现实时通信

    放进DBMS_OUTPUT.PUT_LINE调用的消息显示在屏幕上--但是只有在过程完成以后才能显示出来。 DBMS_OUTPUT包也有其他的缺点。就是DBMS_OUTPUT包不许数据库开发者实时的看到消息。 使用EmailUtils包,你可以简简单单的把...

    Oracle-04编程及游标

    declare m number := 3; begin for y in -m..m loop for x in -m..m loop if abs(y) + abs(x) dbms_output.put('*'); else dbms_output.put(' ');... dbms_output.new_line(); end loop; end;

    oracle触发器实例讲解

    DBMS_OUTPUT.PUT_LINE('记录已经成功插入,并已记录到日志'); ELSIF UPDATING THEN --UPDATE触发 v_type := 'UPDATE'; DBMS_OUTPUT.PUT_LINE('记录已经成功更新,并已记录到日志'); ELSIF DELETING THEN v_type := ...

    oracle 基础,数据库优化

    /*departments.location_id//部门地址编号*/ /*复制表的命令 create table emp2 as select * from emp where 1=1;...dbms_output.put_line(v_rec.dd_sal||v_rec.dd_name||to_char(v_rec.dd_hiredate,'yyyymmdd')); end;

    用所学的pl/sql知识做一下程序,要求可能出现的异常要处理:2、写一个存储过程

    DBMS_OUTPUT.PUT_LINE(v_dept); END; 2、写一个存储过程 给一个员工id,查找他的领导的名字,并输出。 CREATE OR REPLACE PROCEDUER pro_getManager( p_id IN s_emp.id%TYPE, p_name OUT s_emp.first_name%...

    OraclePLSQL编程经典例子

    6 dbms_output.put_line('雇员名:'||v_ename||' 工资:'||v_sal); 7 end; 8 / 包含定义,执行,和例外处理的pl/sql块。 实例4.当输入的员工号不存在时 SQL&gt; declare 2 v_ename varchar2(20); 3 v_sal number...

    Oracle三种循环(For、While、Loop)实现九九乘法表

    本文为大家分享了Oracle中三种循环(For、While、Loop)案例,供大家参考,具体内容如下 1.ORACLE中的FOR循环用法(九九乘法表) ... dbms_output.new_line; end loop; end; 2.ORACLE中的While循环用法(九九乘法表) d

    Oracle date如何比较大小分析

    Sql代码 代码如下: — Created on 2010/04/17 by NAN declare — Local variables here i integer;... IF v_date1 &gt; v_date2 THEN dbms_output.put_line( ‘if’); ELSE dbms_output.put_line( ‘else’); END IF; end

    如何从Oracle 8i中直接发送电子邮件

    他们必须使用dbms_output.put_line调用,这个调用直到过程完成才返回结果。 在本文中,我想演示如何从Oracle 8i数据库直接发送电子邮件,作为一种实时通信解决方案。我们的做法是把所有必需的过程与函数包装在自定义...

    数据库边学

    oracle求100和200之间素数方法 ... dbms_output.put_line(n); end if; end loop; end; while方法: declare n number := 100; i number := 2; flag boolean := true; BEGIN WHILE n &lt;=200 LOOP

    Oracle Exception汇总(自定义Oracle异常)

    Dbms_output.put_line(‘no_data_found’); ACCESS_INTO_NULL 为对象赋值前必需初始化对象。对应ORA-06530错误。 CASE_NOT_FOUND 使用CASE语句时在WHEN子句中没有包含必需的条件分支,并且没有包含ELSE语句。 对应...

    oracle实验报告

    DBMS_OUTPUT.PUT_LINE('和为:'||TO_CHAR(a)); END; / 【例3-2】:使用%TYPE声明变量,输出制定表中的相关信息。 DECLARE my_name student.sname%TYPE; BEGIN SELECT sname INTO my_name FROM student WHERE no...

Global site tag (gtag.js) - Google Analytics