• 表与表的关系把RD搞乱了,记一个Procedure中的bug


    就是6张表的关联查询,写了一个存储过程,使用4层for来处理

    bug:
    最后一个for中,两张表的关联条件少了一个,结果数据多查了。

    排查办法:
    使用dbms_output.printline('');
    每一个for中加一个

    dbms_output.put_line('-3、'||x.name);//把与下层for关联的关键信息打印出来
    dbms_output.put_line('-2、'||x.name);//把与下层for关联的关键信息打印出来
    dbms_output.put_line('-1、'||x.name);//把与下层for关联的关键信息打印出来
    dbms_output.put_line('0、'||x.name);//把与下层for关联的关键信息打印出来
    然后,就顺藤摸瓜了。

    然后在Commnad Window中调用这个存储过程,拿到打印信息

    SQL> set serveroutput on
    SQL> exec sum_num(3,1256);

    总结:
    功能一直要仔细验证,不同角度可以发现问题

    要用dbms_output.put_line来输出语句,遇到以下错误:

    begin user_priv (username => 'hr'); end; 
      
    ORA-20000: ORU-10027: buffer overflow, limit of 2000 bytes 
    ORA-06512: at "SYS.DBMS_OUTPUT", line 32 
    ORA-06512: at "SYS.DBMS_OUTPUT", line 97 
    ORA-06512: at "SYS.DBMS_OUTPUT", line 112 
    ORA-06512: at "HR.USER_PRIV", line 20 
    ORA-06512: at line 2

    很显然当我们在输出时,控制输出结果的缓冲大小由DBMS_OUTPUT.ENABLE控制,buffer size默认为20000,每行最大的限制是32k,后面的一个例子是用来说明存储过程是在缓存了所有数据后才将结果返回。所以当我们使用游标进行输出时,如果结果很多,将会超过这个值报ORA-20000, ORU-10027: Buffer overflow, limit of <buf_limit> bytes这个错误 
    解决方法: 
    在存储过程begin后面加 :  DBMS_OUTPUT.ENABLE (buffer_size=>null)     表示没有限制.

    存储过程user_priv 请参考文档:http://www.cnblogs.com/AlbertCQY/archive/2013/03/31/2992471.html

    http://blog.csdn.net/u010033674/article/details/8744588

  • 相关阅读:
    多态
    封装
    继承
    面向对象
    2.机器学习相关数学基础
    作业1 机器学习概述
    作业15 语法制导的语义翻译
    作业14 算符优先分析
    作业13 自下而上语法分析
    作业12 实验二 递归下降语法分析
  • 原文地址:https://www.cnblogs.com/softidea/p/4977717.html
Copyright © 2020-2023  润新知