Oracle 存储过程:ORA-06512:字符串缓冲区太小

环境

oracle 数据库

在执行存储过程的时候,存储过程中的insert语句一直在执行,且不结束。新开一个sql窗口单独把insert语句拉出来,并执行,执行仅需要1秒钟。

  • 笔者首先确定一下是不是因为锁表导致的问题,执行sql如下
  • select t2.username,
           t2.sid,
           t2.serial#,
           t3.object_name,
           t2.OSUSER,
           t2.MACHINE,
           t2.PROGRAM,
           t2.LOGON_TIME,
           t2.COMMAND,
           t2.LOCKWAIT,
           t2.SADDR,
           t2.PADDR,
           t2.TADDR,
           t2.SQL_ADDRESS,
           t1.LOCKED_MODE
      from v$locked_object t1, v$session t2, dba_objects t3
     where t1.session_id = t2.sid
       and t1.object_id = t3.object_id
     order by t2.logon_time;
    

    发现在锁的表中并无我需要insert的表,也就是说明表未锁。
    附赠解除数据库锁表的sql如下:

     alter system kill session 'sid,seial#';
    
  • 以为是insert的执行时间问题,毕竟因为业务需求,有好几个表需要用到左关联,把这个insert 语句单独拉出来,将里面的变量名更改为实际的数量,结果神奇的事情发生了,执行这个sql仅用了1秒的时间,
    排除数据量大导致insert慢的问题.
  • 在反复的实验当中,发现每当存储过程debug模式下单步执行到insert的时候,执行时间很长,如果中断存储过程,数据库就会报出ORA-06512:字符串缓冲区太小的错误,上网去查询,发现是变量声明的问题,存储过程中正确的变量声明方式为:【表名.字段名%type】的方式去定义,可以避免以后表字段变大时出现的异常问题。
  • 附赠一张之前的声明方式和修改后的声明方式