环境
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】的方式去定义,可以避免以后表字段变大时出现的异常问题。
附赠一张之前的声明方式和修改后的声明方式
修改前:
现在:
解决方案参考自:https://baijiahao.baidu.com/s?id=1617919515325580702&wfr=spider&for=pc&qq-pf-to=pcqq.group
谢谢大佬