`

关于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)))  这有没问题,为什么这么替换?

相关推荐

    Oracle---PL-SQL经典练习题1.docx

    知识点:PL/SQL 程序块的基本结构、变量声明、SELECT INTO 语句、DBMS_OUTPUT.PUT_LINE procedures 在 PL/SQL 中,程序块是基本的编程单元。程序块由 DECLARE、BEGIN、EXCEPTION 和 END四部分组成。DECLARE 部分...

    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 多...

    oralce异常信息对照表

    DBMS_OUTPUT.PUT_LINE('No data found for the given condition.'); WHEN TOO_MANY_ROWS THEN DBMS_OUTPUT.PUT_LINE('More than one row matched the condition.'); WHEN OTHERS THEN DBMS_OUTPUT.PUT_LINE('An...

    DBMS_SQL的使用

    dbms_output.put_line('Fetch rows is ' || d); EXIT WHEN d ; DBMS_SQL.COLUMN_VALUE(c, 1, n_tab); DBMS_SQL.COLUMN_VALUE(c, 2, n_tab1); -- 这里可以添加更多的逻辑来处理查询结果 END LOOP; dbms_...

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

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

    Oracle 常用命令举例.pdf

    DBMS_OUTPUT.PUT_LINE('Name changed from ' || :OLD.name || ' to ' || :NEW.name); END IF; END; / -- 更新一条记录来触发触发器 UPDATE dept SET name = 'New Name' WHERE id = '001'; ``` #### 10.4 系统...

    动态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的PL SQL笔记

    DBMS_OUTPUT.PUT_LINE('str=' || str); END; ``` - **声明与表中的列类型一致的变量**: ```sql DECLARE sname EMP.ENAME%TYPE; -- 声明一个与EMP表的ENAME属性一致的类型 BEGIN SELECT ENAME INTO sname ...

    oracle 输出显示

    在Oracle数据库环境中,`DBMS_OUTPUT.PUT_LINE`是开发者们常用的一个过程,用于将调试信息或数据输出到服务器会话的标准输出设备。然而,在实际应用过程中,有些用户可能会遇到使用`DBMS_OUTPUT.PUT_LINE`后,信息并...

    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;

    老二牛车第十章上机课记录和集合.pdf

    dbms_output.put_line('姓名:' || emp_record.ename); dbms_output.put_line('薪水:' || emp_record.sal); dbms_output.put_line('工作:' || emp_record.job); end; / ``` **3. 使用ROWTYPE定义记录变量** - ...

    Oracle_plsql程序设计基础

    DBMS_OUTPUT.PUT_LINE(myid); DBMS_OUTPUT.PUT_LINE(myname); END; / ``` 在这个例子中,`myid`和`myname`的数据类型将与`DEPT`表中的`ID`和`NAME`列相同。这有助于确保数据的一致性和减少出错的可能性。 #### %...

    学习文件数据库

    在这个部分,我们学习了如何声明变量,如`i NUMBER`,以及如何执行SQL语句,如`DBMS_OUTPUT.PUT_LINE`用于输出信息。需要注意的是,`DBMS_OUTPUT.PUT_LINE`的输出默认是关闭的,需要通过`SET SERVEROUTPUT ON`命令...

    oracle的PLSQL编程之过程全部案例

    dbms_output.put_line(c_row.empno||'-'||c_row.ename||'-'||c_row.job||'-'||c_row.sal); END LOOP; ``` 4. **Fetch游标**: 如果需要更精细的控制,可以使用`FETCH`语句手动提取游标数据。首先打开游标,然后...

    在oracle9i如何在PL-SQL中读写文件.doc

    DBMS_OUTPUT.PUT_LINE('LINE' || LINE_NUM || ':' || TEXT_BUFFER); END LOOP; EXCEPTION WHEN NO_DATA_FOUND THEN RETURN; WHEN UTL_FILE.INVALID_PATH THEN DBMS_OUTPUT.PUT_LINE('INVALID PATH'); ...

    Oracle PL SQL经典练习题1.docx

    这个程序块的关键是使用select into语句将数据从emp表中 fetch 到变量中,然后使用dbms_output.put_line语句将结果输出。 2. 编写一个程序块,接受用户输入一个部门号,从dept表中显示该部门的名称与所在位置 知识...

    Oracle游标语法总结.doc

    dbms_output.put_line(my_dept_rec.department_id || ' : ' || my_dept_rec.department_name); end loop; end; declare l_empno emp.EMPLOYEE_ID%type; begin select EMPLOYEE_ID into l_empno from emp; -...

    PL_SQL个人学习笔记

    这里定义了一个`varchar2`类型的变量`v_name`并赋值为`fjx`,然后使用`dbms_output.put_line`将其值输出。`||`符号用来连接字符串。 #### 3. 处理除零异常 ```plsql declare v_num number := 0; begin v_num := 2...

    plsql编程个人认为比较好的基础事例

    这行代码调用了PL/SQL中的预定义包`dbms_output`中的过程`put_line`,用于向服务器输出流写入一行文本。“Hello World”将作为参数传递给`put_line`过程。 #### 四、PL/SQL变量和常量 在PL/SQL中,可以通过`...

    oracle 游标入门

    例如,在本例中,我们使用`DBMS_OUTPUT.PUT_LINE`函数打印出每条记录的信息。 ```sql DBMS_OUTPUT.PUT('empno=' || l_emp.empno || ' is'); DBMS_OUTPUT.PUT(l_emp.ename || ', job is ' || l_emp.job || ' sal is ...

Global site tag (gtag.js) - Google Analytics